pdf加水印

本文介绍了一种使用Java为PDF文档添加文字和图片水印的方法。通过itext和iTextAsian库,实现了自定义水印内容(如公司名、日期等),并能够将水印应用于PDF文档的所有页面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pdf加水印

  1. 相关jar包

    • itext-2.1.7.jar
    • iTextAsian.jar
  2. 代码如下

package com.solex.waterPrint;

import java.awt.Color;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Image;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;
/**
 * 给PDF添加水印
 * @author solexit06
 *
 */
public class TestWaterPdf {
    public static void main(String[] args) throws DocumentException,IOException {
        //要输出的文件
        String outFile="C:/Users/solexit06/Desktop/WaterPrint.pdf";
        //要加水印的原文件
        String inputFile="C:/Users/solexit06/Desktop/testWaterPrint.pdf";
        //水印内容:公司、日期、内容
        String company="**科技有限公司";
        Date date = Calendar.getInstance().getTime();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String waterMarkDate=sdf.format(date);
        String content="受控文件";
        // 将文件先加水印然后输出
        setWatermark(outFile,inputFile,company,waterMarkDate,content);
    }

    public static void setWatermark(String outFile, String inputFile,String company,
            String waterMarkDate,String content) throws DocumentException,IOException {

        PdfReader reader = new PdfReader(inputFile);//获取需要加水印的输入文件
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(outFile)));
        PdfStamper stamper = new PdfStamper(reader, bos);

        int total = reader.getNumberOfPages();//获取输入文件页数
        for (int i = 1; i <= total; i++) {
            PdfContentByte contentOver = stamper.getOverContent(i);//在内容上方加水印
            /*添加图片水印*/
            String imgUrl="C:/Users/solexit06/Desktop/Border.png";
            Image img = Image.getInstance(imgUrl);//获取要作为水印的图片
            img.setAbsolutePosition(200, 450);//图片距离文档的左下边距
            img.scaleToFit(150, 240);//图片水印的大小
            img.setRotationDegrees(10);//旋转
            contentOver.addImage(img);//添加图片水印

            /*添加文字水印*/
            contentOver.beginText();
            BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.EMBEDDED);//字体实例,影响中文字体显示
            contentOver.setColorFill(Color.RED);//水印颜色

            contentOver.setFontAndSize(bf, 16);//字体样式和大小
            contentOver.showTextAligned(Element.ALIGN_LEFT, company, 215, 520,10);//左边距、下边距

            contentOver.setFontAndSize(bf, 10);//字体样式和大小
            contentOver.showTextAligned(Element.ALIGN_LEFT, waterMarkDate, 260, 505,10);//左边距、下边距

            contentOver.setFontAndSize(bf, 24);//字体样式和大小
            contentOver.showTextAligned(Element.ALIGN_LEFT, content, 240, 465,10);//左边距、下边距
            contentOver.endText();

        }
        stamper.close();
        System.out.println("添加水印成功");
    }
}
### 如何在 PDF 文件中添水印 #### 使用 Python 的 PyPDF2 库 PyPDF2 是一种强大的库,可以用来操作 PDF 文件。它支持将另一个 PDF 文件作为水印应用到目标 PDF 上[^1]。以下是具体实现方式: ```python from PyPDF2 import PdfReader, PdfWriter def add_watermark(input_pdf_path, watermark_pdf_path, output_pdf_path): reader_input = PdfReader(input_pdf_path) reader_watermark = PdfReader(watermark_pdf_path) writer_output = PdfWriter() first_page_of_watermark = reader_watermark.pages[0] for page_num in range(len(reader_input.pages)): current_page = reader_input.pages[page_num] current_page.merge_page(first_page_of_watermark) writer_output.add_page(current_page) with open(output_pdf_path, 'wb') as file: writer_output.write(file) add_watermark('original.pdf', 'watermark.pdf', 'output_with_watermark.pdf') ``` 此代码片段展示了如何载两个 PDF 文件并将其中一个作为水印合并到另一文件上。 --- #### 使用 iTextSharp(C#) iTextSharp 是 C# 开发者常用的工具之一,能够轻松处理复杂的文档编辑需求。下面是一个简单的例子展示如何向 PDF文本水印[^2]: ```csharp using System; using iText.Kernel.Geom; using iText.Kernel.Pdf; using iText.Layout; using iText.Layout.Element; class Program { static void Main(string[] args) { string inputPath = "input.pdf"; string outputPath = "output_with_watermark.pdf"; using (PdfDocument pdfDoc = new PdfDocument(new PdfReader(inputPath), new PdfWriter(outputPath))) { Document document = new Document(pdfDoc); foreach(PdfPageBase page in pdfDoc.GetPages()) { Rectangle pageSize = page.GetPageSize(); Canvas canvas = new Canvas(page.NewContentStreamBefore(), pdfDoc); Paragraph paragraph = new Paragraph("Confidential Watermark").SetFontColor(ColorConstants.RED).SetFontSize(60); Div div = new Div().Add(paragraph).SetRotationAngle(Math.PI / 4); float x = (pageSize.GetWidth() - div.GetWidth()) / 2; float y = (pageSize.GetHeight() - div.GetHeight()) / 2; canvas.Add(div.SetFixedPosition(x, y)); } } } } ``` 这段代码会遍历每一页,并在其上放置旋转后的红色文本水印。 --- #### Java 实现方案 对于 Java 用户来说,Apache PDFBox 是一个不错的选择。它可以方便地读取、写入以及修改现有的 PDF 文档[^3]。下面是具体的实现方法: ```java import org.apache.pdfbox.pdmodel.*; import org.apache.pdfbox.pdmodel.graphics.color.PDColor; import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState; import java.awt.Color; import java.io.File; import java.io.IOException; public class AddWatermarkToPDF { public static void main(String[] args) throws IOException { PDDocument doc = null; try { doc = PDDocument.load(new File("input.pdf")); PDPageContentStream contentStream = new PDPageContentStream(doc, doc.getPage(0), PDPageContentStream.AppendMode.APPEND, true, true); contentStream.beginText(); // 设置字体颜色为灰色透明度较低的颜色 PDColor color = new PDColor(new float[]{0.9f}, PDDeviceRGB.INSTANCE); contentStream.setNonStrokingColor(color.getComponents()); contentStream.setFont(PDType1Font.HELVETICA_BOLD, 50); contentStream.newLineAtOffset(200, 400); contentStream.showText("CONFIDENTIAL"); contentStream.endText(); contentStream.close(); doc.save("output_with_watermark.pdf"); } finally { if (doc != null) { doc.close(); } } } } ``` 该程序会在第一页中间位置打印 CONFIDENTIAL 字样作为水印。 --- #### 工具推荐 除了编程手段外,还有一些专门设计好的软件可以直接完成这项工作而无需编写任何脚本。例如 Adobe Acrobat Pro DC 就内置有批量水印的功能;此外还有 Foxit PhantomPDF 和 Nitro PDF Professional 等商业产品也提供了相似特性[^4]。 如果倾向于免费开源解决方案,则可考虑使用 Ghostscript 或 LibreOffice Draw 来间接达到目的——前者允许通过命令行参数指定叠图像层从而形成视觉效果上的“水印”,后者则可以通过绘图模式手动绘制再导出带标记的新副本。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值