2015-11-07 86 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

現在我明白了,我修改了現有的代碼片段,並以模糊的方式使用了「頁面」。您不知道自己在做什麼而複製/粘貼該示例。在複製/粘貼之前,請閱讀*並理解*代碼。 –

相關問題