给pdf文件添加防伪水印logo(附工程源码下载)
2016-01-28 20:16
651 查看
pdf添加水印logo这种需求场景确实很少,有些时候一些销售单据生成pdf添加一个水印logo,做一个简单的防伪效果,虽然实际上并没有太大作用,但是产品经理说要,巴拉巴拉……省略一万字。
下面将源码分享给猿友们,有用就looklook,没用就转移视线吧。
添加水印后的pdf:
这里截图效果可能不是很明显,有需要的猿友可以直接下载下面的源码压缩包,里面有添加水印后的pdf文件。
里面的pdf_project.zip是源码,源码环境eclipse+maven
除了依赖以外,就一个类PDFAddWaterMark.java了,其代码如下:
这里有必要对上面的代码说明的是:其实就是在pdf里面加入图片logo,只是这些图片logo不会遮挡住文字,而且有一定的透明度。另外logo随机旋转一定的角度。再另外,其出现的位置,根据当前页的高度计算出一页需要多少行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,每行左边一个右边一个,然后其位置上下左右在一定范围内随机。代码实现就这样,如果还有什么不明白的可以留言。
相关文章推荐
- 给pdf文件添加防伪水印logo(附工程源码下载)
- 给pdf文件添加防伪水印logo(附工程源码下载)
- GoogleAPI-Adwords Labels
- Codeforces 617E ( 莫队算法 Mo's algorithm )
- GoogleAPI-Adwords-Dynamic Search Ads
- GoogleAPI-Adwords-Bid Landscapes
- GO语言 特性概要
- Django学习笔记(三)
- django学习
- Golang Channel用法简编
- Codeforces 598D Igor In the Museum (DFS)
- Django基础(一)
- Educational Codeforces Round 5 (D. Longest k-Good Segment)
- google map geocoder 地理位置编码的实例
- Dragon of Loowater(贪心)
- GoldenGate配置(二)之双向复制配置
- 集锦——浏览器每次访问自动更新网页,不用手工设置,附Google/firefox/Ie
- Visualizing Concurrency in Go--转
- MonogoDb的角色分类
- Django搭配Celery进行异步/定时任务(一)初步搭建