簡體   English   中英

使用iText合並PDF時缺少字段

[英]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.

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