使用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; }
关键说明
- 追加模式参数:
PDPageContentStream.AppendMode.APPEND表示在原页面内容之后绘制水印(即水印在前景,原内容在背景);如果需要把水印放在原内容下方(背景层),可以改用PDPageContentStream.AppendMode.PREPEND。 - 额外布尔参数:后面两个
true分别表示压缩内容流、重置图形上下文,确保新内容的绘制不干扰原页面的图形状态。 - 透明度保持:你之前设置的
nonStrokingAlphaConstant可以保留,调整alpha值就能控制水印的透明程度,不会遮挡原内容。
补充测试注意
测试类中的writeFile方法使用了saveIncremental,如果修改后的文档仍有异常,可以尝试改用document.save(outFile)(非增量保存),增量保存可能在某些场景下导致内容渲染异常。
内容的提问来源于stack exchange,提问作者June Young Oh
相关产品推荐
相关产品推荐

