簡體   English   中英

iText PdfCopy創建可編輯的pdf文檔

[英]iText PdfCopy creates editable pdf document

我有一個用於春季啟動應用程序的pdf模板文件。 我需要根據每個請求的用戶輸入來更新此模板中的值。 同樣在請求中,我將獲得多個pdf文件,我需要將這些文件與最終pdf第一頁的更新文件合並。

我在Spring Boot中使用iText。 我能夠更新模板中的值並合並文件內容,但是最終的pdf即將發布,因為可編輯的文件被隱藏了。 如果我單擊該文件,則可以查看我的值,也可以進行編輯。

public void mergefiles(Map<String, String> tempData,MultipartFile[] userInfoFiles) 
            throws Exception{



        FileOutputStream mergeOutStream = new FileOutputStream(new File("C:\\UpdateFile\\mergepath\\updatetem.pdf")); //To update user content to Template

        PdfReader reader = new PdfReader(new FileInputStream(new File("C:\\UpdateFile\\template\\template.pdf"))); //Template File Stream
        PdfStamper stamper = new PdfStamper(reader, mergeOutStream);

        stamper.setFormFlattening(false);
        AcroFields form = stamper.getAcroFields();

        Map<String, Item> fieldMap = form.getFields();


        for (String key : fieldMap.keySet()) {
            String fieldValue = dataMap.get(key);
            if (fieldValue != null) {

                form.setField(key, fieldValue);
            }
        }
        //Above part creates updated pdf with read only

        //Below section creates merged file but first page is editable with 
        //filed values are hidden.

        Document mergePdfDoc = new Document();
        PdfCopy pdfCopy;
        boolean smartCopy = false;

        FileOutputStream newmergeOutStream = new FileOutputStream(new File("C:\\UpdateFile\\mergepath\\newmerged.pdf"));

        if(smartCopy)
            pdfCopy = new PdfSmartCopy(mergePdfDoc, newmergeOutStream);
        else
            pdfCopy = new PdfCopy(mergePdfDoc, newmergeOutStream);



        mergePdfDoc.open();

        pdfCopy.addDocument(stamper.getReader());
        pdfCopy.freeReader(stamper.getReader());


        PdfReader[] pdfReader = new PdfReader[userInfoFiles.length];



        for(int i=0; i<=userInfoFiles.length-1;i++) {
                pdfReader[i] = new PdfReader(userInfoFiles[i].getInputStream());
                pdfCopy.addDocument(pdfReader[i]);
                pdfCopy.freeReader(pdfReader[i]);
                pdfReader[i].close();
        }
        stamper.close();
        mergeOutStream.close();
        mergePdfDoc.close();
    }

最終pdf處於可編輯形式且字段值被隱藏的任何輸入均被隱藏。 我必須創建一個合並的文檔並獲取最終文檔的ByteArray流作為其輸入另一個函數的輸入。我正在使用iText5。

問題是,你加PdfReaderPdfStamper基於輸入您PdfCopy

pdfCopy.addDocument(stamper.getReader());

壓模工作的讀取器很臟:通過壓模施加的某些更改是對讀取器所持有的對象進行的,某些更改僅在壓模或其輸出中。

例如,在您的情況下,表單字段已在原始pdf中定義。 字段值直接添加到該字段。 因此,它在閱讀器中被更改。 但是,外觀(包括其當前值的圖形的字段可視化)在新的間接對象中生成,該對象被添加到壓模輸出中。 因此,閱讀器中仍然有原始的,空的可視化。

因此,在pdf查看器中, PdfCopy結果首先顯示的是空字段的外觀(因為外觀僅在壓模中生成),但是在編輯字段時,更改后的值將變為可見(因為使用字段值)。

要解決此問題,請不要使用臟的讀取器,而應根據沖壓結果創建一個新的干凈的讀取器。

首先創建圖章文件:

    FileOutputStream mergeOutStream = new FileOutputStream(new File("C:\\UpdateFile\\mergepath\\updatetem.pdf")); //To update user content to Template

    PdfReader reader = new PdfReader(new FileInputStream(new File("C:\\UpdateFile\\template\\template.pdf"))); //Template File Stream
    PdfStamper stamper = new PdfStamper(reader, mergeOutStream);

    stamper.setFormFlattening(false);
    AcroFields form = stamper.getAcroFields();

    Map<String, Item> fieldMap = form.getFields();

    for (String key : fieldMap.keySet()) {
        String fieldValue = dataMap.get(key);
        if (fieldValue != null) {
            form.setField(key, fieldValue);
        }
    }
    stamper.close();

然后合並:

    Document mergePdfDoc = new Document();
    PdfCopy pdfCopy;
    boolean smartCopy = false;

    FileOutputStream newmergeOutStream = new FileOutputStream(new File("C:\\UpdateFile\\mergepath\\newmerged.pdf"));

    if(smartCopy)
        pdfCopy = new PdfSmartCopy(mergePdfDoc, newmergeOutStream);
    else
        pdfCopy = new PdfCopy(mergePdfDoc, newmergeOutStream);

    mergePdfDoc.open();

    PdfReader reader = new PdfReader(new FileInputStream(new File("C:\\UpdateFile\\mergepath\\updatetem.pdf")));
    pdfCopy.addDocument(reader);
    pdfCopy.freeReader(reader);

    PdfReader[] pdfReader = new PdfReader[userInfoFiles.length];

    for(int i=0; i<=userInfoFiles.length-1;i++) {
            pdfReader[i] = new PdfReader(userInfoFiles[i].getInputStream());
            pdfCopy.addDocument(pdfReader[i]);
            pdfCopy.freeReader(pdfReader[i]);
            pdfReader[i].close();
    }

    mergeOutStream.close();
    mergePdfDoc.close();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM