使用pd4ml 将html转换为pdf
使用pd4ml 将html转换为pdf 遇到的几个问题,总结一下,与大家共享一下:
1 网上自带的fonts.jar不支持中文,加载进去中文乱码 , 需要修改fonts.jar,为此本人已修改好所需要的jar包(支持宋体中文simsun.ttc),链接在这。
2 pd4ml.jar,官方声明,只有pro版本支持中文,这个就比较坑了,并且带demo的在转换成PDF会有水印。
优缺点:
pd4ml相比itext,速度快,纠错能力强,支持多种中文字体,但是是商业。
IText实现html2pdf,速度快,纠错能力差(对Css,标签样式要求很高,标签不闭合都无转换),支持中文(要求HTML使用unicode编码),但中支持一种中文字体,开源。
上部分代码:
//发送业务数据;
request.setAttribute("techProtocolReview",techProtocolReview == null ?new TechProtocolReview() : techProtocolReview);//转发请求到jsp,返回解析之后的内容而不是输出到浏览器 String html = ServletUtils.forward(request,response,"/WEB-INF/views/modules/pads/machinedesign/techProtocolReviewTrsfPdfView.jsp");//System.out.println(html); StringReader strReader = new StringReader(html); try {HtmlToPdf.byte2File(HtmlToPdf.generatePDF(strReader), "E:/", "test.pdf");return new ReponseData.Builder(Constant.SUCCESS_CODE).message("页面转化PDF成功").build(); } catch (IOException e) {e.printStackTrace();logger.error("页面转PDF失败:",e);return new ReponseData.Builder(Constant.SUCCESS_CODE).message("页面转化PDF失败!失败信息:"+e.getMessage()).build(); }工具类:
附注:
WriteListener在javax.servlet 3.1.0版本中import javax.servlet.ServletOutputStream; import javax.servlet.WriteListener; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter;public class ServletUtils {public static String forward(HttpServletRequest request, HttpServletResponse response, String src) {try{//* ↓↓↓↓↓重新构造response,修改response中的输出流对象,使其输出到字节数组↓↓↓↓↓ *//* final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();final ServletOutputStream servletOuputStream = new ServletOutputStream() {@Override public void write(int b) throws IOException {byteArrayOutputStream.write(b);}public boolean isReady() {return false;}public 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);}} }
import org.apache.log4j.Logger; import org.zefer.pd4ml.PD4Constants; import org.zefer.pd4ml.PD4ML; import java.awt.Insets; import java.io.*;public class HtmlToPdf {private static final Logger LOG = Logger.getLogger(HtmlToPdf.class);public static byte[] generatePDF( StringReader strReader) throws IOException {//FileOutputStream fos = new FileOutputStream(outputPDFFile); ByteArrayOutputStream os = new ByteArrayOutputStream();PD4ML pd4ml = new PD4ML();pd4ml.setPageInsets(new Insets(5, 5, 5, 5));pd4ml.setHtmlWidth(900);pd4ml.setPageSize(PD4Constants.A4); // A4竖向显示 pd4ml.changePageOrientation(PD4Constants.A4)横向显示 //fonts.jar的配置文件中的值,用于中文乱码 pd4ml.useTTF("java:fonts", true);pd4ml.setDefaultTTFs("SimSun", "SimSun", "SimSun"); pd4ml.enableDebugInfo();pd4ml.render(strReader, os); //如果用上面的fos,就是写出到指定的文件 return os.toByteArray();}/** * 根据byte数组,生成文件 * @param bfile 文件数组 * @param filePath 文件存放路径 * @param fileName 文件名称 */ public static void byte2File(byte[] bfile,String filePath,String fileName) throws IOException {BufferedOutputStream bos=null;FileOutputStream fos=null;File file=null;File dir=new File(filePath);if(!dir.exists() && !dir.isDirectory()){//判断文件目录是否存在 dir.mkdirs();}file=new File(filePath+fileName);fos=new FileOutputStream(file);bos=new BufferedOutputStream(fos);bos.write(bfile);//FileUtils.downFile(file, request, response); if(bos != null){bos.close();}if(fos != null){fos.close();}}}
相应的pom.xml:
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope> </dependency>
使用pd4ml 将html转换为pdf相关推荐
- python批量pdf转word,python批量实现Word文件转换为PDF文件
本文为大家分享了python批量转换Word文件为PDF文件的具体方法,供大家参考,具体内容如下 1.目的 通过万能的Python把一个目录下的所有Word文件转换为PDF文件. 2.遍历目录 作者总 ...
- 仿百度文库方案[openoffice.org 3+swftools+flexpaper](三) 之 使用JODConverter将office文档转换为pdf...
第三步,使用JODConverter将office文档转换为pdf JODConverter是一个java的OpenDucument文件转换器,可以进行许多文件格式的转换,它利用 OpenOffice ...
- 电子书格式怎么在线转换为PDF格式
电子书格式怎么在线转换为PDF格式,现在很多朋友喜欢用PDF格式的电子书,因为其有纸质书的排版和格局,但实际生活中出现的最多的是TXT等格式的电子书,那如何将其进行转换成PDF格式的呢,下面就由小编来 ...
- jquery将html转为pdf文件,通过Jquery将HTML Div转换为PDF
我试图将我的div转换为PDF. 这是我的HTML代码: 我可以下载它很好,但我想在PDF文件中显示Div浮动:左边与Div Float对齐:右边. function run() { var pdf ...
- 使用PHP将HTML + CSS转换为PDF? [关闭]
关闭. 这个问题是题外话 . 它当前不接受答案. 想改善这个问题吗? 更新问题 ,使其成为Stack Overflow 的主题 . 3年前关闭. 我有一个HTML(不是XHTML)文档,可以在Fire ...
- Python批量将ppt转换为pdf
这是一个Python脚本,能够批量地将微软Powerpoint文件(.ppt或者.pptx)转换为pdf格式 使用说明 1.将这个脚本跟PPT文件放置在同一个文件夹下 2.运行这个脚本 代码如下: i ...
- java openoffice 打印_java调用openoffice将office系列文档转换为PDF的示例方法
前导: 发过程中经常会使用java将office系列文档转换为PDF, 一般都使用微软提供的openoffice+jodconverter 实现转换文档. openoffice既有windows版本也 ...
- 将SmartForms转换为PDF保存到本地
将SmartForms转换为PDF保存到本地 *&---------------------------------------------------------------------* ...
- python pdf报告_Python实现html转换为pdf报告(生成pdf报告)功能示例
本文实例讲述了Python实现html转换为pdf报告(生成pdf报告)功能.分享给大家供大家参考,具体如下: 1.先说下html转换为pdf:其实支持直接生成,有三个函数pdfkit.f 安装pyt ...
最新文章
- 重磅!华为牵手顶尖985大学
- 算法的复杂度与Master定理
- 如何查看jinja2模板的上級_如何使用Python的Flask和谷歌app Engine来构建一个web app...
- [包计划] node-fs-extra
- Java内存配太大导致fullgc_记一次因为短命大对象导致fullGC的问题
- 计算机公式or,【转载】 odds、OR和RR的计算公式和实际意义
- 如何在TensorFlow中通过深度学习构建年龄和性别的多任务预测器
- DB-Engines 2019 年度数据库出炉:MySQL 成为年度数据库赢家
- java 参数内存释放_JNI创建变量和释放变量
- python爬虫 入门+进阶_python爬虫入门到进阶(三)
- 经典机器学习系列(十四)PAC-Learning
- 360安全卫士加速球误关闭某个应用软件
- Java教程:Java分割字符串(spilt())
- 国家集训队论文分类整理
- python中repr方法_理解Python中的repr()函数 - 程序园
- Arduino应用开发——LCD显示GIF动图
- 洛谷P3647 [APIO2014] 连珠线 题解
- node linux cache补释放,linux下释放cache内存
- 怎么访问到别人的电脑?
- VLDB‘22 HiEngine极致RTO论文解读