概述:使用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加图片水印或文字水印相关推荐

  1. php怎么给视频加水印,视频怎么加水印 添加文字水印和图片水印 给视频加水印的软件...

    昨天由于台风"妮妲"来了深圳,所以在家休息了一天,而且势汹汹的台风"妮妲"于2日03时35分在深圳市大鹏半岛登陆,登陆时风力达到14级,成为近年来正面登陆珠江三 ...

  2. TP5图片加水印(图片水印和文字水印)

    TP5使用加水印功能(加图片水印和文字水印) 由于项目需要图片加水印,正好使用TP5框架,下面记录一下使用方法: 1.安装扩展 使用Composer安装ThinkPHP5的图像处理类库: compos ...

  3. react加水印_React水印组件,支持图片水印,文字水印

    React水印组件,支持图片水印,文字水印. 安装 npm i --save react-watermark-module 用法 import ReactWatermark from 'react-w ...

  4. java给图片加水印_Java 为图片添加水印(图片水印,文字水印)

    Java 为图片添加水印(图片水印,文字水印) 2014-07-28·WeaponX 5267 次浏览 ```java import java.awt.Color; import java.awt.F ...

  5. 用java实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)

    javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置.大小.粗度.翻转.平滑等操作 javaCV图像处理之2:实时视频添加图片水 ...

  6. java为word添加水印,图片水印和文字水印

    java为word添加水印,图片水印和文字水印 jdk1.5及以上 所需jar包:Spire.Office.jar 或 Spire.Doc.jar jar包下载:https://www.e-icebl ...

  7. python图片增加半透明文字水印

    本次使用 python 的 PIL 库来对图像进行处理. 水印效果 代码如下 __author__ = "dengxinyan"from PIL import Image, Ima ...

  8. java水印_Java实现给图片添加图片水印,文字水印及马赛克的方法示例

    本文实例讲述了Java实现给图片添加图片水印,文字水印及马赛克的方法.分享给大家供大家参考,具体如下: 可以在eclipse中新建个Utils类,把以下代码复制进去直接使用,以下方法实现单个或多个水印 ...

  9. 网页怎么在图片上添加文字_教你同时将图片水印和文字水印添加到视频画面

    随着剪辑软件的层出不穷,现在会制作创意视频的人越来越多.今天小编给大家分享一款剪辑软件--视频剪辑高手,以同时给视频添加图片水印和文字水印的效果为例,教大家如何操作. 编辑文字水印命令 勾选视频剪辑高 ...

最新文章

  1. 2021年春季学期-信号与系统-第六次作业参考答案-第六小题
  2. linux杀死tomcat进程6,Linux下启动停止查看杀死Tomcat进程(示例代码)
  3. Xcode 6 Bug:Interface Builder文件中的未知类
  4. python培训班 北京-北京python培训机构那个好?这几个坑千万别踩
  5. java entrypoint_java – 有时只调用AuthenticationEntryPoint
  6. 4k*1芯片 计算机组成,计算机组成原理的大神们能不能帮忙做几道题啊
  7. python matplotlib 方程的绘制
  8. php面试题——Linux部分(高级部分)
  9. 推荐一个Oracle数据库学习网站
  10. OCR手写字体生成数据
  11. 服务器搬迁方案_网站服务器迁移方案
  12. 提前体验让人回归Windows怀抱的Windows Terminal
  13. jq 获取本地ip地址
  14. 智能修改文案-智能写作平台
  15. 【Excel】引用人民银行同期贷款利率(基准利率)和LPR利率的利息计算器(多项目)
  16. 高通Linux Android 平台中的蓝牙功能学习 (4)-- Android Marshmallow 中的蓝牙 4.2
  17. gym:Problem B Bless You Autocorrect!(字典树+最短路)
  18. 你真的了解promise.resolve()吗
  19. shell判断文件目录或文件是否存在
  20. 《可爱的Python》读书笔记(九)

热门文章

  1. 利用Ubuntu的U盘安装盘安装build-essential
  2. Unity实现多屏显示
  3. jq点击下载word
  4. VSFTPD FTP服务器搭建手册
  5. 10-jQuery中的事件与动画教程
  6. 构建和配置更安全的网站
  7. 哥德尔奖得主Cynthia Dwork:实现算法公平性,长路漫漫
  8. Luogu_P4140 奇数国
  9. Windows驱动_WSK驱动之三WSK编程注意事项
  10. [Android]如何做一个崩溃率少于千分之三噶应用app(15)-View分发module架构