[英]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。
問題是,你加PdfReader
的PdfStamper
基於輸入您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.