深度克隆PDPage的正确方法是什么?

时间:2019-04-08 10:57:06

标签: java pdfbox

我正在使用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字段的正确方法是什么?

谢谢!

1 个答案:

答案 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 ...

它可能不是最优化的代码,但它可以工作。