Java PDF 添加水印

1、jia包

链接:https://pan.baidu.com/s/1mpKd0kpfYq73q3kSlHR6-Q  密码:d0wm


2、代码 

package exportpdf;


import com.aspose.cells.SaveFormat;
import com.aspose.cells.Workbook;
import com.lowagie.text.Element;
import com.lowagie.text.Image;
import com.lowagie.text.pdf.*;


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

/**
 * 导出为 pdf ,带刻章
 *
 * @Version 1.0
 */
public class ExportPDF {

    public static void main(String[] args) throws Exception {
        // InputStream licenseIs = Utils.class.getClassLoader().getResourceAsStream("license.xml");
        // License aposeLic = new License();
        // aposeLic.setLicense(licenseIs);
        // 将 XML 另存为 PDF
        Workbook wb = new Workbook("C:\\Users\\ca\\Desktop\\11.xlsx");
        wb.save("C:\\Users\\ca\\Desktop\\11.pdf", SaveFormat.PDF);

        // 加上水印后的 pdf文件
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("C:\\Users\\ca\\Desktop\\22.pdf")));

        // 将pdf文件先加水印然后输出
        setWatermark(bos, "C:\\Users\\ca\\Desktop\\11.pdf");

    }


    /**
     * @param bos   输出文件流
     * @param input 需要添加水印的文件路径
     */
    public static void setWatermark(BufferedOutputStream bos, String input)
            throws Exception {
        PdfReader reader = new PdfReader(input);
        PdfStamper stamper = new PdfStamper(reader, bos);
        int total = reader.getNumberOfPages() + 1;
        PdfContentByte content;
        BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
        PdfGState gs = new PdfGState();

        // 循环保证每一页 PDF 都能加上水印,有特殊需求也可以改成在固定页码上加水印
        for (int i = 1; i < total; i++) {
            // content = stamper.getOverContent(i);// 在内容上方加水印
            content = stamper.getUnderContent(i);  //在内容下方加水印
            gs.setFillOpacity(0.2f);
            content.setGState(gs);

            // 文字水印
            content.beginText();
            content.setColorFill(Color.black); // 颜色
            content.setFontAndSize(base, 15); // 字体和大小
            content.setTextMatrix(70, 200); // 设置文本矩阵
            // 设置文字水印的文字内容  绝对值位置 和旋转度数
            content.showTextAligned(Element.ALIGN_CENTER, "这里是文字水印!!", 150, 830, 0);
            content.endText(); // 结束文字水印

            // 图片水印
            Image image = Image.getInstance("C:\\Users\\ca\\Desktop\\stamp.jpg"); // 图片水印位置
            image.setAbsolutePosition(10, 300); // 设置 绝对位置
            image.scaleToFit(185, 240);// 设置 图片缩放比例
            image.setRotationDegrees(0); // 设置旋转角度
            content.addImage(image); // 添加图片水印

        }
        stamper.close();
    }

}

 

### Java 实现 PDF 文件添加水印 #### 使用 `iText` 库添加文本水印 为了在PDF文件中添加文本水印,可以使用流行的库 iText。以下是具体的操作方式: ```java import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfReader; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.layout.Document; import com.itextpdf.layout.element.Paragraph; public class AddTextWatermark { public static void addTextWatermark(String srcPdfPath, String destPdfPath, String text) throws Exception { PdfDocument pdfDoc = new PdfDocument(new PdfReader(srcPdfPath), new PdfWriter(destPdfPath)); Document document = new Document(pdfDoc); for (int i = 1; i <= pdfDoc.getNumberOfPages(); i++) { Paragraph paragraph = new Paragraph(text).setRotationAngle(Math.PI / 4).setFontColor(ColorConstants.LIGHT_GRAY); document.showTextAligned(paragraph, 298, 421, i, TextAlignment.CENTER, VerticalAlignment.MIDDLE, 45); } document.close(); } } ``` 这段代码通过遍历每一页并应用旋转后的灰色文本作为水印[^3]。 #### 使用 `Apache PDFBox` 库添加图片水印 另一种常用的方式是利用 Apache PDFBox 来嵌入图像形式的水印到现有的PDF页面上: ```java import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; import java.awt.*; import java.io.File; import java.io.IOException; public class AddImageWatermark { private static final float WATERMARK_WIDTH = 200f; private static final float WATERMARK_HEIGHT = 200f; public static void addImageWatermark(File inputFile, File outputFile, File imgFile) throws IOException { PDDocument doc = null; try { doc = PDDocument.load(inputFile); PDImageXObject pdImage = PDImageXObject.createFromFile(imgFile.getAbsolutePath(), doc); for (PDPage page : doc.getPages()) { PDPageContentStream contentStream = new PDPageContentStream(doc, page, PDPageContentStream.AppendMode.APPEND, true, true); contentStream.drawImage(pdImage, 0, 0, WATERMARK_WIDTH, WATERMARK_HEIGHT); // 调整位置和大小 contentStream.close(); } doc.save(outputFile); } finally { if (doc != null) { doc.close(); } } } } ``` 此段代码展示了如何加载一张图片并将之绘制于每一页面之上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值