给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月前
|
数据挖掘 数据安全/隐私保护 开发者
使用Spire.PDF for Python插件从PDF文件提取文字和图片信息
使用Spire.PDF for Python插件从PDF文件提取文字和图片信息
74 0
|
1月前
|
存储 缓存 Python
如何使用Python抓取PDF文件并自动下载到本地
如何使用Python抓取PDF文件并自动下载到本地
34 0
|
1月前
|
JSON JavaScript 前端开发
vue项目使用Print.js插件实现PDF文件打印
vue项目使用Print.js插件实现PDF文件打印
49 0
|
1月前
|
Shell Python
Python生成PDF文件
Python生成PDF文件
23 0
|
1月前
|
前端开发
前端实现生成pdf文件并下载
前端实现生成pdf文件并下载
38 1
|
2月前
|
Java Linux 数据安全/隐私保护
Java【代码 16】将word、excel文件转换为pdf格式和将pdf文档转换为image格式工具类分享(Gitee源码)aspose转换中文乱码问题处理
【2月更文挑战第3天】Java 将word、excel文件转换为pdf格式和将pdf文档转换为image格式工具类分享(Gitee源码)aspose转换中文乱码问题处理
101 0
|
3月前
|
Java API Apache
使用 Apache PDFBox 操作PDF文件
Apache PDFBox库是一个开源的Java工具,专门用于处理PDF文档。它允许用户创建全新的PDF文件,编辑现有的PDF文档,以及从PDF文件中提取内容。此外,Apache PDFBox还提供了一些命令行实用工具。
103 6
|
3月前
|
存储
Vue3 实现 PDF 文件在线预览功能
Vue3 实现 PDF 文件在线预览功能
310 0
|
4月前
|
JavaScript 前端开发
nodejs实现解析chm文件列表,无需转换为PDF文件格式,在线预览chm文件以及目录,不依赖任何网页端插件
nodejs实现解析chm文件列表,无需转换为PDF文件格式,在线预览chm文件以及目录,不依赖任何网页端插件
|
2月前
|
编解码 数据可视化 数据挖掘
【办公自动化】用Python将PDF文件转存为图片
【办公自动化】用Python将PDF文件转存为图片
64 1

热门文章

最新文章