2015-11-07 59 views
0

我有下面的iText代码,我想从src pdf文件复制一个页面到其他pdf文件(我已有PdfStamper,这里是mainPdfStamper)。提取pdf页面并插入到现有的pdf

PdfReader srcReader = new PdfReader(new FileInputStream("source.pdf")); 

File file = File.createTempFile("temporary", ".pdf"); 

PdfStamper pdfStamper = new PdfStamper(srcReader, new FileOutputStream(file)); 
PdfImportedPage importedPage = pdfStamper.getImportedPage(srcReader, 1); 

// copying extracted page from src pdf to existing pdf 
mainPdfStamper.getOverContent(1).addTemplate(importedPage, 10,10); 
pdfStamper.close(); 
srcReader.close(); 

这是行不通的,我不知道如何做到这一点。总之,我想从源pdf复制一页到现有的pdf。请帮忙。

UPDATE

下面代码工作按从布鲁诺的答案。

PdfReader reader2 = new PdfReader(srcPdf.getAbsolutePath()); 
    PdfImportedPage page = pdfStamper.getImportedPage(reader2, 1); 
    stamper.insertPage(1, reader2.getPageSize(1)); 
    pdfStamper.getUnderContent(1).addTemplate(page, 100, 100); 
    // Close the stamper and the readers 
    pdfStamper.close(); 
    reader2.close(); 
+0

你为什么使用'PdfWriter'实例?这没有任何意义,是吗? –

+0

@BrunoLowagie,它没有任何意义。我已更新我的问题并将其删除。 –

+1

在这种情况下:为什么不随同它一起移除“Document”实例?我会给你写一个答案,指出我解释如何达到你的要求的文档。有多种方法可以做你想做的事,但你似乎想使用'PdfStamper'。 –

回答

1

请阅读文档,例如chapter 6 of iText in Action。如果您参阅第6.3.4节(“将页面插入到现有文档中”),则会找到InsertPages示例。

如果p是表示要插入的页面页码,您只需要这个代码,main_file是通向你的主文件和to_be_inserted的路径需要插入的文件(dest是路径生成的文件):

PdfReader reader = new PdfReader(main_file); 
PdfReader reader2 = new PdfReader(to_be_inserted); 
// Create a stamper 
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); 
// Create an imported page to be inserted 
PdfImportedPage page = stamper.getImportedPage(reader2, 1); 
stamper.insertPage(p, reader2.getPageSize(1)); 
stamper.getUnderContent(i).addTemplate(page, 0, 0); 
// Close the stamper and the readers 
stamper.close(); 
reader.close(); 
reader2.close(); 

这只是组合两个文件中页面的一种方法。您也可以使用PdfCopy来达到此目的。使用PdfCopy的优势在于,您将保留交互式页面的交互功能。使用PdfStamper时,您将失去插入页面中的任何交互功能(例如,所有链接)。

+0

我已经删除了'stamper.insertPage(page,reader2.getPageSize(1));',因为它在我的5.5.7版本中不受支持。这对我有效。 'pdfStamper'在'for loop'中,我想在所有操作完成后在for循环结束时关闭它。这可能吗? –

+0

你在说什么?在iText 5.5.7中肯定存在'insertPage(final int pageNumber,final Rectangle mediabox)'方法,您可以在GitLab存储库中清楚地看到:http://gitlab.itextsupport.com/itext/itextpdf/blob/develop /src/main/java/com/itextpdf/text/pdf/PdfStamper.java在您的UPDATE中,您正在覆盖现有PDF中的现有页面。这是不正确的。至于你关于'for循环'的问题:你的问题中没有'for循环',所以我不明白你在说什么。 –

+0

现在我明白了,我修改了现有的代码片段,并以模糊的方式使用了“页面”。您不知道自己在做什么而复制/粘贴该示例。在复制/粘贴之前,请阅读*并理解*代码。 –

相关问题