You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Apache PDFBox添加水印时原内容被遮挡的问题求助

PDFBox添加图片水印导致原内容消失的解决方案

你的图片水印方法出现原文本消失的核心原因:创建PDPageContentStream时未指定追加模式,默认构造器会直接替换原页面的全部内容。

修改后的addImage方法代码

public PDDocument addImage(PDDocument originalDocument, String watermarkPath, float x, float y, float alpha) throws IOException {
    PDImageXObject watermarkImage = PDImageXObject.createFromFile(watermarkPath, originalDocument);
    PDExtendedGraphicsState pdExtendedGraphicsState = new PDExtendedGraphicsState();
    pdExtendedGraphicsState.setNonStrokingAlphaConstant(alpha);

    for (int i = 0; i < originalDocument.getNumberOfPages(); i++) {
        PDPage page = originalDocument.getPage(i);
        // 关键修改:指定追加模式,保留原页面内容
        PDPageContentStream contentStream = new PDPageContentStream(originalDocument, page, PDPageContentStream.AppendMode.APPEND, true, true);
        contentStream.setGraphicsStateParameters(pdExtendedGraphicsState);
        contentStream.drawImage(watermarkImage, x, y);
        contentStream.close();
    }
    return originalDocument;
}

关键说明

  1. 追加模式参数:PDPageContentStream.AppendMode.APPEND表示在原页面内容之后绘制水印(即水印在前景,原内容在背景);如果需要把水印放在原内容下方(背景层),可以改用PDPageContentStream.AppendMode.PREPEND。
  2. 额外布尔参数:后面两个true分别表示压缩内容流、重置图形上下文,确保新内容的绘制不干扰原页面的图形状态。
  3. 透明度保持:你之前设置的nonStrokingAlphaConstant可以保留,调整alpha值就能控制水印的透明程度,不会遮挡原内容。

补充测试注意

测试类中的writeFile方法使用了saveIncremental,如果修改后的文档仍有异常,可以尝试改用document.save(outFile)(非增量保存),增量保存可能在某些场景下导致内容渲染异常。


内容的提问来源于stack exchange,提问作者June Young Oh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 20:42:38