使用iText的PdfCopy和表单值:表单值不可见

iText的第6章介绍了如何使用PdfSmartCopy / PdfCopy复制页面:

public void addDataSheets(PdfCopy copy)
        throws SQLException, IOException, DocumentException {
        // Create a database connection
        DatabaseConnection connection = new HsqldbConnection("filmfestival");
        List<Movie> movies = PojoFactory.getMovies(connection);
        PdfReader reader;
        PdfStamper stamper;
        ByteArrayOutputStream baos;
        // Loop over all the movies and fill out the data sheet
        for (Movie movie : movies) {
            reader = new PdfReader(DATASHEET);
            baos = new ByteArrayOutputStream();
            stamper = new PdfStamper(reader, baos);
            fill(stamper.getAcroFields(), movie);
            stamper.setFormFlattening(true);
            stamper.close();

            reader = new PdfReader(baos.toByteArray());
            copy.addPage(copy.getImportedPage(reader, 1));
        }
        // Close the database connection
        connection.close();
    }

这很好用,但在我新创建的文档中,除非单击它,否则表单字段中的值不可见 . 如果我在Chrome中打开PDF,我可以看到表单值 .

显然,从Editable .pdf fields disappear (but visible on field focus) after save with evince开始,需要在pdf上设置一个Flag .

public void createPdf(String filename)
    throws IOException, DocumentException, SQLException {
    // step 1
    Document document = new Document();
    // step 2
    PdfCopy copy
        = new PdfCopy(document, new FileOutputStream(filename));
    // step 3
    document.open();
    // step 4
    addDataSheets(copy);
    // step 5
    document.close();
}

有没有办法使用当前的API,而不使用反射或重新打开PDF?

回答(1)

2 years ago

请查看iText网站上更新的FillDataSheet示例 . 您会发现添加了以下行:

fields.setGenerateAppearances(true);

iText用于忽略此标志并始终创建外观,即使PDF明确表示不需要创建外观 . 更新版本会考虑标志的值,并且在PDF表示不需要外观时(PDF可能就是这种情况)不会创建外观 .