使用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相关推荐

  1. python批量pdf转word,python批量实现Word文件转换为PDF文件

    本文为大家分享了python批量转换Word文件为PDF文件的具体方法,供大家参考,具体内容如下 1.目的 通过万能的Python把一个目录下的所有Word文件转换为PDF文件. 2.遍历目录 作者总 ...

  2. 仿百度文库方案[openoffice.org 3+swftools+flexpaper](三) 之 使用JODConverter将office文档转换为pdf...

    第三步,使用JODConverter将office文档转换为pdf JODConverter是一个java的OpenDucument文件转换器,可以进行许多文件格式的转换,它利用 OpenOffice ...

  3. 电子书格式怎么在线转换为PDF格式

    电子书格式怎么在线转换为PDF格式,现在很多朋友喜欢用PDF格式的电子书,因为其有纸质书的排版和格局,但实际生活中出现的最多的是TXT等格式的电子书,那如何将其进行转换成PDF格式的呢,下面就由小编来 ...

  4. jquery将html转为pdf文件,通过Jquery将HTML Div转换为PDF

    我试图将我的div转换为PDF. 这是我的HTML代码: 我可以下载它很好,但我想在PDF文件中显示Div浮动:左边与Div Float对齐:右边. function run() { var pdf ...

  5. 使用PHP将HTML + CSS转换为PDF? [关闭]

    关闭. 这个问题是题外话 . 它当前不接受答案. 想改善这个问题吗? 更新问题 ,使其成为Stack Overflow 的主题 . 3年前关闭. 我有一个HTML(不是XHTML)文档,可以在Fire ...

  6. Python批量将ppt转换为pdf

    这是一个Python脚本,能够批量地将微软Powerpoint文件(.ppt或者.pptx)转换为pdf格式 使用说明 1.将这个脚本跟PPT文件放置在同一个文件夹下 2.运行这个脚本 代码如下: i ...

  7. java openoffice 打印_java调用openoffice将office系列文档转换为PDF的示例方法

    前导: 发过程中经常会使用java将office系列文档转换为PDF, 一般都使用微软提供的openoffice+jodconverter 实现转换文档. openoffice既有windows版本也 ...

  8. 将SmartForms转换为PDF保存到本地

    将SmartForms转换为PDF保存到本地 *&---------------------------------------------------------------------* ...

  9. python pdf报告_Python实现html转换为pdf报告(生成pdf报告)功能示例

    本文实例讲述了Python实现html转换为pdf报告(生成pdf报告)功能.分享给大家供大家参考,具体如下: 1.先说下html转换为pdf:其实支持直接生成,有三个函数pdfkit.f 安装pyt ...

最新文章

  1. 重磅!华为牵手顶尖985大学
  2. 算法的复杂度与Master定理
  3. 如何查看jinja2模板的上級_如何使用Python的Flask和谷歌app Engine来构建一个web app...
  4. [包计划] node-fs-extra
  5. Java内存配太大导致fullgc_记一次因为短命大对象导致fullGC的问题
  6. 计算机公式or,【转载】 odds、OR和RR的计算公式和实际意义
  7. 如何在TensorFlow中通过深度学习构建年龄和性别的多任务预测器
  8. DB-Engines 2019 年度数据库出炉:MySQL 成为年度数据库赢家
  9. java 参数内存释放_JNI创建变量和释放变量
  10. python爬虫 入门+进阶_python爬虫入门到进阶(三)
  11. 经典机器学习系列(十四)PAC-Learning
  12. 360安全卫士加速球误关闭某个应用软件
  13. Java教程:Java分割字符串(spilt())
  14. 国家集训队论文分类整理
  15. python中repr方法_理解Python中的repr()函数 - 程序园
  16. Arduino应用开发——LCD显示GIF动图
  17. 洛谷P3647 [APIO2014] 连珠线 题解
  18. node linux cache补释放,linux下释放cache内存
  19. 怎么访问到别人的电脑?
  20. VLDB‘22 HiEngine极致RTO论文解读

热门文章

  1. contentprovider数据获取
  2. Android 面试题之ContentProvider使用+实例
  3. k8s_day07_03
  4. Blast生成蛋白质序列位置特异性矩阵-PSSM矩阵详细版
  5. Android音频系统之一音频基础
  6. Unity3D下实现Linux平台RTMP推流(以采集Unity窗体和声音为例)
  7. Unity IAP iOS 内购以及获取交易收据进行验证
  8. 多视图几何——变换层次总结(射影变换,仿射变换,相似变换,欧式变换)
  9. 解决uefi模式安装Linux无引导问题
  10. 计算机软考证书英文名称全翻译