合并iText中的两个模板

时间:2010-05-05 23:17:22

标签: java pdf templates itext merge

假设我有两个用Adobe Acrobat创建的PDF模板,它们都是单页的8.5x11文档。第一个模板(A.pdf)包含页面上半部分的内容。第二个模板(B.pdf)具有页面下半部分的内容。 (事实恰恰相反,两个模板中的内容并不相互“重叠”。)

我想使用iText来获取这两个模板并从中创建一个单独的“合并”模板(C.pdf),这只是一个页面(上半部分的A.pdf内容和B.pdf的内容)下半部分的内容。)

(我不想将这两个文件“合并”成一个2页的文件。我需要最终产品为单页。)

我将在servlet环境(Tomcat 6)中运行iText,但我不认为这会对答案产生影响。

这可能吗?

3 个答案:

答案 0 :(得分:4)

我在iText mailing list获得了Mark Storer的帮助。解决方案是为每个文件获取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 :(得分:1)

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