Проблема в том, что вы добавляете 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();
}