如何将PDFDocument的一页复制到另一PDFDocument

时间:2019-03-28 11:54:15

标签: java pdf itext7

我对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。

1 个答案:

答案 0 :(得分: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);