如何在pdfbox 2.0.x中克隆生成的PDDocument?

时间:2018-11-01 04:36:36

标签: java pdfbox

我正在使用pdfbox 2.0.12生成报告。
我想一次创建两个版本,内容部分相似。
(即:生成1-3页,克隆,向每个版本添加更多页面,保存)

将PDDocument复制到新的PDDocument的正确方法是什么?
我的文件非常简单,每页只有文本和图像。

现有的StackO问题[1]使用pdfbox 1.8中的代码,或者使用今天不起作用的代码。
已将multipdf.PDCloneUtility标记为已弃用,以供公共使用,也不适用于生成的PDF:s。
我在执行此操作的PDFbox树中找不到示例。

我正在使用importPage函数。几乎可以用,除了字体有些混淆。
复制的页面布局正确(有些线条和图像),但是文本只是点,因为它找不到所使用的字体。
复制文档中的添加页面使用相同字体的副本,文本很好。
在Adobe Reader中查看字体资源时,在复制的文档中,使用的字体被列出2次:

  

常规机器人(嵌入式子集)

     
    

类型:TrueType(CID)
       编码:Identity-H

  
     

常规机器人

     
    

类型:TrueType(CID)
       编码:Identity-H
       实际字体:未知

  

(etc)

打开复制的文档时,出现警告
“无法找到或创建Roboto-Bold字体。某些字符可能无法正确显示或打印”

在源文档中,字体被列出一次,与上面的第一项完全相同。

我的代码:

// Close content stream before copying
myContentStream.endText();
myContentStream.close();
// Copy pages
PDDocument result = new PDDocument();
result.setDocumentInformation(doc.getDocumentInformation());
int pageCount = doc.getNumberOfPages();
for (int i = 0; i < pageCount; ++i) {
    PDPage page = doc.getPage(i);
    PDPage importedPage = result.importPage(page);
    // This is mentioned in importPage docs, bizarrely it's said to copy resources
    importedPage.setRotation(page.getRotation());
    // while this seems intuitive
    importedPage.setResources(page.getResources());
}

// Fonts are recreated for copy by reloading from file
copy_plainfont = PDType0Font.load(result, new java.io.ByteArrayInputStream(plainfont_bytes));
//....etc

我尝试了所有带有或不带有importedPage.setRotation / setResources的组合。
我也尝试过使用doc.getDocumentCatalog()。getPages()并进行滚动浏览。结果相同。

[1] 我看着 pdfbox: how to clone a page
Can duplicating a pdf with PDFBox be small like with iText?
还有六种无关紧要的东西。

感谢任何提示

/ rasmus

0 个答案:

没有答案