PdfDocument 的 copyPagesTo 方法或 PdfCanvas 的 copyAsFormXObject 将内容从 PDF 复制到 PDF
PdfDocument's copyPagesTo method or PdfCanvas's copyAsFormXObject to copy content from PDF to PDF
我遵循了这个 URL 的指南: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();
我已经为您的支持请求中的特定问题提供了代码和答案。
关于copyToPages()
和copyAsFormXObject()
复制页面的区别:
copyToPages()
是一种高级方法,它复制整个页面,维护所有结构并将任何适用的资源添加到新文档。
使用copyAsFormXObject()
,您首先需要将页面转换为XObject,实质上是将其转换为外观流。如果此页面需要额外的设置或资源才能正确显示,例如不同的页面大小或页面本身未存储的字体,则需要手动设置或添加它们。 XObject总是添加在绝对位置,所以这个也需要指定。
虽然使用 XObjects 等低级方法进行复制可以更好地控制结果的外观,但它们也有自己的危险和陷阱。对于复制页面等普遍存在的任务,最好使用高级方法来避免此类可能出现的问题。
编辑:
我们已确定此行为是一个错误,并且 'copyAsFormXObject()' 应该包括已使用的资源,即使它们存储在 /Pages 级别。这将在以后的 iText 版本中修复
我遵循了这个 URL 的指南: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();
我已经为您的支持请求中的特定问题提供了代码和答案。
关于copyToPages()
和copyAsFormXObject()
复制页面的区别:
copyToPages()
是一种高级方法,它复制整个页面,维护所有结构并将任何适用的资源添加到新文档。
使用copyAsFormXObject()
,您首先需要将页面转换为XObject,实质上是将其转换为外观流。如果此页面需要额外的设置或资源才能正确显示,例如不同的页面大小或页面本身未存储的字体,则需要手动设置或添加它们。 XObject总是添加在绝对位置,所以这个也需要指定。
虽然使用 XObjects 等低级方法进行复制可以更好地控制结果的外观,但它们也有自己的危险和陷阱。对于复制页面等普遍存在的任务,最好使用高级方法来避免此类可能出现的问题。
编辑: 我们已确定此行为是一个错误,并且 'copyAsFormXObject()' 应该包括已使用的资源,即使它们存储在 /Pages 级别。这将在以后的 iText 版本中修复