PdfDocument的copyPagesTo方法或PdfCanvas的copyAsFormXObject将内容从PDF复制到PDF

时间:2016-08-31 21:38:35

标签: pdf itext7

我按照此网址上的指南进行了操作:http://developers.itextpdf.com/content/itext-7-jump-start-tutorial/chapter-6-reusing-existing-pdf-documents

根据该指南,我遇到一个问题,即当使用copyAsFormXObject(我提交了支持票据)时,PDF中的某些内容未被复制到目标PDF中。我在此期间发现的一个替代方案是我可以使用PdfDocument的copyPagesTo方法,只需打开在目标PDF上使用getPage复制的页面。从那里,我可以从现有页面创建一个PdfCanvas,并在对象上进行转换(如缩放)。

这似乎与上述指南中的代码完全一样,除了我发现的内容未被复制的PDF,现在内容似乎被复制了。

使用copyPagesTo方法复制内容是否有任何缺点,而不是指南建议(copyAsFormXObject)?性能,内存或无关的不可见内容等?

展示此问题的代码:

PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
PdfDocument origPdf = new PdfDocument(new PdfReader(src));
PdfPage origPage = origPdf.getPage(1);

PdfPage page = pdf.addNewPage();
PdfCanvas canvas = new PdfCanvas(page);
PdfFormXObject pageCopy = origPage.copyAsFormXObject(pdf);
canvas.addXObject(pageCopy, 0, 0);

pdf.close();
origPdf.close();

不符合的代码:

PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
PdfDocument origPdf = new PdfDocument(new PdfReader(src));
origPdf.copyPagesTo(1,2,pdf);

pdf.close();
origPdf.close();

1 个答案:

答案 0 :(得分:4)

我已经为您的支持服务单上的特定问题提供了代码和答案。

关于复制页面的copyToPages()copyAsFormXObject()之间的区别:

copyToPages()是一种高级方法,可以复制整个页面,维护所有结构并向新文档添加任何适用的资源。

使用copyAsFormXObject(),首先需要将页面转换为XObject,实际上将其转换为外观流。如果此页面需要正确显示其他设置或资源,例如不同的页面大小或未存储在页面本身上的字体,则需要手动设置或添加它们。 XObject总是在绝对位置添加,因此也需要指定。

虽然使用XObjects等低级方法进行复制可以更好地控制结果的样子,但是它们有自己的危险和陷阱。对于复制页面等无处不在的任务,最好使用高级方法来避免这些问题。

编辑: 我们已经确定这种行为是一个错误,'copyAsFormXObject()'应该包括使用过的资源,即使它们存储在/ Pages级别。这将在以后的iText版本中修复