[英]Missing fields when merging PDF by using iText
我使用OpenOffice創建odt文件,在此文件中創建表單字段,並將odf文件另存為PDF文件。 然后使用itext將數據填充到pdf文件中。每個pdf文件中都顯示每個表單字段。 但是當我合並pdf文件時,所有表單字段都丟失了。 請幫忙。
設置字段的代碼:
FileOutputStream fos = new FileOutputStream(outpath);
PdfReader reader= new PdfReader(templateinputsream);
PdfStamper stamp = new PdfStamper(reader, fos);
AcroFields form = stamp.getAcroFields();
setField(form, fieldsMap);
private void setField(AcroFields form, Map<String, String> map) {
Iterator<Entry<String, String>> it = map.entrySet().iterator();
while (it.hasNext()) {
Entry<String, String> entry = it.next();
String key = entry.getKey();
String value = entry.getValue();
try {
form.setField(key, value);
} catch (IOException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
合並代碼pdf:
private void mergePdf(List<String> files, String savepath) {
try {
List<InputStream> pdfs = new ArrayList<InputStream>();
for (int i = 0; i < files.size(); i++) {
pdfs.add(new FileInputStream(files.get(i)));
}
OutputStream output = new FileOutputStream(savepath);
Document document = new Document(new PdfReader(files.get(0)).getPageSize(1));
concatPDFs(document, pdfs, output);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void concatPDFs(Document document, List<InputStream> streamOfPDFFiles, OutputStream outputStream) {
try {
List<InputStream> pdfs = streamOfPDFFiles;
List<PdfReader> readers = new ArrayList<PdfReader>();
int totalPages = 0;
Iterator<InputStream> iteratorPDFs = pdfs.iterator();
while (iteratorPDFs.hasNext()) {
InputStream pdf = iteratorPDFs.next();
PdfReader pdfReader = new PdfReader(pdf);
readers.add(pdfReader);
totalPages += pdfReader.getNumberOfPages();
}
PdfWriter writer = PdfWriter.getInstance(document, outputStream);
document.open();
PdfContentByte cb = writer.getDirectContent(); // Holds the PDF
PdfImportedPage page;
int pageOfCurrentReaderPDF = 0;
Iterator<PdfReader> iteratorPDFReader = readers.iterator();
while (iteratorPDFReader.hasNext()) {
PdfReader pdfReader = iteratorPDFReader.next();
while (pageOfCurrentReaderPDF < pdfReader.getNumberOfPages()) {
document.newPage();
pageOfCurrentReaderPDF++;
page = writer.getImportedPage(pdfReader, pageOfCurrentReaderPDF);
cb.addTemplate(page, 0, 0);
}
pageOfCurrentReaderPDF = 0;
}
outputStream.flush();
document.close();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (document.isOpen())
document.close();
try {
if (outputStream != null)
outputStream.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
我看到三個可能的問題:
[1.]
使用OpenOffice生成的表單存在一個已知問題:外觀丟失! (實際上,有人應該告訴OpenOffice開發人員解決此問題)。 您可以通過添加以下行來解決此問題:
fields.setGenerateAppearances(true);
有關完整示例,請參見FillDataSheet 。
[2.]
您犯了與“重復問題”和“ RTFM”中所述相同的錯誤
如記錄所示,使用PdfWriter
會丟棄所有交互功能。 當您不展平文檔時,字段保持交互狀態,因此通過選擇PdfWriter
而不是PdfCopy
,可以故意丟棄字段...
[3.]
使用PdfCopy
,請確保使用最新版本的iText,因為表單的串聯僅在最近才實現。 請參閱https://stackoverflow.com/a/20659958/1622493,以查找問題的幾乎完全相同的副本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.