1

我按照以下网址的指南进行操作: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,现在似乎复制了内容。

与指南建议的(copyAsFormXObject)相比,使用 copyPagesTo 方法复制内容有什么缺点吗?性能、内存或无关的不可见内容等?

出现此问题的代码:

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();
4

1 回答 1

4

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

copyToPages()至于和copyAsFormXObject()复制页面的区别:

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

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

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

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

于 2016-09-06T08:18:20.650 回答