java对pdf文件进行加水印操作(中间加水印)

        公司最近有需求需要对pdf文件进行加水印操作,这里使用的是itext(另一个要钱。。),经过测试发现如果是文字水印会可选中(无法操作)但是影响美观,所以自己去做了个透明文字水印。。itext官网上有好几种加水印方法,也可以去上面拿,直接用的那种,例如每隔几页水印变一下之类的。废话少说直接上代码 注:LOGGER为Log4j日志打印的代码初学者可以删除或者替换成System.out.print();

       1.maven依赖

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.9</version>
        </dependency>

2.加水印代码

 /**
     * 文件加水印
     *
     * @param src   需要加水印的原文件路径
     * @param dest  加完水印生成文件的路径
     * @param watermark 水印图片地址
     * @throws IOException
     * @throws DocumentException
     */
    public Map<String, String> manipulatePdf1(String src, String dest,String watermark) {
        Map<String, String> map = new HashMap();
        try {
            logger.info("成功调用插入水印方法");
            PdfReader reader = new PdfReader(src);
            map.put("primary",src);
            logger.info("准备插入水印前的文件路径为:"+src);
            int n = reader.getNumberOfPages();
            PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
            logger.info("插入水印后的文件路径为:"+dest);
            map.put("show",dest);
            // image watermark
            Image img = Image.getInstance(watermark);
            logger.info("水印图片地址为:"+img);
            float w = img.getScaledWidth();
            float h = img.getScaledHeight();
            // transparency
            PdfGState gs1 = new PdfGState();
            gs1.setFillOpacity(0.4f);
            // properties
            PdfContentByte over;
            Rectangle pagesize;
            float x, y;
            // loop over every page
            for (int i = 1; i <= n; i++) {
                pagesize = reader.getPageSizeWithRotation(i);
                x = (pagesize.getLeft() + pagesize.getRight()) / 2;
                y = (pagesize.getTop() + pagesize.getBottom()) / 2;
                over = stamper.getOverContent(i);
                over.saveState();
                over.setGState(gs1);

                over.addImage(img, w, 0, 0, h, x - (w / 2), y - (h / 2));
                over.restoreState();

            }
            logger.info("插入水印成功文件页数为"+n);
            stamper.close();
            reader.close();
        } catch (IOException ioexception) {
            logger.error("文件异常" + ioexception);
        } catch (DocumentException documentexception) {
            logger.error("文件操作异常" + documentexception);
        }
        return map;
    }

新手记录博客,有问题请联系2517411084@qq.com

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用 Java 语言实现给 PDF 文件水印的代码: ```java import com.itextpdf.kernel.color.Color; import com.itextpdf.kernel.geom.Rectangle; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfPage; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.kernel.pdf.canvas.PdfCanvas; import com.itextpdf.layout.Document; import com.itextpdf.layout.element.Paragraph; import com.itextpdf.layout.property.TextAlignment; import java.io.File; import java.io.IOException; public class PdfWatermark { public static void main(String[] args) throws IOException { String srcFile = "document.pdf"; // 原始 PDF 文件 String destFile = "document_with_watermark.pdf"; // 水印后的 PDF 文件 String watermark = "Confidential"; // 要添水印文本 addWatermark(srcFile, destFile, watermark); // 调用添水印的方法 } public static void addWatermark(String srcFile, String destFile, String watermark) throws IOException { PdfDocument pdfDoc = new PdfDocument(new PdfReader(srcFile), new PdfWriter(destFile)); Document doc = new Document(pdfDoc); for (int pageNum = 1; pageNum <= pdfDoc.getNumberOfPages(); pageNum++) { PdfPage page = pdfDoc.getPage(pageNum); Rectangle pageSize = page.getPageSize(); PdfCanvas canvas = new PdfCanvas(page); canvas.beginText(); canvas.setFontAndSize(null, 50); canvas.setColor(Color.GRAY, true); canvas.setTextMatrix(pageSize.getWidth() / 2, pageSize.getHeight() / 2); canvas.showTextAligned(new Paragraph(watermark).setBold().setFontColor(Color.GRAY).setTextAlignment(TextAlignment.CENTER), pageSize.getWidth() / 2, pageSize.getHeight() / 2, pageNum, TextAlignment.CENTER, com.itextpdf.kernel.geom.VerticalAlignment.MIDDLE, 45); canvas.endText(); } doc.close(); System.out.println("水印成功!"); } } ``` 以上代码中,我们使用了 iText 库来操作 PDF 文件。在添水印时,我们首先打开原始 PDF 文件,并创建一个 Document 对象。然后,我们遍历 PDF 文件中的所有面,为每个面添水印。为了添水印,我们使用了 PdfCanvas 类,它提供了一组方法来绘制文本、图形等。在我们的例子中,我们使用 beginText() 方法开始绘制文本,setFontAndSize() 方法设置字体和字号,setColor() 方法设置颜色,setTextMatrix() 方法设置文本的位置,showTextAligned() 方法绘制文本,并使用 endText() 方法结束绘制。最后,我们使用 Document 对象的 close() 方法关闭 PDF 文件,并输出一条水印成功的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值