2010-05-05 60 views
1

假設我有兩個使用Adobe Acrobat創建的PDF模板,它們都是單頁8.5x11文檔。第一個模板(A.pdf)具有頁面上半部分的內容。第二個模板(B.pdf)包含頁面下半部分的內容。 (恰好兩個模板中的內容不會互相「重疊」。)合併iText中的兩個模板

我想使用iText將這兩個模板合併爲一個「合併」模板(C.pdf)那只是一個頁面(上半部分是A.pdf的內容,下半部分是B.pdf的內容)。

(我不想「合併」這兩個文件到2頁文檔。我需要的最終產品是一個單頁。)

我將在servlet環境中運行的iText(Tomcat的6)但我認爲這不會對答案產生影響。

這可能嗎?

回答

4

我得到了幫助馬克斯托勒在iText mailing list。解決的辦法是讓PdfTemplate對象爲每個文件,然後使用addTemplate()方法把它們加在一起,如:

PdfTemplate topOfPage = writer.getImportedPage(reader, 1); 
PdfTemplate bottomOfPage = writer.getImportedPage(reader, 2); 

PdfContentByte content = writer.getDirectContent(); 

// in PDF, "0, 0" is the lower left corner. 
content.addTemplate(bottomOfPage); 
content.addTemplate(topOfPage, 0, bottomOfPage.getHeight()); 
1
+0

這似乎是推測性的。你能描述一下代碼的作用,以及它如何適用於我的具體問題?它的寫法相當不透明。 – 2010-05-06 22:41:56

+0

該程序打開一個PDF文件,並生成一個新的PDF文件放置在每個新的頁面(比如說)從原來的兩頁,旋轉和/或縮放。看到第130行。 我曾經寫過類似的程序,用於重新格式化pdf文件,以便查看或打印。在我看來,這與你的需要有些相關。 – leonbloy 2010-05-06 22:55:03

+0

代碼看起來像是在頁面大小的塊中添加數據。我想只添加頁面的一部分。 – 2010-05-06 23:53:25

0

一個更常用的情況是合併單個頁面的背景PDF文件使用一個多頁面的源代碼的PDF文件。例如,背景pdf僅包含頁眉和頁腳。源PDF已經以上下邊距作爲本場景中背景pdf模板的頁眉和頁腳的佔位符。如果你正在尋找這個 - 像我一樣 - 你會在這裏絆倒這個線程,你可以應用以下方法:

tplFile$ = "c:/0/background.pdf" 
srcFile$ = "c:/0/source1.pdf" 
destFile$ = "c:/0/newMergedDest.pdf" 

declare Document destDoc! 
declare PdfWriter destWriter! 
declare PdfReader mainDocReader! 
declare PdfReader singlePageBackgroundReader! 
declare PdfImportedPage mainDocPage! 
declare PdfImportedPage backgroundPage! 
declare PdfContentByte dcb! 
declare PdfContentByte ucb! 

destDoc! = new Document() 
destWriter! = PdfWriter.getInstance(destDoc!, new FileOutputStream(destFile$)) 
destDoc!.open() 
dcb! = destWriter!.getDirectContent() 
ucb! = destWriter!.getDirectContentUnder() 
mainDocReader! = new PdfReader(srcFile$) 
singlePageBackgroundReader! = new PdfReader(tplFile$) 
backgroundPage! = destWriter!.getImportedPage(singlePageBackgroundReader!,1) 
for i=1 to mainDocReader!.getNumberOfPages() 
    destDoc!.newPage() 
    mainDocPage! = destWriter!.getImportedPage(mainDocReader!,i) 
    dcb!.addTemplate(mainDocPage!,0,0) 
    ucb!.addTemplate(backgroundPage!,0,0) 
next i 
destDoc!.close()