假设我有两个用Adobe Acrobat创建的PDF模板,它们都是单页的8.5x11文档。第一个模板(A.pdf)包含页面上半部分的内容。第二个模板(B.pdf)具有页面下半部分的内容。 (事实恰恰相反,两个模板中的内容并不相互“重叠”。)
我想使用iText来获取这两个模板并从中创建一个单独的“合并”模板(C.pdf),这只是一个页面(上半部分的A.pdf内容和B.pdf的内容)下半部分的内容。)
(我不想将这两个文件“合并”成一个2页的文件。我需要最终产品为单页。)
我将在servlet环境(Tomcat 6)中运行iText,但我不认为这会对答案产生影响。
这可能吗?
答案 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()