【问题标题】:How to add text watermark to pdf in Java using Apache PDFBox?如何使用 Apache PDFBox 在 Java 中向 pdf 添加文本水印?
【发布时间】:2017-01-29 07:04:15
【问题描述】:

我没有得到任何在 PDF 文件中添加文本水印的教程?请大家指导我,我是PDFBOX的新手。

它不是重复的,评论中的链接对我没有帮助。我想在 pdf 中添加文本,而不是图像。

【问题讨论】:

  • Watermarking with PDFBox的可能重复
  • 在此之前我尝试过 iText,但 iText 不是免费的。我想要一个开源...... - 这样的说法在这里是不合适的。如果您想使用库 XXX 执行任务,则无需解释为什么不使用库 YYY。相反,您应该解释您尝试过的内容以及卡在哪里。关于声明本身,iText 开源的,只要您遵守 AGPL 规则,您就可以使用它而无需支付版税。 PDFBox 同样是开源的,只要遵守 Apache License v2.0 规则就可以使用。
  • 请查看源代码下载中的 AddMessageToEachPage.java 示例。然后编辑你的问题,看看还有什么问题。
  • 感谢 Tilman,我可以添加水印,但如何使用叠加层、透明度将其添加到背景中。

标签: java pdfbox watermark


【解决方案1】:

这是一个使用 PDFBox 2.0.2 的示例。这将加载 PDF 并在右下角以红色透明字体写入一些文本。如果它是多页 PDF,水印将出现在每一页上。它可能还没有准备好生产,因为我不确定是否需要检查一些额外的空条件,但它应该能让你朝着正确的方向前进。

请记住,此特定代码块不会修改原始 PDF,但会使用 Tmp_(filename) 作为输出创建一个新 PDF。

        private static void watermarkPDF (File fileStored) {
    File tmpPDF;
    PDDocument doc;
    tmpPDF = new File(fileStored.getParent() + System.getProperty("file.separator") +"Tmp_"+fileStored.getName());
    doc = PDDocument.load(fileStored);
    for(PDPage page:doc.getPages()){
        PDPageContentStream cs = new PDPageContentStream(doc, page, AppendMode.APPEND, true, true);
        String ts = "Some sample text";
        PDFont font = PDType1Font.HELVETICA_BOLD;
        float fontSize = 14.0f;
        PDResources resources = page.getResources();
        PDExtendedGraphicsState r0 = new PDExtendedGraphicsState();
        r0.setNonStrokingAlphaConstant(0.5f);
        cs.setGraphicsStateParameters(r0);
        cs.setNonStrokingColor(255,0,0);//Red
        cs.beginText();
        cs.setFont(font, fontSize);
        cs.setTextMatrix(Matrix.getTranslateInstance(0f,0f));
        cs.showText(ts);
        cs.endText();
        }
        cs.close();
    }
    doc.save(tmpPDF);
}

【讨论】:

  • 它可能还没有准备好生产 - 为了使它更是如此,A 更新位置计算以考虑坐标系原点不需要左下角,B使用PDPageContentStream构造函数和resetContext参数并将其设置为trueC简化了PDExtendedGraphicsState的处理,特别是停止显式干预资源,setGraphicsStateParameters 已经在必要时将状态添加到资源中。并且由于 OP 想要向 pdf 添加文本而不是图像,因此也删除添加的图像。
  • 嗨,MKL - 我刚刚在网上从其他示例发布它的同一天修补了这个。但是,根据我从您那里收集到的信息,我应该能够通过删除整个 IF 部分并仅保留 r0.setNonStrokingAlphaConstant 来改变这一点。对吗?
  • 是的,这应该修复项目 C
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-14
  • 1970-01-01
  • 2018-12-02
相关资源
最近更新 更多