在开发中,很多客户要求对pdf文档和相关图片进行水印文字添加。

可能我现在水平有限,在对pdf文件添加的时候,先将pdf文件转为了图片格式,然后再进行的水印添加,之后再转回pdf格式文档。以下就是代码。

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;import javax.imageio.ImageIO;import net.sf.json.JSONArray;
import net.sf.json.JSONObject;import org.icepdf.core.exceptions.PDFException;
import org.icepdf.core.exceptions.PDFSecurityException;
import org.icepdf.core.util.GraphicsRenderingHints;import com.eos.system.annotation.Bizlet;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;
import com.mln.frame.CompressFile;
import com.mln.wateroa.files.filesdataset.AtFileupload;import commonj.sdo.DataObject;import org.gocom.components.coframe.tools.CoframeDASDaoSupport;/*** @author admin* @date 2018-08-13 16:03:30* */
public class PdfWaterMarkUtil extends CoframeDASDaoSupport{String uuid = UUID.randomUUID().toString().replace("-", "");//测试public static void main(String[] args) throws PDFException, PDFSecurityException, IOException, InterruptedException {PdfWaterMarkUtil pwm = new PdfWaterMarkUtil();ArrayList<String> imageUrllist = new ArrayList<String>();  String logoText = "此文件仅对投标有效TESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTESTTEST";String srcImgPath = "G:\\22-1xxxxxxx.pdf";pwm.waterMark(srcImgPath, logoText);}/*** pdf水印添加* @param srcImgPath原文件地址* @param logoText水印文字* @return 添加水印后的pdf路径* @throws InterruptedException * @throws IOException * @throws PDFSecurityException * @throws PDFException */public String PdfWaterMarks (String srcImgPath,String logoText) throws PDFException, PDFSecurityException, IOException, InterruptedException{PdfWaterMarkUtil pwm = new PdfWaterMarkUtil();ArrayList<String> imageUrllist = new ArrayList<String>();  String pngpath = pwm.pdfToPic(srcImgPath);//pdf转图片后的路径String targerTextPath = pwm.markImageByText(logoText, pngpath, -20);//给转的图片添加水印imageUrllist.add(targerTextPath);  String newPdfPath = srcImgPath.substring(0,srcImgPath.lastIndexOf("."))+uuid;String newPdfUrl = newPdfPath+"new.pdf";File file = pwm.PngToPdf(imageUrllist, newPdfUrl);   //把添加完水印的图片重新生成pdfpwm.deleteFile(pngpath);pwm.deleteFile(targerTextPath);try {  file.createNewFile();  } catch (IOException e) {  // TODO Auto-generated catch block  e.printStackTrace();  }    return newPdfUrl;}/*** 图片添加水印* @param srcImgPath* @param logoText* @return 添加水印后的图片路径*/public String JpgWaterMarks(String srcImgPath,String logoText){String targerTextPath = markImageByText(logoText, srcImgPath, -20);//图片添加水印return targerTextPath;}/*** 判断是为图片添加水印还是pdf添加水印* @param srcImgPath 源路径* @param logoText 水印文字* @return 添加水印后的图片路径*/public String waterMark(String srcImgPath,String logoText) throws PDFException, PDFSecurityException, IOException, InterruptedException{String imgType = srcImgPath.substring(srcImgPath.lastIndexOf(".")+ 1).toLowerCase();PdfWaterMarkUtil pwm = new PdfWaterMarkUtil();String newPath = null;System.out.println(imgType);if (imgType.contains("pdf")){//图片类型为pdf格式时候System.out.println("pdf格式添加水印");newPath = PdfWaterMarks(srcImgPath,logoText);}else if(imgType.contains("bmp")||imgType.contains("pcx")||imgType.contains("tiff")||imgType.contains("gif")||imgType.contains("jpeg")||imgType.contains("tga")||imgType.contains("exif")||imgType.contains("fpx")||imgType.contains("svg")||imgType.contains("psd")||imgType.contains("cdr")||imgType.contains("pcd")||imgType.contains("dxf")||imgType.contains("ufo")||imgType.contains("eps")||imgType.contains("png")||imgType.contains("hdri")||imgType.contains("ai")||imgType.contains("raw")||imgType.contains("raw")||imgType.contains("ico")||imgType.contains("webp")||imgType.contains("flic")||imgType.contains("emf")||imgType.contains("jpg")){//图片类型System.out.println("图片格式添加水印");newPath = pwm.JpgWaterMarks(srcImgPath, logoText);}else{newPath = srcImgPath;}return newPath;}/*** 图片添加水印* @param srcImgPath原文件地址* @param logoText水印文字* @return 添加水印后的图片路径*/@Bizlet("")public String PicWaterMark(String srcImgPath,String logoText){PdfWaterMarkUtil a = new PdfWaterMarkUtil();String targerTextPath = a.markImageByText(logoText, srcImgPath, -20);return targerTextPath;}// 水印透明度private static float alpha = 0.5f;// 水印文字颜色private static Color color = Color.gray;/** pdf转图片*/public String pdfToPic(String pdfPath) throws PDFException, PDFSecurityException, IOException, InterruptedException{ String newPath1 = pdfPath.substring(0,pdfPath.lastIndexOf("."))+uuid;//String newPath2 = pdfPath.substring(pdfPath.lastIndexOf("."));String newPath = newPath1+".png";org.icepdf.core.pobjects.Document document = new org.icepdf.core.pobjects.Document();  document.setFile(pdfPath);  float scale = 2.5f;//缩放比例  float rotation = 0f;//旋转角度  for (int i = 0; i < document.getNumberOfPages(); i++) {  BufferedImage image = (BufferedImage)  document.getPageImage(i, GraphicsRenderingHints.SCREEN, org.icepdf.core.pobjects.Page.BOUNDARY_CROPBOX, rotation, scale);  RenderedImage rendImage = image;  try {  // String imgName = i + ".png";  System.out.println(newPath);  File file = new File(newPath);  ImageIO.write(rendImage, "png", file);   } catch (IOException e) {  e.printStackTrace();  }  image.flush();  }  document.dispose();return newPath;  } //图片转pdfpublic File PngToPdf(ArrayList<String> imageUrllist,String mOutputPdfFileName) {  Document doc = new Document(PageSize.A4, 20, 20, 20, 20);  try {  PdfWriter  .getInstance(doc, new FileOutputStream(mOutputPdfFileName));  doc.open();  for (int i = 0; i < imageUrllist.size(); i++) {  //doc.newPage();  //doc.add(new Paragraph("简单使用iText"));  Image png1 = Image.getInstance(imageUrllist.get(i));  float heigth = png1.getHeight();  float width = png1.getWidth();  int percent = getPercent2(heigth, width);  png1.setAlignment(Image.MIDDLE);  png1.scalePercent(percent+3);// 表示是原来图像的比例;  doc.add(png1);  }  doc.close();  } catch (FileNotFoundException e) {  e.printStackTrace();  } catch (DocumentException e) {  e.printStackTrace();  } catch (IOException e) {  e.printStackTrace();  }  File mOutputPdfFile = new File(mOutputPdfFileName);  if (!mOutputPdfFile.exists()) {  mOutputPdfFile.deleteOnExit();  return null;  }  System.out.println("水印图片转PDF完成");return mOutputPdfFile;  }  /** * 第二种解决方案,统一按照宽度压缩 这样来的效果是,所有图片的宽度是相等的,自我认为给客户的效果是最好的 * * @param args */  public static int getPercent2(float h, float w) {  int p = 0;  float p2 = 0.0f;  p2 = 530 / w * 100;  p = Math.round(p2);  return p;  }/** 图片添加水印*/public String markImageByText(String logoText, String srcImgPath,  Integer degree) {String newPath1 = srcImgPath.substring(0,srcImgPath.lastIndexOf("."));String newPath2 = srcImgPath.substring(srcImgPath.lastIndexOf("."));String targerPath = newPath1+"new" +newPath2;System.out.println(targerPath);InputStream is = null;OutputStream os = null;try {// 1、源图片File file = new File(srcImgPath);BufferedImage bi = null;try {bi = ImageIO.read(file);} catch (Exception e) {e.printStackTrace();}int width = bi.getWidth(); // 宽像素int height = bi.getHeight(); // 高像素java.awt.Image srcImg = ImageIO.read(file);BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);// 2、得到画笔对象Graphics2D g = buffImg.createGraphics();// 3、设置对线段的锯齿状边缘处理g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null),srcImg.getHeight(null), java.awt.Image.SCALE_SMOOTH), 0, 0,null);// 4、设置水印旋转if (null != degree) {g.rotate(Math.toRadians(degree),(double) buffImg.getWidth() / 2,(double) buffImg.getHeight()/ 2);}// 水印文字字体Font font = new Font("宋体", Font.BOLD, width/30);// 5、设置水印文字颜色g.setColor(color);g.setFont(font);// 7、设置水印文字透明度g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,alpha));// 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)FontMetrics fm = g.getFontMetrics(font);int textWidth = fm.stringWidth(logoText);int widthX = (width - textWidth) / 2;g.drawString(logoText, widthX, height/2); // 水印位置// 9、释放资源g.dispose();// 10、生成图片os = new FileOutputStream(targerPath);System.out.println(os);ImageIO.write(buffImg, "JPG", os);System.out.println("图片添加水印文字完成");} catch (Exception e) {e.printStackTrace();} finally {try {if (null != is)is.close();} catch (Exception e) {e.printStackTrace();}try {if (null != os)os.close();} catch (Exception e) {e.printStackTrace();}}return targerPath;}}

附上相关的jar包下载地址  相关PDF工具jar包下载

pdf文件和图片文件水印添加java方法及jar包相关推荐

  1. java调用pdfbox转pdf文件为图片文件,有中文时在windows上正常,部署到linux下乱码

    最近遇到了一个很头疼的问题,我们的项目移动端需要一个读pdf的功能,但是手机端开发人员说移动端是用jquerymobile做的,不能直接甩pdf文件过去(原因是pdf文件太大),于是乎我们想到了2个解 ...

  2. Office文档上传后实时转换为PDF格式_图片文件上传后实时裁剪_实现在线预览Office文档

    Office文档上传后实时转换为PDF格式_图片文件上传后实时裁剪 前置条件 安装LibreOffice 安装OpenOffice 安装Unoconv 安装ImageMagick.x86_64 安装G ...

  3. python pdf删除图片_使用PyMuPdf提取、删除及替换PDF中的图片文件

    有时候想把PDF中的图片文件提取出来,身为程序员的我当然是自己写段代码来实现,先看看了网上的方法,都是逐行遍历,正则匹配来提取什么的,其实没有那么复杂,PyMuPdf官方文档里自带就有提取图片文件的方 ...

  4. PDF文件转图片怎么弄?这个方法值得收藏

    PDF文件是一种广泛使用的文件格式,其保留了原始文档的格式和内容,使其在不同平台上具有高度的兼容性.然而,在某些情况下,我们需要将PDF文件转换为图片格式以便于处理和分享.本文将介绍两种方法将PDF文 ...

  5. 使用PyMuPdf提取、删除及替换PDF中的图片文件

    有时候想把PDF中的图片文件提取出来,身为程序员的我当然是自己写段代码来实现,先看看了网上的方法,都是逐行遍历,正则匹配来提取什么的,其实没有那么复杂,PyMuPdf官方文档里自带就有提取图片文件的方 ...

  6. 使用5.0.0版本的cssbox将html文件转为图片文件,并解决字体显示问题

    使用5.0.0版本的cssbox将html文件转为图片文件,并解决字体显示问题 1. 引入依赖 2. 编写Util类 3. 调用Util 4. 存在的问题 5. 解决字体不兼容问题 6. 官方文档 在 ...

  7. 打包部署后无法读取jar包里的文件(实测可行,Java中读取jar包中的文件)

    打包部署后无法读取jar包里的文件 Java中读取jar包中的文件 linux中无法读取jar包中的内容(windows可以的!),如何解决 一.背景 项目中免不了需要读取文件,如果文件用绝对路径读取 ...

  8. 图片加水印的简单方法

    图片加水印的简单方法~许多小伙伴都习惯在需要对外发布的图片上添加水印,添加水印后就不必担心图片被盗用或被用于其它不良目的,给我们造成不好的影响.然而,许多用户不知道如何为图片添加水印,也不知道应该选择 ...

  9. java开发常用jar包_java开发常用jar包

    mail.jar与activation.jar 里面包含了activation.jar和mail.jar两个包.通过里面的类的调用便可以达到发送电子邮件的目的 commons-beanutils.ja ...

  10. “java程序打成jar包 如何处理第三方jar包”

    eclipse的export的 runnable jar file 导出的jar包的形式应该可以避免这个问题,直接想所依赖的jar里的class文件也一并打入jar包里了. 问题一: 现在有一j2se ...

最新文章

  1. 号召一下,看有多少人能响应!
  2. Object类解析(简)
  3. Transact-SQL语言类型
  4. 大牛熬夜整理,京东网易滴滴,天津农行软开java面试题合集,大牛已于上个月入职华为!
  5. 能量信号、功率信号及能量谱、功率谱
  6. 二十一世纪计算|洪小文:帮助机器和人类共同学习
  7. day6--面向对象初识
  8. 论strpos 的正确使用方式
  9. snark/stark-friendly hash函数
  10. 完整简洁的Oracle获得汉字字符串拼音首字母和全拼的函数
  11. 华为云Classroom聚焦人才数字化转型,引领智慧教育改革新模式
  12. 基于web的家庭理财系统
  13. 2021CCPC桂林游记
  14. 四旋翼动力学和仿真翻译(Quadcopter Dynamics and Simulation)
  15. 能ping通工作组计算机 无法访问,能ping通却不能访问共享解决办法(亲测菜鸟版).doc...
  16. Bellhop 海底地形起伏条件下的传播特性
  17. nike blazer schweiz hinter dem Handtuch
  18. 工业互联网将给中国制造业怎样的未来?
  19. AdobePhotoshopCS快捷键
  20. joyful pandas第1章 Pandas基础

热门文章

  1. 2023慕尼黑上海电子展盛大开幕
  2. Symbian OS:线程编程中文版(转)
  3. 自动完成淘宝618活动任务:使用autojs脚本代码轻松实现
  4. git commit提交报错
  5. Unity内置的3D字体调节清晰
  6. python 字符串转换,如:IloveYOUmoreTHANiCANsay=I love you more than i can say`
  7. 【设计模式】工厂方法模式Factory(Java)
  8. 【图像去噪】基于中值、均值、维纳、小波多种滤波实现图像去噪含Matlab源码
  9. 互联网的春天才刚刚开始
  10. 单点登录--Day10