【问题标题】:Merging two templates in iText在 iText 中合并两个模板
【发布时间】:2011-02-16 04:07:04
【问题描述】:

假设我有两个使用 Adob​​e Acrobat 创建的 PDF 模板,它们都是单页的 8.5x11 文档。第一个模板 (A.pdf) 包含页面上半部分的内容。第二个模板 (B.pdf) 包含页面下半部分的内容。 (碰巧两个模板中的内容不会相互“重叠”。)

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

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

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

这可能吗?

【问题讨论】:

    标签: java pdf templates itext merge


    【解决方案1】:

    更多用例是将单页背景 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()
    

    【讨论】:

      【解决方案2】:

      我在 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() );
      

      【讨论】:

        【解决方案3】:

        【讨论】:

        • 这似乎是推测性的。你能描述一下代码的作用以及它如何应用于我的具体问题吗?它是以一种相当不透明的方式编写的。
        • 该程序打开一个 PDF 文件并生成一个新的 PDF 文件,将其放置在每个新页面(例如)原始页面的两页中,并带有旋转和/或缩放。参见第 130 行。我曾经在此基础上编写了一个类似的程序,用于重新格式化 pdf 文件,以便查看或打印。在我看来,这与您的需求有些相关。
        • 代码看起来像是在页面大小的块中添加数据。我只想添加页面的一部分。
        • 代码将原稿的两页合二为一。如果我理解正确,您想要类似的东西,只是没有(或不同)转换(旋转/缩放/平移) - 并且两个页面来自不同的文档,而不是来自同一个文档的连续页面。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-27
        • 1970-01-01
        • 1970-01-01
        • 2015-08-17
        • 1970-01-01
        • 2019-10-30
        相关资源
        最近更新 更多