【问题标题】:Java apache PDFBox - Merge/stamp PDF overlay maintaining hyperlinks on both overlay and input PDF?Java apache PDFBox - 合并/戳PDF覆盖在覆盖和输入PDF上维护超链接?
【发布时间】:2020-09-25 08:45:36
【问题描述】:

我们正在尝试实现 Apache PDFBox Overlay。效果很好,但是覆盖页面上的超链接会丢失。

在我们的案例中,客户上传了一个覆盖图,上面包含经常可点击的详细信息,例如网站和电子邮件地址。前台 PDF 是一张发票,也可以包含超链接,例如产品页面。

基本上这是我们的代码:

Overlay overlay = new Overlay();  //org.apache.pdfbox.multipdf.Overlay
overlay.setInputPDF(inputDoc); //PDDDocument inputDoc with hyperlinks
overlay.setDefaultOverlayPDF(overlayDoc); //PDDDocument overlayDoc with hyperlinks

inputDoc 上的超链接仍然有效,但 overlayDoc 上的超链接无效。是否有另一种方法(使用 PDFBox)将覆盖 PDF 标记到 inputDoc 上,同时保持超链接等交互?

[更新]:下面发布的可能解决方案。

【问题讨论】:

    标签: java overlay pdfbox


    【解决方案1】:

    解决方案

    这真是一个难题,令人惊讶的是,关于这件事的信息很少。然而,最后它非常简单,我设法让它工作。

    基本上我所做的是(下面的代码示例):

    • 从覆盖 PDF 中获取注释
    • 使用 PDFBox 叠加将输入文档与叠加 PDF 叠加
    • 保存新的叠加文档
    • 遍历新文档页面:PDDocument.getPages()
    • 对于新文档中的每一页,添加来自叠加 PDF 的注释
    • 就是这样

    似乎工作得很好。我唯一不确定的是我在下面的代码中执行 annot.setPage(p) 的部分。因为每次对于相同的注释,我都会在新文档中设置不同的页面。它可以工作,但我认为创建一个新的注释实例并将新的注释添加到文档中会更干净。但是,我还没有弄清楚如何将注释克隆到新实例中。欢迎提出这方面的想法:)

    这是我的(一点点剥离的)代码,供任何感兴趣的人使用:

    //instantiate PDDocuments for input PDF and overlay PDF
    PDDocument PDDDoc_inputDoc = PDDocument.load(...);
    PDDocument PDDDoc_overlay = PDDocument.load(...);
    
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    ByteArrayOutputStream baos2 = new ByteArrayOutputStream(); 
    
    //create PDFBox overlay
    Overlay overlay = new Overlay();
    overlay.setOverlayPosition(Overlay.Position.BACKGROUND);
    
    //set inputDoc and overlayDoc PDFs
    overlay.setInputPDF(PDDDoc_inputDoc);
    overlay.setDefaultOverlayPDF(PDDDoc_overlay);
    
    //execute overlay function
    overlay.overlay(new HashMap<>()).save(baos);
    
    //create new PDDocument from overlay
    PDDocument PDD_newOverlaydDocument = PDDocument.load(new ByteArrayInputStream(baos.toByteArray()));
    
    //for every page in the new (overlayed) document, add annotation from the source overlay PDF to the new PDF
    PDPageTree pages = PDD_newOverlaydDocument.getPages();
    for(PDPage p : pages){
        //get annotations from new document page
        List<PDAnnotation> pageAnnotations = p.getAnnotations();
                    
        //add annotations from overlay page to the page
        for(PDAnnotation annot : overlayAnnotations) {
            annot.setPage(p);
            pageAnnotations.add(annot);
        }
    }
            
    //save new PDDDocument to outputstream or file and dow whatever you want with it        
    PDD_newOverlaydDocument.save(...);
    
    //close streams, cleanup, etc
    ....
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-11
      • 2011-09-28
      • 1970-01-01
      • 2011-03-06
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      • 2012-01-30
      相关资源
      最近更新 更多