使用itext加图片水印或文字水印
概述:使用itext 技术给pdf加水印方法。
实现原理:在不管是流还是临时pdf 预览之前。需先 生成不带水印的pdf,然后在通过itext工具方法生成带水印的pdf
依赖jar包:i-text-asian.jar , itextpdf-5.5.10.jar
步骤一:做成工具类。
工具类代码及说明:分图片水印和文字水印,可根据具体需求使用。
package com.test.util;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfGState;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfSmartCopy;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;public class ProcessPDF {public static void main(String[] args) {try {
// List<InputStream> pdfs = new ArrayList<InputStream>();
// pdfs.add(new FileInputStream("e:\\123.pdf"));
// pdfs.add(new FileInputStream("e:\\456.pdf"));
// OutputStream output = new FileOutputStream("e:\\789.pdf");
// concatPDFs(pdfs, output, true);ProcessPDF.addPdfImgMark("E:\\file2\\1502349579058.pdf", "E:\\file2" + File.separator + "mark" + File.separator + "mark1111upGRAY.pdf", "C:\\Users\\Administrator\\Desktop\\1127.png",300,350);ProcessPDF.addPdfTextMark("E:\\file2\\1502349579058.pdf", "E:\\file2" + File.separator + "mark" + File.separator + "mark2222upGRAY.pdf", "水印文字", 300,350);} catch (Exception e) {e.printStackTrace();}}public static File mergeFiles(String[] files, String result, boolean smart) throws IOException, DocumentException {Document document = new Document();PdfCopy copy;if (smart)copy = new PdfSmartCopy(document, new FileOutputStream(result));elsecopy = new PdfCopy(document, new FileOutputStream(result));document.open();PdfReader[] reader = new PdfReader[files.length];for (int i = 0; i < files.length; i++) {reader[i] = new PdfReader(files[i]);copy.addDocument(reader[i]);copy.freeReader(reader[i]);reader[i].close();}document.close();return new File(result);}/*** 合并pdf* * @param streamOfPDFFiles* @param outputStream* @param paginate*/public static void concatPDFs(List<InputStream> streamOfPDFFiles,OutputStream outputStream, boolean paginate) {Document document = new Document();try {List<InputStream> pdfs = streamOfPDFFiles;List<PdfReader> readers = new ArrayList<PdfReader>();int totalPages = 0;Iterator<InputStream> iteratorPDFs = pdfs.iterator();// Create Readers for the pdfs.while (iteratorPDFs.hasNext()) {InputStream pdf = iteratorPDFs.next();PdfReader pdfReader = new PdfReader(pdf);readers.add(pdfReader);totalPages += pdfReader.getNumberOfPages();}// Create a writer for the outputstreamPdfWriter writer = PdfWriter.getInstance(document, outputStream);document.open();BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA,BaseFont.CP1252, BaseFont.NOT_EMBEDDED);PdfContentByte cb = writer.getDirectContent(); // Holds the PDF// dataPdfImportedPage page;int currentPageNumber = 0;int pageOfCurrentReaderPDF = 0;Iterator<PdfReader> iteratorPDFReader = readers.iterator();// Loop through the PDF files and add to the output.while (iteratorPDFReader.hasNext()) {PdfReader pdfReader = iteratorPDFReader.next();// Create a new page in the target for each source page.while (pageOfCurrentReaderPDF < pdfReader.getNumberOfPages()) {document.newPage();pageOfCurrentReaderPDF++;currentPageNumber++;page = writer.getImportedPage(pdfReader,pageOfCurrentReaderPDF);cb.addTemplate(page, 0, 0);// Code for pagination.if (paginate) {cb.beginText();cb.setFontAndSize(bf, 9);cb.showTextAligned(PdfContentByte.ALIGN_CENTER, ""+ currentPageNumber + " of " + totalPages, 520,5, 0);cb.endText();}}pageOfCurrentReaderPDF = 0;}outputStream.flush();document.close();outputStream.close();} catch (Exception e) {e.printStackTrace();} finally {if (document.isOpen())document.close();try {if (outputStream != null)outputStream.close();} catch (IOException ioe) {ioe.printStackTrace();}}}/*** * <br>* <p>* Description: 给pdf文件添加水印 <br>* <p><br/>* <p>* * @param InPdfFile* 要加水印的原pdf文件路径* @param outPdfFile* 加了水印后要输出的路径* @param markImagePath* 水印图片路径* @param imgWidth* 图片横坐标* @param imgHeight* 图片纵坐标* @throws Exception* @see void*/public static void addPdfImgMark(String InPdfFile, String outPdfFile, String markImagePath,int imgWidth, int imgHeight) throws Exception { PdfReader reader = new PdfReader(InPdfFile, "PDF".getBytes()); PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(new File(outPdfFile))); PdfContentByte under;PdfGState gs1 = new PdfGState(); gs1.setFillOpacity(0.3f);// 透明度设置Image img = Image.getInstance(markImagePath);// 插入图片水印img.setAbsolutePosition(imgWidth, imgHeight); // 坐标img.setRotation(-20);// 旋转 弧度img.setRotationDegrees(45);// 旋转 角度// img.scaleAbsolute(200,100);//自定义大小// img.scalePercent(50);//依照比例缩放int pageSize = reader.getNumberOfPages();// 原pdf文件的总页数for(int i = 1; i <= pageSize; i++) { under = stamp.getUnderContent(i);// 水印在之前文本下// under = stamp.getOverContent(i);//水印在之前文本上under.setGState(gs1);// 图片水印 透明度under.addImage(img);// 图片水印} stamp.close();// 关闭// // 删除不带水印文件
// File tempfile = new File(InPdfFile);
// if(tempfile.exists()) {
// tempfile.delete();
// } } /*** * <br>* <p>* Description: 给pdf文件添加水印<br>* * @param InPdfFile* 要加水印的原pdf文件路径* @param outPdfFile* 加了水印后要输出的路径* @param textMark* 水印文字* @param textWidth* 文字横坐标* @param textHeight* 文字纵坐标* @throws Exception* @see void*/public static void addPdfTextMark(String InPdfFile, String outPdfFile, String textMark,int textWidth, int textHeight) throws Exception { PdfReader reader = new PdfReader(InPdfFile, "PDF".getBytes()); PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(new File(outPdfFile))); PdfContentByte under;BaseFont font = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1", "Identity-H", true);// 使用系统字体int pageSize = reader.getNumberOfPages();// 原pdf文件的总页数for(int i = 1; i <= pageSize; i++) { under = stamp.getUnderContent(i);// 水印在之前文本下// under = stamp.getOverContent(i);//水印在之前文本上under.beginText(); under.setColorFill(BaseColor.GRAY);// 文字水印 颜色under.setFontAndSize(font, 38);// 文字水印 字体及字号under.setTextMatrix(textWidth, textHeight);// 文字水印 起始位置under.showTextAligned(Element.ALIGN_CENTER, textMark, textWidth, textHeight, 45);under.endText();} stamp.close();// 关闭} }
注意事项:文字水印方法中,字体的文件路径
步骤二:在合适的地方调用上述工具方法
public static void main(String[] args) {try {
// List<InputStream> pdfs = new ArrayList<InputStream>();
// pdfs.add(new FileInputStream("e:\\123.pdf"));
// pdfs.add(new FileInputStream("e:\\456.pdf"));
// OutputStream output = new FileOutputStream("e:\\789.pdf");
// concatPDFs(pdfs, output, true);ProcessPDF.addPdfImgMark("E:\\file2\\1502349579058.pdf", "E:\\file2" + File.separator + "mark" + File.separator + "mark1111upGRAY.pdf", "C:\\Users\\Administrator\\Desktop\\1127(图片水印).png",300,350);ProcessPDF.addPdfTextMark("E:\\file2\\1502349579058.pdf", "E:\\file2" + File.separator + "mark" + File.separator + "mark2222upGRAY.pdf", "要加的水印文字", 300, 350);} catch (Exception e) {e.printStackTrace();}}
使用itext加图片水印或文字水印相关推荐
- php怎么给视频加水印,视频怎么加水印 添加文字水印和图片水印 给视频加水印的软件...
昨天由于台风"妮妲"来了深圳,所以在家休息了一天,而且势汹汹的台风"妮妲"于2日03时35分在深圳市大鹏半岛登陆,登陆时风力达到14级,成为近年来正面登陆珠江三 ...
- TP5图片加水印(图片水印和文字水印)
TP5使用加水印功能(加图片水印和文字水印) 由于项目需要图片加水印,正好使用TP5框架,下面记录一下使用方法: 1.安装扩展 使用Composer安装ThinkPHP5的图像处理类库: compos ...
- react加水印_React水印组件,支持图片水印,文字水印
React水印组件,支持图片水印,文字水印. 安装 npm i --save react-watermark-module 用法 import ReactWatermark from 'react-w ...
- java给图片加水印_Java 为图片添加水印(图片水印,文字水印)
Java 为图片添加水印(图片水印,文字水印) 2014-07-28·WeaponX 5267 次浏览 ```java import java.awt.Color; import java.awt.F ...
- 用java实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)
javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置.大小.粗度.翻转.平滑等操作 javaCV图像处理之2:实时视频添加图片水 ...
- java为word添加水印,图片水印和文字水印
java为word添加水印,图片水印和文字水印 jdk1.5及以上 所需jar包:Spire.Office.jar 或 Spire.Doc.jar jar包下载:https://www.e-icebl ...
- python图片增加半透明文字水印
本次使用 python 的 PIL 库来对图像进行处理. 水印效果 代码如下 __author__ = "dengxinyan"from PIL import Image, Ima ...
- java水印_Java实现给图片添加图片水印,文字水印及马赛克的方法示例
本文实例讲述了Java实现给图片添加图片水印,文字水印及马赛克的方法.分享给大家供大家参考,具体如下: 可以在eclipse中新建个Utils类,把以下代码复制进去直接使用,以下方法实现单个或多个水印 ...
- 网页怎么在图片上添加文字_教你同时将图片水印和文字水印添加到视频画面
随着剪辑软件的层出不穷,现在会制作创意视频的人越来越多.今天小编给大家分享一款剪辑软件--视频剪辑高手,以同时给视频添加图片水印和文字水印的效果为例,教大家如何操作. 编辑文字水印命令 勾选视频剪辑高 ...
最新文章
- 2021年春季学期-信号与系统-第六次作业参考答案-第六小题
- linux杀死tomcat进程6,Linux下启动停止查看杀死Tomcat进程(示例代码)
- Xcode 6 Bug:Interface Builder文件中的未知类
- python培训班 北京-北京python培训机构那个好?这几个坑千万别踩
- java entrypoint_java – 有时只调用AuthenticationEntryPoint
- 4k*1芯片 计算机组成,计算机组成原理的大神们能不能帮忙做几道题啊
- python matplotlib 方程的绘制
- php面试题——Linux部分(高级部分)
- 推荐一个Oracle数据库学习网站
- OCR手写字体生成数据
- 服务器搬迁方案_网站服务器迁移方案
- 提前体验让人回归Windows怀抱的Windows Terminal
- jq 获取本地ip地址
- 智能修改文案-智能写作平台
- 【Excel】引用人民银行同期贷款利率(基准利率)和LPR利率的利息计算器(多项目)
- 高通Linux Android 平台中的蓝牙功能学习 (4)-- Android Marshmallow 中的蓝牙 4.2
- gym:Problem B Bless You Autocorrect!(字典树+最短路)
- 你真的了解promise.resolve()吗
- shell判断文件目录或文件是否存在
- 《可爱的Python》读书笔记(九)