Java pdfbox 给 PDF 添加文字和图片水印 并旋转45度

POM

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.27</version>
</dependency>

代码:

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;
import org.apache.pdfbox.util.Matrix;

import java.awt.*;
import java.io.File;

public class Test1 {


    public static void main(String[] args) {

        // 原始文件路径
        String sourcePath = "D:\\poi\\11.pdf";
        // 去c://windows/font下赋值去
        String fontFilePath = "D:\\poi\\simhei.ttf";
        String waterMarkText = "水印文字";
        // log图片的位置
        String logoFilePath = "D:\\poi\\logo.jpeg";
        // 输出的PDF文件路径
        String pdfFile = "D:\\poi\\11-new" + System.currentTimeMillis() + ".pdf";

        addWaterRemark(sourcePath, pdfFile, fontFilePath, waterMarkText, logoFilePath);
    }

    public static void addWaterRemark(String sourcePath, String pdfFile, String fontFilePath, String waterMarkText, String logoFilePath) {
        try {
            // 读取原始 PDF 文件
            PDDocument doc = PDDocument.load(new File(sourcePath));
            doc.setAllSecurityToBeRemoved(true);

            //必须是ttf字体
            PDFont font = PDType0Font.load(doc, new File(fontFilePath));

            PDImageXObject logoImage = PDImageXObject.createFromFile(logoFilePath, doc);
            float logoImageWidth = logoImage.getWidth();
            float logoImageHeight = logoImage.getHeight();

            float maxX;
            float maxY;
            float tempX;
            float tempY;
            float xStepLength = 300f;
            float yStepLength = 200f;
            float startX = 100f;
            float startY = 100f;
            PDPageContentStream cs;

            // 透明度
            PDExtendedGraphicsState r0 = new PDExtendedGraphicsState();
            r0.setNonStrokingAlphaConstant(0.2f);
            r0.setAlphaSourceFlag(true);
            for (PDPage page : doc.getPages()) {
                maxX = page.getBBox().getUpperRightX();
                maxY = page.getBBox().getUpperRightX();

                cs = new PDPageContentStream(doc, page, PDPageContentStream.AppendMode.APPEND, true, true);
                cs.setGraphicsStateParameters(r0);
                cs.setNonStrokingColor(new Color(200, 200, 200));
                cs.setFont(font, 36f);

                // 添加图片,不能在beginText和endText之间加
                cs.drawImage(logoImage, (maxX - logoImageWidth) / 2, maxY / 2, logoImageWidth * 1.5f, logoImageHeight * 1.5f);

                cs.beginText();
                tempX = startX;
                while (tempX < maxX) {
                    tempY = startY;
                    while (tempY < maxY) {
                        cs.setTextMatrix(Matrix.getRotateInstance(45, tempX, tempY));
                        cs.showText(waterMarkText);
                        tempY += yStepLength;
                    }
                    tempX += xStepLength;
                }
                cs.endText();

                // 关闭流
                cs.close();
            }

            // 保存修改后的 PDF 文件
            doc.save(new File(pdfFile));
            doc.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

PDFBox中,添加水印通常涉及到绘制透明图层,比如图片,到每个PDF页面上。这里是一个简单的示例,说明如何在每一页的底部添加一个固定位置的图片作为水印: ```java import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationImage; import org.apache.pdfbox.pdmodel.graphics.image.ImageXObject; public class WatermarkPDF { public static void main(String[] args) throws Exception { // 加载PDF文档 PDDocument document = PDDocument.load(new File("input.pdf")); try { // 获取所有的页面 for (int i = 0; i < document.getNumberOfPages(); i++) { PDPage page = document.getPage(i); // 创建一个图片XObject ImageXObject imageXObject = ImageXObject.createFromImage(document, new File("watermark.png"), true); // 设置水印的位置(这里是底部中央) float watermarkY = page.getMediaBox().getHeight() - imageXObject.getImageHeight(); // 创建并设置注释,即水印 PDAnnotationImage annotation = new PDAnnotationImage(PDAnnotationImage.SUB_TYPE_IMAGE, new Rectangle(0, watermarkY, imageXObject.getWidth(), imageXObject.getHeight()), page, imageXObject); // 将注释添加到当前页面 page.getAnnotations().add(annotation); } // 保存带有水印的新PDF String outputFileName = "output_with_watermark.pdf"; document.save(outputFileName); System.out.println("Watermarked PDF saved to " + outputFileName); } finally { // 关闭文档以释放资源 document.close(); } } } ``` 在这个示例中,你需要替换`"input.pdf"`为你要操作的PDF文件路径,以及 `"watermark.png"`为你想要使用的水印图片文件路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闲猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值