JAVA实现 PDF转换 常用工具类(html转PDF、PDF添加页码、PDF文件下载、PDF添加印章或者水印)可直接使用

package com.bestvike.util;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfPageEvent;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;
import org.apache.logging.log4j.core.util.FileUtils;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Objects;
import java.util.UUID;public  class PDFUtil {public static HttpServletResponse setPdfResponse(HttpServletResponse response) {response.setCharacterEncoding("utf-8");response.setContentType("application/pdf");return response;}public static void printLetter(String filepath, OutputStream outputStream){FileInputStream inputStream = null;try {File file = new File(filepath);inputStream = new FileInputStream(file);byte[] data = new byte[(int)file.length()];inputStream.read(data);outputStream.write(data);outputStream.flush();} catch (Exception e) {e.printStackTrace();} finally {try {if (Objects.nonNull(outputStream)) {outputStream.close();}if (Objects.nonNull(inputStream)) {inputStream.close();}} catch (IOException e) {e.printStackTrace();}}}public static void htmlToPdf(String htmlContent, String filePath )  throws Exception {FileUtils.mkdir(new File(filePath).getParentFile(), true);try (OutputStream fileStream = new FileOutputStream(filePath)) {ITextRenderer textRenderer = new ITextRenderer();ITextFontResolver fontResolver = textRenderer.getFontResolver();String agreementBody = htmlContent;agreementBody = agreementBody.replace(" ", " ");agreementBody = agreementBody.replace("–", "–");agreementBody = agreementBody.replace("—", "—");agreementBody = agreementBody.replace("‘", "‘");agreementBody = agreementBody.replace("’", "’");agreementBody = agreementBody.replace("‚", "‚");agreementBody = agreementBody.replace("“", "“");agreementBody = agreementBody.replace("”", "”");agreementBody = agreementBody.replace("„", "„");agreementBody = agreementBody.replace("′", "′");agreementBody = agreementBody.replace("″", "″");agreementBody = agreementBody.replace("‹", "‹");agreementBody = agreementBody.replace("›", "›");agreementBody = agreementBody.replace("‾", "‾");agreementBody = agreementBody.replace("×", "×");agreementBody = agreementBody.replace("·", "·");agreementBody = agreementBody.replace("€", "€");textRenderer.setDocumentFromString(agreementBody, null);
//            fontResolver.addFont(fontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);String path = PDFUtil.class.getClassLoader().getResource("./dianziqianzhang/").getPath();fontResolver.addFont(path+"simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//            fontResolver.addFont("C:/Windows/Fonts/SimSun.ttc", com.itextpdf.kernel.pdf.PdfName.IdentityH.getValue(), false);
//            fontResolver.addFont("C:/Windows/Fonts/SimSun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
//            fontResolver.addFont("C:/Windows/Fonts/SimHei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
//            fontResolver.addFont("C:/Windows/Fonts/SimKai.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
//            fontResolver.addFont("C:/Windows/Fonts/Arial.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);textRenderer.layout();textRenderer.createPDF(fileStream, true);}catch (Exception e){throw e;}}//PDF文件添加页码//给PDF文件添加页码public static String addPageNum (String orgPdfPath, String outputPdfPath) throws IOException, DocumentException {// 输出文件流FileOutputStream fos = new FileOutputStream(outputPdfPath);// 新建文档,默认A4大小Document document = new Document(PageSize.A4);PdfWriter writer = PdfWriter.getInstance(document, fos);// 设置页面监听事件,必须在open方法前writer.setPageEvent((PdfPageEvent) new PageNumPdfPageEvent());document.open();// PDF内容体PdfContentByte pdfContent = writer.getDirectContent();// 读取 源PDF文件,进行一页一页复制,才能触发 添加页码的  页面监听事件PdfReader reader = new PdfReader(orgPdfPath);// 获取 源文件总页数int num = reader.getNumberOfPages();
//        System.out.println("总页数:" + num);// 页面数是从1开始的boolean pageEmpty = false;for (int i = 1; i <= num; i++) {document.newPage();// 设置空页码进行展示
//            if(i < 4){
//                pageEmpty = true;
//            }writer.setPageEmpty(pageEmpty);document.setPageCount(num);PdfImportedPage page = writer.getImportedPage(reader, i);System.out.println("宽度:"+page.getWidth());System.out.println("高度:"+page.getHeight());// 复制好的页面,添加到内容去,触发事件监听pdfContent.addTemplate(page, 0, 0);}document.close();reader.close();File file = new File(orgPdfPath);// 读取if(file.exists()){file.delete();}writer.close();return outputPdfPath ;}/*** 为PDF文件添加页码(已生成的pdf文件)*/public static class PageNumPdfPageEvent extends PdfPageEventHelper{public void onEndPage(PdfWriter writer, Document document) {try {// PDF文档内容PdfContentByte pdfContent = writer.getDirectContent();pdfContent.saveState();pdfContent.beginText();int footerFontSize = 12 ;int pageFontSize = 8 ;// 解决页码中文无法显示 或者 显示为乱码的问题// 但是必须引入jar包 itext-asian-5.2.0.jarBaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);String path = PDFUtil.class.getClassLoader().getResource("./dianziqianzhang/").getPath();BaseFont bf = BaseFont.createFont(path+"STSONG.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);Font fontDetail = new Font(bf, pageFontSize, Font.NORMAL);pdfContent.setFontAndSize(baseFont, footerFontSize);// 页脚的页码 展示String footerNum = "";
//                if(writer.getCurrentPageNumber() > 3){footerNum = String.format(String.format("第%d页", writer.getCurrentPageNumber())+"/共%d页",document.getPageNumber());
//                }Phrase phrase = new Phrase(footerNum, fontDetail);// 页码的 横轴 坐标 居中float x = ( document.left() + document.right() ) / 2 ;// 页码的 纵轴 坐标float y = document.bottom(-10) ;// 添加文本内容,进行展示页码ColumnText.showTextAligned(pdfContent, Element.ALIGN_CENTER, phrase, x, y, 0);pdfContent.endText();pdfContent.restoreState();} catch (Exception e) {e.printStackTrace();}}}//pdf文件下载public static void pdfFileDownload(String PdfFilePath, HttpServletResponse response){try {File file = new File(PdfFilePath);response.setCharacterEncoding("utf-8");String fileName = file.getName();String fileType = fileName.substring(fileName.lastIndexOf(".") + 1);response.reset();if (fileType.equals("doc") || fileType.equals("docx") || fileType.equals("xls") || fileType.equals("xlsx")) {response.addHeader("content-type","application/x-msdownload");} else {response.addHeader("content-type","text/html");}response.addHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(fileName, "utf-8") + "\"");int fileLength = (int) file.length();response.setContentLength(fileLength);/*如果文件长度大于0*/if (fileLength != 0) {InputStream inStream = new FileInputStream(file);byte[] buf = new byte[4096];ServletOutputStream servletOS = response.getOutputStream();int readLength;while (((readLength = inStream.read(buf)) != -1)) {servletOS.write(buf, 0, readLength);}inStream.close();servletOS.close();}response.setStatus(HttpServletResponse.SC_OK);response.flushBuffer();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/*** pdf添加印章* @param urljPG* @param urlPdf*/public static String addSignetForPdf(String urljPG, String urlPdf , int page , float percentX , float percentY , float percentW , float percentH  ) throws Exception {// 获取去除后缀的文件路径String fileName = urlPdf.substring(0, urlPdf.lastIndexOf("."));//把截取的路径,后面追加四位随机数String tempPdf = fileName + UUID.randomUUID() + ".PDF";File file = new File(urlPdf);file.renameTo(new File(tempPdf));//替换成新的pdfPdfReader reader = null;try {reader = new PdfReader(tempPdf, "PDF".getBytes());//加了水印后要输出的路径PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(urlPdf));Rectangle pageSize = reader.getPageSize(page);float height = pageSize.getHeight();//当前页码的高度float width = pageSize.getWidth();//当前页码的宽度// 插入水印Image img = Image.getInstance(Base64Utils.decode(urljPG));float a = width*percentW;float b = height*percentH;//印章位置img.setAbsolutePosition(percentX*width,  height-height*(percentY)-b);//印章大小img.scaleAbsolute(a,b);//长PdfContentByte under = stamp.getOverContent(page);//插入页//添加电子印章under.addImage(img);stamp.close();reader.close();// 关闭//关闭}  catch (Exception e) {throw new Exception("增加买受人盖章时出现错误:"+e.getMessage());}return tempPdf;}public static String addWaterForPdf(String urljPG, String urlPdf ) throws Exception {// 获取去除后缀的文件路径String fileName = urlPdf.substring(0, urlPdf.lastIndexOf("."));//把截取的路径,后面追加四位随机数String tempPdf = fileName + UUID.randomUUID() + ".pdf";File file = new File(urlPdf);file.renameTo(new File(tempPdf));//替换成新的pdfPdfReader reader = null;try {reader = new PdfReader(tempPdf, "PDF".getBytes());//加了水印后要输出的路径PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(urlPdf));int pageSizeToal = reader.getNumberOfPages();for(int i =1;i<=pageSizeToal;i++ ){Rectangle pageSize = reader.getPageSize(i);float height = pageSize.getHeight();//当前页码的宽度高度float width = pageSize.getWidth();//当前页码的宽度高度// 插入水印byte[] bytes = Base64Utils.decode(urljPG);Image img = Image.getInstance(bytes);//印章位置img.setAbsolutePosition(0, 0);//印章大小img.scaleAbsoluteHeight(height);//长img.scaleAbsoluteWidth(width);//宽PdfContentByte under = stamp.getUnderContent(i);//添加电子印章under.addImage(img);}stamp.close();reader.close();// 关闭//File file1 = new File(tempPdf);if(file1.exists()){file1.delete();}}  catch (Exception e) {throw new Exception("增加买受人盖章时出现错误"+e.getMessage());}return tempPdf;}}

JAVA实现 PDF转换 常用工具类(html转PDF、PDF添加页码、PDF文件下载、PDF添加印章或者水印)相关推荐

  1. (转)JAVA 十六个常用工具类

    (转)JAVA 十六个常用工具类 一. org.apache.commons.io.IOUtils closeQuietly 关闭一个IO流.socket.或者selector且不抛出异常.通常放在f ...

  2. java inputtools_Java后台开发常用工具类

    本文涉及的工具类部分是自己编写,另一部分是在项目里收集的.工具类涉及数据库连接.格式转换.文件操作.发送邮件等等.提高开发效率,欢迎收藏与转载. 数据库连接工具类 数据库连接工具类--仅仅获得连接对象 ...

  3. java中操作时间的常用工具类

    在开发中经常会遇到操作时间类的业务,虽然代码部分并不算难,但为了今后查找和使用方便,现将常用的几种操作时间的工具类代码予以罗列,以便今后参考: 下面直接上代码,难度不大,诸位小伙伴可自行参考,酌情使用 ...

  4. java 生成随机md5_Java常用工具类(计算MD5,验证码随机生成,天数差值计算)

    写这个博文的目的是为了怕哪天自己的电脑崩溃了,以前写的那些代码就没了,所以将自己写的工具类贴出来,方便以后去使用,也避免自己反复去创造轮子, 也可以对这些方法进行简单修改来完成业务需求,这样就可以极大 ...

  5. 工具类系列---【金融常用工具类】

    工具类代码 import java.math.BigDecimal; import java.text.DecimalFormat;/*** 金融常用工具类*/ public class NumFor ...

  6. JAVA常用工具类(实用高效)

    JAVA常用工具类(根据GITHUB代码统计) 从Google你能搜索到大量的关于Struts,Spring,Hibernate,iBatis等比较大的框架的资料,但是很少有人去关注一些小的工具包,但 ...

  7. java file ip_java常用工具类 IP、File文件工具类

    本文实例为大家分享了java常用工具类的具体实现代码,供大家参考,具体内容如下 IP工具类 package com.jarvis.base.util; import java.io.IOExcepti ...

  8. Java常用工具类StringUtils的常用方法

    Java常用工具类StringUtils的常用方法 1.该工具类是用于操作Java.lang.String类的. 2.StringUtils类在操作字符串是安全的,不会报空指针异常,也正因此,在操作字 ...

  9. java常用工具类和Hutool常用的工具类整理

    java常用工具类和Hutool常用的工具类整理 1.java常用工具类 1.1 Scanner类 /*** Scanner 类*/@Testpublic void testScanner() {Sc ...

最新文章

  1. STM32分类及命名方法
  2. console vue 打包之后怎么去掉_Vue Cli 3 打包配置--自动忽略 console.log 语句
  3. c# rar压缩解压缩
  4. Java 图标logo的由来
  5. HDB3码编码C语言实现
  6. 产品运营是什么,如何做产品运营?
  7. python求周长_计算任何三角形的周长[python 3]
  8. SPSS实现系统聚类
  9. 物联网概念火热,靠技术如何落地?
  10. 计算机中汉字的顺序有什么排列,汉字演变过程的时间排序是什么?
  11. c# MouseClick和MouseDown的区别
  12. esxi6.0虚拟机克隆及跨版本克隆
  13. ul和ol的区别以及经验总结
  14. ubuntu20.04 基本配置记录 安装 搜狗输入法 QQ 微信
  15. 模拟Android内存不足 activity回收 值保存 状态恢复
  16. EAS BOS 单据开发下拉列表监听方法
  17. 超声波测距模块(51单片机)
  18. Oracle 数据库中 同义词的意思
  19. 上海“SlPA赫本时代”开展 飞利浦电视倾情助阵
  20. 索尼常务董事:绩效主义毁了索尼

热门文章

  1. 自动阅读 到底 能不能赚钱
  2. 测试工具开发手把手教程
  3. 计算机四级office试题及答案,2014年计算机一级ms office试题及答案 47
  4. TBS1072B数字示波器波形截图流程
  5. 弟子规5:冬则温 夏则清 晨则省 昏则定
  6. SpringBoot核心注解
  7. 8421码、5421码、2421码及余三码
  8. 电脑上的ofd格式文件如何打开呢_OFD格式的文件怎么打开预览?,来充电吧
  9. Linux系统把图标放到桌面
  10. ---- 招聘之数据结构 ----