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上设置的标志。
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?
答案 0 :(得分:3)
请查看iText网站上更新的FillDataSheet示例。您会发现添加了以下行:
fields.setGenerateAppearances(true);
iText用于忽略此标志并始终创建外观,即使PDF明确表示不需要创建外观。更新版本会考虑标志的值,并且在PDF表明不需要外观时(PDF可能就是这种情况)不会创建外观。