JAVA实现 PDF转换 常用工具类(html转PDF、PDF添加页码、PDF文件下载、PDF添加印章或者水印)
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添加印章或者水印)相关推荐
- (转)JAVA 十六个常用工具类
(转)JAVA 十六个常用工具类 一. org.apache.commons.io.IOUtils closeQuietly 关闭一个IO流.socket.或者selector且不抛出异常.通常放在f ...
- java inputtools_Java后台开发常用工具类
本文涉及的工具类部分是自己编写,另一部分是在项目里收集的.工具类涉及数据库连接.格式转换.文件操作.发送邮件等等.提高开发效率,欢迎收藏与转载. 数据库连接工具类 数据库连接工具类--仅仅获得连接对象 ...
- java中操作时间的常用工具类
在开发中经常会遇到操作时间类的业务,虽然代码部分并不算难,但为了今后查找和使用方便,现将常用的几种操作时间的工具类代码予以罗列,以便今后参考: 下面直接上代码,难度不大,诸位小伙伴可自行参考,酌情使用 ...
- java 生成随机md5_Java常用工具类(计算MD5,验证码随机生成,天数差值计算)
写这个博文的目的是为了怕哪天自己的电脑崩溃了,以前写的那些代码就没了,所以将自己写的工具类贴出来,方便以后去使用,也避免自己反复去创造轮子, 也可以对这些方法进行简单修改来完成业务需求,这样就可以极大 ...
- 工具类系列---【金融常用工具类】
工具类代码 import java.math.BigDecimal; import java.text.DecimalFormat;/*** 金融常用工具类*/ public class NumFor ...
- JAVA常用工具类(实用高效)
JAVA常用工具类(根据GITHUB代码统计) 从Google你能搜索到大量的关于Struts,Spring,Hibernate,iBatis等比较大的框架的资料,但是很少有人去关注一些小的工具包,但 ...
- java file ip_java常用工具类 IP、File文件工具类
本文实例为大家分享了java常用工具类的具体实现代码,供大家参考,具体内容如下 IP工具类 package com.jarvis.base.util; import java.io.IOExcepti ...
- Java常用工具类StringUtils的常用方法
Java常用工具类StringUtils的常用方法 1.该工具类是用于操作Java.lang.String类的. 2.StringUtils类在操作字符串是安全的,不会报空指针异常,也正因此,在操作字 ...
- java常用工具类和Hutool常用的工具类整理
java常用工具类和Hutool常用的工具类整理 1.java常用工具类 1.1 Scanner类 /*** Scanner 类*/@Testpublic void testScanner() {Sc ...
最新文章
- STM32分类及命名方法
- console vue 打包之后怎么去掉_Vue Cli 3 打包配置--自动忽略 console.log 语句
- c# rar压缩解压缩
- Java 图标logo的由来
- HDB3码编码C语言实现
- 产品运营是什么,如何做产品运营?
- python求周长_计算任何三角形的周长[python 3]
- SPSS实现系统聚类
- 物联网概念火热,靠技术如何落地?
- 计算机中汉字的顺序有什么排列,汉字演变过程的时间排序是什么?
- c# MouseClick和MouseDown的区别
- esxi6.0虚拟机克隆及跨版本克隆
- ul和ol的区别以及经验总结
- ubuntu20.04 基本配置记录 安装 搜狗输入法 QQ 微信
- 模拟Android内存不足 activity回收 值保存 状态恢复
- EAS BOS 单据开发下拉列表监听方法
- 超声波测距模块(51单片机)
- Oracle 数据库中 同义词的意思
- 上海“SlPA赫本时代”开展 飞利浦电视倾情助阵
- 索尼常务董事:绩效主义毁了索尼