pdf文件和图片文件水印添加java方法及jar包
在开发中,很多客户要求对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包相关推荐
- java调用pdfbox转pdf文件为图片文件,有中文时在windows上正常,部署到linux下乱码
最近遇到了一个很头疼的问题,我们的项目移动端需要一个读pdf的功能,但是手机端开发人员说移动端是用jquerymobile做的,不能直接甩pdf文件过去(原因是pdf文件太大),于是乎我们想到了2个解 ...
- Office文档上传后实时转换为PDF格式_图片文件上传后实时裁剪_实现在线预览Office文档
Office文档上传后实时转换为PDF格式_图片文件上传后实时裁剪 前置条件 安装LibreOffice 安装OpenOffice 安装Unoconv 安装ImageMagick.x86_64 安装G ...
- python pdf删除图片_使用PyMuPdf提取、删除及替换PDF中的图片文件
有时候想把PDF中的图片文件提取出来,身为程序员的我当然是自己写段代码来实现,先看看了网上的方法,都是逐行遍历,正则匹配来提取什么的,其实没有那么复杂,PyMuPdf官方文档里自带就有提取图片文件的方 ...
- PDF文件转图片怎么弄?这个方法值得收藏
PDF文件是一种广泛使用的文件格式,其保留了原始文档的格式和内容,使其在不同平台上具有高度的兼容性.然而,在某些情况下,我们需要将PDF文件转换为图片格式以便于处理和分享.本文将介绍两种方法将PDF文 ...
- 使用PyMuPdf提取、删除及替换PDF中的图片文件
有时候想把PDF中的图片文件提取出来,身为程序员的我当然是自己写段代码来实现,先看看了网上的方法,都是逐行遍历,正则匹配来提取什么的,其实没有那么复杂,PyMuPdf官方文档里自带就有提取图片文件的方 ...
- 使用5.0.0版本的cssbox将html文件转为图片文件,并解决字体显示问题
使用5.0.0版本的cssbox将html文件转为图片文件,并解决字体显示问题 1. 引入依赖 2. 编写Util类 3. 调用Util 4. 存在的问题 5. 解决字体不兼容问题 6. 官方文档 在 ...
- 打包部署后无法读取jar包里的文件(实测可行,Java中读取jar包中的文件)
打包部署后无法读取jar包里的文件 Java中读取jar包中的文件 linux中无法读取jar包中的内容(windows可以的!),如何解决 一.背景 项目中免不了需要读取文件,如果文件用绝对路径读取 ...
- 图片加水印的简单方法
图片加水印的简单方法~许多小伙伴都习惯在需要对外发布的图片上添加水印,添加水印后就不必担心图片被盗用或被用于其它不良目的,给我们造成不好的影响.然而,许多用户不知道如何为图片添加水印,也不知道应该选择 ...
- java开发常用jar包_java开发常用jar包
mail.jar与activation.jar 里面包含了activation.jar和mail.jar两个包.通过里面的类的调用便可以达到发送电子邮件的目的 commons-beanutils.ja ...
- “java程序打成jar包 如何处理第三方jar包”
eclipse的export的 runnable jar file 导出的jar包的形式应该可以避免这个问题,直接想所依赖的jar里的class文件也一并打入jar包里了. 问题一: 现在有一j2se ...
最新文章
- 号召一下,看有多少人能响应!
- Object类解析(简)
- Transact-SQL语言类型
- 大牛熬夜整理,京东网易滴滴,天津农行软开java面试题合集,大牛已于上个月入职华为!
- 能量信号、功率信号及能量谱、功率谱
- 二十一世纪计算|洪小文:帮助机器和人类共同学习
- day6--面向对象初识
- 论strpos 的正确使用方式
- snark/stark-friendly hash函数
- 完整简洁的Oracle获得汉字字符串拼音首字母和全拼的函数
- 华为云Classroom聚焦人才数字化转型,引领智慧教育改革新模式
- 基于web的家庭理财系统
- 2021CCPC桂林游记
- 四旋翼动力学和仿真翻译(Quadcopter Dynamics and Simulation)
- 能ping通工作组计算机 无法访问,能ping通却不能访问共享解决办法(亲测菜鸟版).doc...
- Bellhop 海底地形起伏条件下的传播特性
- nike blazer schweiz hinter dem Handtuch
- 工业互联网将给中国制造业怎样的未来?
- AdobePhotoshopCS快捷键
- joyful pandas第1章 Pandas基础