我正在现有的 pdf 上添加水印。 据我所知,有两种方法可以实现目标。
但无论如何我都会覆盖所有原始内容。
以下是我到现在为止写的内容
服务
public class TestPdf {
// Method #1. This method will add overlay pdf to the original one
public PDDocument addWatermark(PDDocument originalDocument, PDDocument overlayDocument) throws IOException {
Overlay overlay = new Overlay();
overlay.setOverlayPosition(Overlay.Position.BACKGROUND);
overlay.setInputPDF(originalDocument);
overlay.setAllPagesOverlayPDF(overlayDocument);
PDDocument markedDocument = overlay.overlay(Collections.emptyMap());
overlay.close();
return markedDocument;
}
// Method #2. This method will add transparent image to the original pdf
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);
contentStream.setGraphicsStateParameters(pdExtendedGraphicsState);
contentStream.drawImage(watermarkImage, x, y);
contentStream.close();
}
return originalDocument;
}
}
和测试方法类似
public class TestRunner {
private void writeFile(String outPath, PDDocument document) throws IOException {
File outFile = new File(outPath);
FileOutputStream fileOutputStream = new FileOutputStream(outFile);
document.saveIncremental(fileOutputStream);
}
@Test
public void addWatermark() throws Exception {
TestPdf sut = new TestPdf();
File inFile = new File(UNSIGNED_PDF_FILE);
PDDocument document = Loader.loadPDF(inFile);
File overlayFile = new File(WATERMARK_PDF_FILE);
PDDocument overlay = Loader.loadPDF(overlayFile);
PDDocument markedDocument = sut.addWatermark(document, overlay);
writeFile(WATERMARKED_FILE, markedDocument);
}
@Test
public void addTransparentImage() throws ExportException {
TestPdf sut = new TestPdf();
File inFile = new File(UNSIGNED_PDF_FILE);
PDDocument document = Loader.loadPDF(inFile);
PDDocument watermarkAddedDocument = sut.addImage(document, WATERMARK_PNG_FILE, 200, 200, 0.1F);
writeFile(IMAGED_APPENDED_FILE, watermarkAddedDocument);
}
}
此代码生成 2 个 pdf 文件。一张带有覆盖 pdf,另一张带有透明图像。
问题是原来的内容没有显示出来
overlay.setPosition(Position.FOREGROUND)
时,我可以看到overlay pdf)设置图像或叠加有什么问题吗?
====已更新====
设置
overlay.setOverlayPosition(Overlay.Position.FOREGROUND)
可以发挥作用。
但是仍然不知道如何添加图像。
您想要向页面添加内容。但是你构建
PDPageContentStream
的方式
new PDPageContentStream(originalDocument, page);
用新内容替换当前页面内容。因此,您必须在此处使用不同的构造函数以及允许您附加新内容的参数。正如您在回复评论时发现的那样,使用
new PDPageContentStream(originalDocument, page, PDPageContentStream.AppendMode.APPEND, true, true)
使您的代码按预期工作。