【问题标题】:How to copy one page of a PDFDocument , to another PDFDocument如何将 PDFDocument 的一页复制到另一个 PDFDocument
【发布时间】:2019-03-28 11:54:15
【问题描述】:

我对 PDFDocuments 有疑问。如何将 PdfDocument 对象的特定页面复制到另一个 PdfDocument 对象。

我尝试过 moveTo 方法,但它没有用,我也尝试过 copyPagesTo 方法,但我抛出一个请求页面超出范围(例如,当我尝试仅复制一页时,从 1到 1)。

有什么提示吗?

List<PdfDocument> pdfDocuments = new ArrayList<>();   
PdfDocument pdfWithMultiplePages = here I have a PDF with 3 pages.
for (int i = 0 ; i<pdfWithMultiplePages.getNumberOfPages() ; i++){
    final ByteArrayOutputStream byteArrayOutputStream = new 
    ByteArrayOutputStream();
    final PdfWriter pdfWriter = new PdfWriter(byteArrayOutputStream);    
    PdfDocument pdfDocument = new PdfDocument(pdfWriter);
    pdfDocument.copyPagesTo(i+1, i+1,pdfWithMultiplePages);
    pdfWriter.close();
    byteArrayOutputStream.close();
    shippingLabels.add(shippingLabelSplitted);
}

我也试过这个:

List<PdfDocument> pdfDocuments = new ArrayList<>();   
PdfDocument pdfWithMultiplePages = here I have a PDF with 3 pages.
for (int i = 0 ; i<pdfWithMultiplePages.getNumberOfPages() ; i++){
    final ByteArrayOutputStream byteArrayOutputStream = new 
    ByteArrayOutputStream();
    final PdfWriter pdfWriter = new PdfWriter(byteArrayOutputStream);    
    PdfDocument pdfDocument = new PdfDocument(pdfWriter);
    pdfDocument.addPage(1,pdfWithMultiplePages.getPage(i+1));
    pdfWriter.close();
    byteArrayOutputStream.close();
    shippingLabels.add(shippingLabelSplitted);
}

但它会抛出:

com.itextpdf.kernel.PdfException: 页面 com.itextpdf.kernel.pdf.PdfPage@6576eb4b 无法添加到文档 com.itextpdf.kernel.pdf.PdfDocument@286ef136,因为它属于文档 com.itextpdf.kernel .pdf.PdfDocument@2c74aa66.

【问题讨论】:

  • 请告诉我们您尝试过的minimal reproducible example
  • 我在帖子中添加了一个 sn-p,我试图实现这样的目标:我有一个 3 页的 PdfDocument,我想创建 3 个 PdfDocument,每个都有 1 个不同的原始页面.
  • 我认为当您执行i+1 时会发生这种情况,在for 的最后一次迭代中,它超出了界限。
  • 我怎样才能实现我的目标? getPage() 以 1 开头,而不是 0 开头。如何每次迭代只复制一页?
  • 对于与特定 PDF 库相关的问题,还请在您的问题中添加匹配标签 itext7 在您的情况下。我只是在这里为你做的。

标签: java pdf itext7


【解决方案1】:

PDF 中的页面与 PDF 中的其他对象有许多关系。

如果您可以将位于一个文档中的页面添加到另一个文档中,则该页面将驻留在两个文档中。因此,页面突然必须与两个文档中的对象具有所有这些关系。这显然不起作用,因此 iText 阻止了这一点。

相反,您必须创建相关页面的副本,以便将关系切换到目标文档中的文档。

对于这个任务,PdfDocument.copyPagesTo 有多个方法重载。因此,这些方法确实是可以使用的。

很遗憾你搞错了操作的来源和目标:

PdfDocument pdfWithMultiplePages = here I have a PDF with 3 pages.
....
PdfDocument pdfDocument = new PdfDocument(pdfWriter);
pdfDocument.copyPagesTo(i+1, i+1,pdfWithMultiplePages);

这会尝试将页面i+1pdfDocument 复制到pdfWithMultiplePages。但是您只是从头开始创建pdfDocument,所以它还没有任何页面。你最可能想要的是:

pdfWithMultiplePages.copyPagesTo(i+1, i+1, pdfDocument);

【讨论】:

  • 它向我抛出了这个错误:无法从正在写入的文档中复制间接对象。
  • @Saliffanag 正确,您只能从未打开更改的 PDF 中复制,即未使用 PdfWriter 打开。
  • @Saliffanag 你还有什么未解决的问题吗?
猜你喜欢
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多