我正在使用PDFBOX v2,我正在尝试克隆PDDocument的第一个PDPage,以将其保留为新PDPage的模板。第一页上有一些我需要填写的acroform字段。
我尝试了一些方法,但是有人想实现。
1)复制第一页内容,并在需要新页面时将其添加到文档中。该页面被复制,但acroform字段与其他页面字段链接,如果我从第一页修改字段值,则该值将显示在其他页面中。
//Save in variable first page content
COSDictionary pageContent = (COSDictionary)doc.getPage(0).getCOSObject();
...
//when i need insert new page
doc.addPage(new PDPage(pageContent));
2)克隆第一页的内容,然后像第一种方法一样添加到文档中。复制页面但没有字段被复制:/
PDFCloneUtility cloner = new PDFCloneUtility(doc);
COSDictionary pageContent = (COSDictionary)cloner.cloneForNewDocument(doc.getPage(0).getCOSObject());
...
//when i need insert new page
doc.addPage(new PDPage(pageContent));
然后,制作PDPage的深层副本以获得独立于首页的acroform字段的正确方法是什么?
谢谢!
答案 0 :(得分:0)
我知道了!
1)从一个空的pdf模板开始,只有一页。打开模板文档,填充常用数据,然后另存为byte []在内存中。
PDDocument templatedoc = PDDocument.load(new File(path));
PDDocumentCatalog catalog = templatedoc.getDocumentCatalog();
PDAcroFrom acroForm = catalog.getAcroForm());
... fill acroForm common data of all pages ...
ByteArrayOutputStream basicTemplate = new ByteArrayOutputStream();
templatedoc.save(basicTemplate);
byte[] filledBasicTemplate = basicTemplate.toByteArray();
2)为每个所需页面生成新文档。
List<PDDocument> documents = new ArrayList<PDDocument>();
PDDocument activeDoc;
for(int i = 0; i < 5; i++) {
activeDoc = PDDocument.load(filledBasicTemplate);
documents.add(activeDoc);
... fill acroform or you need in each page ...
}
3)将所有新文档的首页导入最终文档并保存最终文档。
PDDocument finalDoc = new PDDocument();
for(PDDocument currentDoc : documents) {
... fill common things like page numbers ...
finalDoc.importPage(currentDoc.getPage(0));
}
finalDoc.save(new File(path));
... close all documents after save the final document ...
它可能不是最优化的代码,但它可以工作。