给pdf文件添加防伪水印logo(附工程源码下载)

简介:

目录(?)[+]

pdf添加水印logo这种需求场景确实很少,有些时候一些销售单据生成pdf添加一个水印logo,做一个简单的防伪效果,虽然实际上并没有太大作用,但是产品经理说要,巴拉巴拉……省略一万字。

下面将源码分享给猿友们,有用就looklook,没用就转移视线吧。

一、效果展示

没加水印的pdf:

这里写图片描述

添加水印后的pdf:

这里写图片描述

这里截图效果可能不是很明显,有需要的猿友可以直接下载下面的源码压缩包,里面有添加水印后的pdf文件。

二、源码下载

http://download.csdn.net/detail/u013142781/9421432

里面的pdf_project.zip是源码,源码环境eclipse+maven

三、实例说明

工程需要添加itextpdf包依赖,maven依赖为:

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

   
   

    除了依赖以外,就一个类PDFAddWaterMark.Java了,其代码如下:

    package com.luo.pdf;
    
    import com.itextpdf.text.Image;
    import com.itextpdf.text.pdf.PdfContentByte;
    import com.itextpdf.text.pdf.PdfGState;
    import com.itextpdf.text.pdf.PdfReader;
    import com.itextpdf.text.pdf.PdfStamper;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.util.Random;
    
    public class PDFAddWaterMark {
    
        static final float IAMGE_HEIGHT = 110f; // 限制水印图片的的高度
        static final float IAMGE_WIDTH = 110f; // 限制水印图片的的宽度
    
        /**
         * 给pdf文件添加水印
         * @param file 要加水印的原pdf文件
         * @throws Exception
         */
        public static void addPdfMark(File file) throws Exception {
            // 如果是web项目,应该从web项目里面获取logo
            // String markImagePath =
            // request.getSession().getServletContext().getRealPath("/") +
            // "resources/images/logo.jpg";
            String markImagePath = "C:/Users/luoguohui/Desktop/logo.jpg"; // 水印图片路径
            PdfReader reader = new PdfReader(file.getPath(), "PDF".getBytes());
            // 如果是web项目,直接下载应该放到response的流里面
            // PdfStamper stamp = new PdfStamper(reader,
            // response.getOutputStream());
            // 添加水印之后的pdf文件
            PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(
                    "C:/Users/luoguohui/Desktop/afterAddPdfMark.pdf"));
            int pageSize = reader.getNumberOfPages();
    
            float pageHeight = reader.getPageSize(1).getHeight();
            float pageWidth = reader.getPageSize(1).getWidth();
            try {
                // 每两行显示两个 左边一个,右边一个
                int lineNum = (int) (pageHeight / IAMGE_HEIGHT); // 行数
                int middleY = (int) pageWidth / 2;
                for (int i = 1; i <= pageSize; i++) {
                    for (int j = 0, k = 0; j < lineNum; j = j + 2, k++) {
                        Random random = new Random();
                        Image img = Image.getInstance(markImagePath);// 插入水印
                        img.scaleAbsolute(IAMGE_WIDTH, IAMGE_HEIGHT * 184 / 455);
                        img.setAlignment(Image.UNDERLYING); // 在字下面
                        int trueY;
                        while (true) {
                            trueY = random.nextInt(middleY);
                            if (trueY > IAMGE_WIDTH / 2
                                    && trueY < (middleY - IAMGE_WIDTH)) {
                                break;
                            }
                        }
                        img.setAbsolutePosition(trueY, j * IAMGE_HEIGHT
                                + (float) random.nextInt((int) IAMGE_HEIGHT)
                                - (k % 2) * 10); // 水印的位置
                        img.setRotationDegrees(random.nextInt(360));// 旋转 角度
                        PdfContentByte under = stamp.getUnderContent(i);
                        PdfGState gs = new PdfGState();
                        gs.setFillOpacity(0.3f); // 设置透明度为0.3
                        under.setGState(gs);
                        under.addImage(img);
                        while (true) {
                            trueY = random.nextInt(middleY) + middleY;
                            if (trueY > middleY + IAMGE_WIDTH / 2
                                    && trueY < (2 * middleY - IAMGE_WIDTH)) {
                                break;
                            }
                        }
                        img.setAbsolutePosition(trueY, j * IAMGE_HEIGHT
                                + (float) random.nextInt((int) IAMGE_HEIGHT)
                                - (k % 2) * 10); // 水印的位置
                        img.setRotationDegrees(random.nextInt(360));// 旋转 角度
                        under.addImage(img);
                    }
                }
            } catch (Exception e) {
                throw e;
            } finally {
                stamp.close();// 关闭
                reader.close();
            }
    
        }
    
        public static void main(String[] args) throws Exception {
            // 添加水印之前的pdf文件
            File file = new File("C:/Users/luoguohui/Desktop/beforeAddPdfMark.pdf");
            addPdfMark(file);
        }
    }
    
    
     
     

      这里有必要对上面的代码说明的是:其实就是在pdf里面加入图片logo,只是这些图片logo不会遮挡住文字,而且有一定的透明度。另外logo随机旋转一定的角度。再另外,其出现的位置,根据当前页的高度计算出一页需要多少行logo,每行左边一个右边一个,然后其位置上下左右在一定范围内随机。代码实现就这样,如果还有什么不明白的可以留言。






















      相关文章
      |
      1月前
      |
      前端开发 API
      前端界面生成PDF并导出下载
      【10月更文挑战第21天】利用合适的第三方库,你可以在前端轻松实现界面生成 PDF 并导出下载的功能,为用户提供更方便的文档分享和保存方式。你还可以根据具体的需求进一步优化和定制生成的 PDF 文件,以满足不同的业务场景要求。
      |
      2月前
      |
      Java Apache Maven
      将word文档转换成pdf文件方法
      在Java中,将Word文档转换为PDF文件可采用多种方法:1) 使用Apache POI和iText库,适合处理基本转换需求;2) Aspose.Words for Java,提供更高级的功能和性能;3) 利用LibreOffice命令行工具,适用于需要开源解决方案的场景。每种方法都有其适用范围,可根据具体需求选择。
      |
      2月前
      |
      Java Apache Maven
      Java将word文档转换成pdf文件的方法?
      【10月更文挑战第13天】Java将word文档转换成pdf文件的方法?
      327 1
      |
      2月前
      |
      索引 Python
      PDF文件页面提取操作小指南
      PDF文件页面提取操作小指南
      80 4
      |
      2月前
      |
      计算机视觉 Python
      Python操作PDF文件
      Python操作PDF文件
      34 1
      |
      2月前
      |
      JavaScript 前端开发 容器
      Vue生成PDF文件攻略:html2canvas与jspdf联手,中文乱码与自动换行难题攻克
      Vue生成PDF文件攻略:html2canvas与jspdf联手,中文乱码与自动换行难题攻克
      176 0
      |
      4月前
      |
      XML 缓存 JSON
      为什么浏览器中有些图片、PDF等文件点击后有些是预览,有些是下载
      为什么浏览器中有些图片、PDF等文件点击后有些是预览,有些是下载
      279 0
      |
      2月前
      |
      Python
      Python对PDF文件页面的旋转和切割
      Python对PDF文件页面的旋转和切割
      46 3
      |
      2月前
      |
      JSON 数据格式
      LangChain-20 Document Loader 文件加载 加载MD DOCX EXCEL PPT PDF HTML JSON 等多种文件格式 后续可通过FAISS向量化 增强检索
      LangChain-20 Document Loader 文件加载 加载MD DOCX EXCEL PPT PDF HTML JSON 等多种文件格式 后续可通过FAISS向量化 增强检索
      104 2
      |
      2月前
      |
      人工智能 计算机视觉 Python
      ChatGPT编程省钱、方便小示例——实现PDF转成PNG文件
      ChatGPT编程省钱、方便小示例——实现PDF转成PNG文件
      36 1