如何使用 apache pdfbox 添加水印

问题描述 投票:0回答:1

我正在现有的 pdf 上添加水印。 据我所知,有两种方法可以实现目标。

  • 为文本制作透明图像
  • 将叠加 pdf 添加到原始 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 pdf只是覆盖了所有原始内容(当我设置
    overlay.setPosition(Position.FOREGROUND)
    时,我可以看到overlay pdf)
  • 图像可以通过alpha值调整,但原始pdf上的文字已经消失了。

设置图像或叠加有什么问题吗?

====已更新====

设置

overlay.setOverlayPosition(Overlay.Position.FOREGROUND)
可以发挥作用。

但是仍然不知道如何添加图像。

java overlay pdfbox watermark
1个回答
0
投票

您想要向页面添加内容。但是你构建

PDPageContentStream

的方式
new PDPageContentStream(originalDocument, page);

用新内容替换当前页面内容。因此,您必须在此处使用不同的构造函数以及允许您附加新内容的参数。正如您在回复评论时发现的那样,使用

new PDPageContentStream(originalDocument, page, PDPageContentStream.AppendMode.APPEND, true, true)

使您的代码按预期工作。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.