参考: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相关推荐

  1. java 其他文件转pdf_java 其他文件转成pdf java生成pdf

    java生成pdf需要用到的包pd4ml.jar 下载地址:http://download.csdn.net/detail/yanning1314/7124741 package com.cular. ...

  2. java生成pdf方法_详解Java生成PDF文档方法|chu

    最近项目需要实现PDF下载的功能,由于没有这方面的经验,从网上花了很长时间才找到相关的资料.整理之后,发现有如下几个框架可以实现这个功能. 1. 开源框架支持iText,生成PDF文档,还支持将XML ...

  3. java实现pdf的生成下载打印,java生成pdf电子账单,java生成pdf合同模板

    最近公司要做个生成pdf电子账单凭证的功能,由于这个公司没有任何代码可借鉴,这个时候我就必须得自己搞明白具体的每一步应该怎么做,引什么jar包?用什么方式去实现?这篇博客中会给出从头到尾及其详细的代码 ...

  4. java生成PDF,各种格式、样式、水印都有

    需要的JAR包链接:https://www.langhuaquan.com/asset/search/JAVA生成PDF需要的JAR包/ 原文链接:https://www.langhuaquan.co ...

  5. java生成PDF 导出

    tip:生成pdf导出 需要的JAR包链接:https://www.hebaocun.com/asset/search/JAVA生成PDF需要的JAR包/ 原文链接:https://www.hebao ...

  6. iText5实现Java生成PDF文件完整版,二维码

    iText5实现Java生成PDF文件完整版 vue 项目中分别使用 vue-pdf 插件和内嵌 iframe 实现 PDF 文件预览,缩放,旋转,下载,保存等功能 ? Vue打印文件(v-print ...

  7. Java生成PDF文档 iText使用PDF模板一

    最近在弄这个java生成pdf,哎,在网上查找了各种各样的学习资料,弄了几天,今天终于把这个效果简单的弄出来,所以,也把这个,我所走过的坑,作一个记录,提供接下来需要学习的人. 参考文献文档:http ...

  8. java 生成 pdf html转pdf 支持 中文 自定义模板

    java 生成pdf DEMO 开发过程中遇到的坑 /** * 切记 css 要定义在head 里,否则解析失败 * css 要定义字体 * 字体中英文 https://www.cnblogs.com ...

  9. java实现保存合同模板_java实现pdf的生成下载打印,java生成pdf电子账单,java生成pdf合同模板...

    最近公司要做个生成pdf电子账单凭证的功能,由于这个公司没有任何代码可借鉴,这个时候我就必须得自己搞明白具体的每一步应该怎么做,引什么jar包?用什么方式去实现?这篇博客中会给出从头到尾及其详细的代码 ...

  10. Adobe Acrobat pro生成PDF模版 java生成PDF

    最近做了一个关于动态生成PDF合同的需求  java生成PDF 网络上随便一搜遍有了 不要用手动在代码里面输入合同中的文字这种方式 如这样的方式 http://blog.csdn.net/justin ...

最新文章

  1. c#_String.Split 方法进阶篇
  2. c 字符串数组_redis为什么不直接使用C字符串,而要自定义简单动态字符串?
  3. 大话设计模式(五 体会简单工厂模式的美妙)
  4. 前端基础HTML5CSS3动画
  5. 朱江洪功成身退 朱董配解体谁主格力(图)
  6. ros-Qt代码环境的搭建
  7. 儿童吹泡泡水简单配方_最好的吹泡泡水的制作方法
  8. android 截屏实现的几种方式
  9. win10无线断开无法连接服务器,win10wifi自动断开什么原因_win10wifi自动断开且无法连接如何解决...
  10. ubuntu网页邮箱服务器设置,ubuntu配置邮件服务器
  11. 11. Flash助手推荐的弹窗广告怎么删除
  12. 最新爱云发卡系统源码公益版
  13. 深度学习基础6(微分,偏导,梯度,链式法则)
  14. Excel制作图表(二)--- 燃尽图
  15. Xposed学习笔记之蚂蚁森林能量自动收取模块
  16. Type parameter T has incompatible upper bounds: ViewDataBinding and FragmentBeatBoxBindin
  17. 思考模式:六顶思考帽(Six Thinking Hats)
  18. 前端搭建私有化npm库
  19. 在安卓的道路上铿锵前行
  20. 计算机发展简史的ppt教程,计算机发展简史教学文案.ppt

热门文章

  1. 2008年度最佳开源软件大奖
  2. ERC20接口下USDT代币的深入解析
  3. 2017年10米分辨率全球土地覆盖产品(FROM-GLC10)Python下载爬虫
  4. Unity如何接入应用内购In-AppPurchase
  5. 手机变蓝牙音响_能提升幸福感的几大3C数码配件推荐?有线变无线、居家办公神器...
  6. matlab 神经网络train均方误差,MATLAB搭建bp神经网络的误差特别大,但R2的值也大,求解帮我看看我的网络哪里出问题了...
  7. 【装机必看】CPU该怎么选
  8. 免费高效的Linux远程工具-MobaXterm最全图文总结
  9. 《Spring Cloud实战指南》快速学习路线图(2022版)
  10. 微信支付2.0版本,更换参数即可使用