java 生成pdf
参考:https://www.showdoc.cc/243234797494858?page_id=1390154181784190
引入jar包
D:\Workspaces\MyEclipse 2017 CI\ZXJY\WebRoot\WEB-INF\lib\itext-asian-5.2.0.jar
D:\Workspaces\MyEclipse 2017 CI\ZXJY\WebRoot\WEB-INF\lib\itextpdf-5.5.1.jar
D:\Workspaces\MyEclipse 2017 CI\ZXJY\WebRoot\WEB-INF\lib\xmlworker-5.5.4.jar
java实现类
package com.pro.utils;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;import org.jsoup.Jsoup;import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.Pipeline;
import com.itextpdf.tool.xml.XMLWorker;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import com.itextpdf.tool.xml.exceptions.CssResolverException;
import com.itextpdf.tool.xml.html.CssAppliers;
import com.itextpdf.tool.xml.html.CssAppliersImpl;
import com.itextpdf.tool.xml.html.Tags;
import com.itextpdf.tool.xml.parser.XMLParser;
import com.itextpdf.tool.xml.pipeline.css.CSSResolver;
import com.itextpdf.tool.xml.pipeline.css.CssResolverPipeline;
import com.itextpdf.tool.xml.pipeline.end.PdfWriterPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;public class CreatePdfDocumentUtil {/*** 根据URL提前blog的基本信息,返回结果* @param URL 例:http://localhost:8080/scm/scm/po/gather/pdftest/pdftesthtml3.html(能直接返回某个html的URL,* 我开始传url时候被struts1拦截了,应为get不到session的登录人信息,所以得到的是登录页面的html)* @return* @throws Exception*/public static String[] extractHtmlInfo(String URL) throws Exception {/*这里为什么用数组,是因为返回的时候不仅可以返回选择的html,还有从document提取其他的信息单独存在数组里返回,然后利用iText在pdf里面组装数据,可以在网上查*/String[] info = new String[1];// 直接把URL解析成document,然后调用document.html()解析为htmlorg.jsoup.nodes.Document doc = Jsoup.connect(URL).get();// 此doc.select是用来选择完整的html中某一部分这里为第一个div的css为entry的部分,所以你的html上要有div的class为entry哦org.jsoup.nodes.Element entry = doc.select("div.entry").first();info[0] = entry.html();return info;}/*** 直接通过得到html来取得想要的部分html* @param html* @return* @throws Exception*/public static String[] extractHtmlInfo2(String html) throws Exception {String[] info = new String[1];// 把html转换为documentorg.jsoup.nodes.Document doc = Jsoup.parse(html);// 此doc.select是用来选择完整的html中某一部分这里为第一个div的css为entry的部分,所以你的html上要有div的class为entry哦org.jsoup.nodes.Element entry = doc.select("div.entry").first();info[0] = entry.html();return info;}/*** 把String 转为 InputStream* @param content* @return*/public static InputStream parse2Stream(String content) {try {ByteArrayInputStream stream = new ByteArrayInputStream(content.getBytes("UTF-8"));return stream;} catch (Exception e) {return null;}}/*** 直接把网页内容转为PDF文件** @param* @throws Exception*/public static void parseURL2PDFFile(String pdfFile, String html) {try {BaseFont bfCN = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H",false);// 中文字体定义
// Font chFont = new Font(bfCN, 14, Font.NORMAL, BaseColor.BLUE);
// Font secFont = new Font(bfCN, 12, Font.NORMAL, new BaseColor(0, 204,
// 255));
// Font textFont = new Font(bfCN, 12, Font.NORMAL, BaseColor.BLACK);Document document = new Document(PageSize.A4);// 设置pdf的背景图片
// Image image = Image.getInstance("D:/移动背景图片.jpg");
// image.setAlignment(image.UNDERLYING);
// image.setAbsolutePosition(0,0);
// image.scaleAbsolute(595,842);PdfWriter pdfwriter = PdfWriter.getInstance(document,new FileOutputStream(pdfFile));pdfwriter.setViewerPreferences(PdfWriter.HideToolbar);document.open();
// document.add(image);//得到解析的htmlString[] blogInfo = extractHtmlInfo2(html);/*html文件转换为pdf文档AsianFontProvider()函数是用来解决XMLWorkerHelper.getInstance().parseXHtml()转pdf中文不显示问题*/XMLWorkerHelper.getInstance().parseXHtml(pdfwriter, document,parse2Stream(blogInfo[0]),null, new AsianFontProvider());document.close();} catch (Exception e) {e.printStackTrace();} }/*** 此forward方法执行完毕之后不会输出内容到浏览器,而是把输出到字节流,最后以字符串的形式返回* @param request* @param response* @param src* @return*/public static String forward(HttpServletRequest request, HttpServletResponse response, String src) {try{/* ↓↓↓↓↓重新构造response,修改response中的输出流对象,使其输出到字节数组↓↓↓↓↓ */final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();final ServletOutputStream servletOuputStream = new ServletOutputStream() {@Overridepublic void write(int b) throws IOException {byteArrayOutputStream.write(b);}@Overridepublic boolean isReady() {return false;}@Overridepublic void setWriteListener(WriteListener writeListener) {}};final PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(byteArrayOutputStream, "UTF-8"));response = new HttpServletResponseWrapper(response) {public ServletOutputStream getOutputStream() {return servletOuputStream;}public PrintWriter getWriter() {return printWriter;}};/* ↑↑↑↑↑↑重新构造response,修改response中的输出流对象,使其输出到字节数组↑↑↑↑↑↑ *///执行forward操作request.getRequestDispatcher(src).forward(request,response);//把字节流中的内容太转为字符串return new String(byteArrayOutputStream.toByteArray(),"utf-8");}catch (Exception e){throw new RuntimeException(e);}}/*** 把html转换成pdf,以字节数组的形式返回pdf文件* @param html* @return pdf字节数组* @throws IOException* @throws DocumentException* @throws CssResolverException*/public static byte[] html2pdf(String html) throws IOException, DocumentException,CssResolverException {Document document = new Document(PageSize.A4);ByteArrayOutputStream os = new ByteArrayOutputStream();PdfWriter writer = PdfWriter.getInstance(document,os);document.open();XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(){@Overridepublic Font getFont(String fontname, String encoding, float size, int style) {return super.getFont(fontname == null ? "宋体" : fontname, encoding, size, style);}};fontProvider.addFontSubstitute("lowagie", "garamond");fontProvider.setUseUnicode(true);//使用我们的字体提供器,并将其设置为unicode字体样式CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());CSSResolver cssResolver = XMLWorkerHelper.getInstance().getDefaultCssResolver(true);Pipeline<?> pipeline = new CssResolverPipeline(cssResolver,new HtmlPipeline(htmlContext, new PdfWriterPipeline(document,writer)));XMLWorker worker = new XMLWorker(pipeline, true);XMLParser p = new XMLParser(worker);p.parse(new InputStreamReader(new ByteArrayInputStream(html.getBytes("gbk"))));document.close();return os.toByteArray();}}
关于使用XMLWorkerHelper.getInstance().parseXHtml生成PDF时中文不显示或乱码问题
解决参考https://blog.csdn.net/gahd3000/article/details/77448877
java 生成pdf相关推荐
- java 其他文件转pdf_java 其他文件转成pdf java生成pdf
java生成pdf需要用到的包pd4ml.jar 下载地址:http://download.csdn.net/detail/yanning1314/7124741 package com.cular. ...
- java生成pdf方法_详解Java生成PDF文档方法|chu
最近项目需要实现PDF下载的功能,由于没有这方面的经验,从网上花了很长时间才找到相关的资料.整理之后,发现有如下几个框架可以实现这个功能. 1. 开源框架支持iText,生成PDF文档,还支持将XML ...
- java实现pdf的生成下载打印,java生成pdf电子账单,java生成pdf合同模板
最近公司要做个生成pdf电子账单凭证的功能,由于这个公司没有任何代码可借鉴,这个时候我就必须得自己搞明白具体的每一步应该怎么做,引什么jar包?用什么方式去实现?这篇博客中会给出从头到尾及其详细的代码 ...
- java生成PDF,各种格式、样式、水印都有
需要的JAR包链接:https://www.langhuaquan.com/asset/search/JAVA生成PDF需要的JAR包/ 原文链接:https://www.langhuaquan.co ...
- java生成PDF 导出
tip:生成pdf导出 需要的JAR包链接:https://www.hebaocun.com/asset/search/JAVA生成PDF需要的JAR包/ 原文链接:https://www.hebao ...
- iText5实现Java生成PDF文件完整版,二维码
iText5实现Java生成PDF文件完整版 vue 项目中分别使用 vue-pdf 插件和内嵌 iframe 实现 PDF 文件预览,缩放,旋转,下载,保存等功能 ? Vue打印文件(v-print ...
- Java生成PDF文档 iText使用PDF模板一
最近在弄这个java生成pdf,哎,在网上查找了各种各样的学习资料,弄了几天,今天终于把这个效果简单的弄出来,所以,也把这个,我所走过的坑,作一个记录,提供接下来需要学习的人. 参考文献文档:http ...
- java 生成 pdf html转pdf 支持 中文 自定义模板
java 生成pdf DEMO 开发过程中遇到的坑 /** * 切记 css 要定义在head 里,否则解析失败 * css 要定义字体 * 字体中英文 https://www.cnblogs.com ...
- java实现保存合同模板_java实现pdf的生成下载打印,java生成pdf电子账单,java生成pdf合同模板...
最近公司要做个生成pdf电子账单凭证的功能,由于这个公司没有任何代码可借鉴,这个时候我就必须得自己搞明白具体的每一步应该怎么做,引什么jar包?用什么方式去实现?这篇博客中会给出从头到尾及其详细的代码 ...
- Adobe Acrobat pro生成PDF模版 java生成PDF
最近做了一个关于动态生成PDF合同的需求 java生成PDF 网络上随便一搜遍有了 不要用手动在代码里面输入合同中的文字这种方式 如这样的方式 http://blog.csdn.net/justin ...
最新文章
- c#_String.Split 方法进阶篇
- c 字符串数组_redis为什么不直接使用C字符串,而要自定义简单动态字符串?
- 大话设计模式(五 体会简单工厂模式的美妙)
- 前端基础HTML5CSS3动画
- 朱江洪功成身退 朱董配解体谁主格力(图)
- ros-Qt代码环境的搭建
- 儿童吹泡泡水简单配方_最好的吹泡泡水的制作方法
- android 截屏实现的几种方式
- win10无线断开无法连接服务器,win10wifi自动断开什么原因_win10wifi自动断开且无法连接如何解决...
- ubuntu网页邮箱服务器设置,ubuntu配置邮件服务器
- 11. Flash助手推荐的弹窗广告怎么删除
- 最新爱云发卡系统源码公益版
- 深度学习基础6(微分,偏导,梯度,链式法则)
- Excel制作图表(二)--- 燃尽图
- Xposed学习笔记之蚂蚁森林能量自动收取模块
- Type parameter T has incompatible upper bounds: ViewDataBinding and FragmentBeatBoxBindin
- 思考模式:六顶思考帽(Six Thinking Hats)
- 前端搭建私有化npm库
- 在安卓的道路上铿锵前行
- 计算机发展简史的ppt教程,计算机发展简史教学文案.ppt
热门文章
- 2008年度最佳开源软件大奖
- ERC20接口下USDT代币的深入解析
- 2017年10米分辨率全球土地覆盖产品(FROM-GLC10)Python下载爬虫
- Unity如何接入应用内购In-AppPurchase
- 手机变蓝牙音响_能提升幸福感的几大3C数码配件推荐?有线变无线、居家办公神器...
- matlab 神经网络train均方误差,MATLAB搭建bp神经网络的误差特别大,但R2的值也大,求解帮我看看我的网络哪里出问题了...
- 【装机必看】CPU该怎么选
- 免费高效的Linux远程工具-MobaXterm最全图文总结
- 《Spring Cloud实战指南》快速学习路线图(2022版)
- 微信支付2.0版本,更换参数即可使用