由于工作所需,最近花时间研究了html转换为pdf的功能。html转换为pdf的关键技术是如何处理网页中复杂的css样式,通过在网上收集资料,发现目前html 转换为pdf的解决方案主要分为三类:

  • 客户端模式:前后台调用客户端程序,利用客户端程序的功能完成pdf文件转换。本次测试工具有:wkhtmltopdf和PhantomJS。
  • java jar包解析类模式:java代码解析css样式,翻译html文件为pdf文件。本次测试类有:IText,Flying Sauser,PD4ML。
  • js 前端解析模式:js前端解析html文件为pdf文件,本次测试案例有:html2canvas。

本次针对网上介绍的方案,结合实际项目的需求,做一一测试,在性能和功能方面做如下分析。

1.测试页面介绍

通过查看各个转换案例在网上的介绍,简单的html样式,一般的表格样式在做pdf文件转换时,以上的方案均支持。但考虑到实际业务的需要,本次测试特意用到了bootstrap (v 3.3.6)的css样式,同时页面也应用了css3的新特性。基于这样的新特性编写一个静态的html页面,html页面在浏览器中的展示效果如下:

2.wkhtmltopdf测试

wkhtmltopdf是一个使用webkit网页渲染引擎开发的用来将html转成 pdf的工具,可以跟多种脚本语言进行集成来转换文档。官网地址 http://wkhtmltopdf.org/

技术特点:Wkhtmltopdf可以直接把浏览器中浏览的网页转换成一个pdf,他是一个把html页面转换成pdf的软件(需要安装在服务器上)。使用时可通过java代码调用cmd指令完成网页转换为pdf的功能。

功能测试:直接在cmd里输入测试指令,可查看处理进度。

第一个参数:wkhtmltopdf.exe所在的路径

第二个参数:需要转换为pdf的html页面

第三个参数:pdf文件路径及文件名

页面导出效果如下:

测试说明:

通过测试发现,wkhtmltopdf对bootstap的CSS样式整体支持较好。对css3的新特性如圆形图片样式支持行不好。部分页面样式会失效。对于图表展示,eachart图表导出程序会报错,不支持。不过echart有图表转换为图片的接口,可通过获取图片地址的方式导出到pdf中。

3.PhantomJS测试

PhantomJS是一个基于webkit内核的无头浏览器,即没有UI界面,即它是一个浏览器,只是其内的点击、翻页等人为相关操作需要程序设计实现。它提供javaScript API接口,即通过编写JS程序可以直接与webkit内核交互,在此之上可以结合java语言等,通过java调用js等相关操作,从而解决了以前c/c++才能比较好的基于webkit开发优质采集器的限制。它同时提供windows、linux、mac等不同os的安装使用包,也就是说可以在不同平台上二次开发采集项目或是自动项目测试等工作。官网地址http://phantomjs.org/

PhantomJS可做网页分析,功能很多,本次仅调用网页的截图功能。在cmd中的测试如下:

测试页面导出效果如下:

测试说明:

通过测试发现,PhantomJS对bootstap的样式支持较好。对css3的新特性如圆形图片样式支持行不好。部分页面样式会失效。对于echart图表展示,也可直接导出。效果如下:

3.IText和Flying Sauser

IText实现html2pdf,速度快,纠错能力差,支持中文(要求HTML使用unicode编码),但中支持一种中文字体,开源。Flying Sauser实现html2pdf,纠错能力差,支持多种中文字体(部分样式不能识别),开源。

技术特点:基于java编程将html的css样式做解析处理,目前仅对较简单的页面和样式支持。对于css3的样式和关联复杂的css样式兼容性极差。当页面内容较长时,处理时间慢。参考地址:https://code.google.com/archive/p/flying-saucer/

测试结果:本实验的测试页面无法出来,普通的测试页面效果如下:

测试说明:

通过测试发现,IText和Flying Sauser这两个开源项目对css3的兼容性基本不行,通过查阅资料,发现这种技术比较陈旧,这个开源项目现在也没有更新和维护了。对于简单表格,统计数据的导出,更新的技术有bootstrap table,easyui datagrid表格导出。网上介绍的这种方案不建议使用。

4.PD4ML测试

PD4ML是纯Java的类库,使用HTML、CSS作为页面布局和内容定义格式来生成PDF文档的强大工具,可以简化最终用户生成PDF的工作。参考网站:http://www.pd4ml.com

该软件的优点是:

  • 支持的HTML标签、CSS属性较全,转换失真比较小,可以使用HTML+CSS实现精确的布局控制。
  • 对网页文件标签、CSS语法错误的容错性比较好。
  • 对不用额外的控制,就支持图片的转化输出。

该软件的缺点是:

  • 不开源,最新的demo版本,下载测试以后,发现不支持中文转换。必须购买商业版本才可以。(这里很坑,测试乱码问题通不过,后面发现是本来就不支持)。
  • 破解后的一些旧版本可以解决乱码问题,但是支持的css样式没有新版本的全。

测试结果:

测试说明:

新版本的中文乱码,但是支持部分css样式。老版本的破译后,界面的样式兼容性差,对bootsrtap的支持性低,就基本的可以出一个数据,展示图片没有问题。考虑到是收费软件,并且性能也不够完善,对于普通页面可采用模板导出或其他的工具导出,不建议使用。

5.html2canvas测试

html2canvas是一个相当不错的JavaScript类库,它使用了html5和css3的一些新功能特性,实现了在客户端对网页进行截图的功 能。html2canvas通过获取页面的DOM和元素的样式信息,并将其渲染成canvas图片,从而实现给页面截图的功能。它不需要来自服务器任何渲染,整张图片都是在客户端浏览器创建。当浏览器不支持Canvas时,将采用Flashcanvas或 ExplorerCanvas技术代替实现。以下浏览器能够很好的支持该脚本:Firefox 3.5+, Google Chrome, Opera新的版本, IE9以上的浏览器。因为每个浏览器渲染页面的方式都不尽相同,所以生成的图片也不太一样。虽然它目前还是处理开发阶段,但还是很值得期待的。这个插件依赖于jQuery插件,建议使用最新版的。

  • 不支持跨域图片
  • 不能在浏览器插件中使用
  • 部分浏览器上不支持SVG图片
  • 不支持Flash
  • 不支持ifream(可修改js原始代码,支持ifream)

本次使用html2canvas做测试时,发现很多项目页面可正常截图,包括echart图表。仅对少量css3的新特性不支持。在截图效果上面较好。但是在测试应用时,发现了一个致命的问题,当页面模块调用html2canvas截图后,发现原来页面的部分css突然失效。跟踪分析后,发现是html2canvas的js函数处理它不能识别的css样式。特别是对隐藏和显示的模块,支持不友好。

页面截图效果如下:

但是原有页面的css失效,页面出现异常,隐藏的部分样式,显示的样式展示混乱。

测试说明:

通过测试发现,html2canvas对bootstap的样式支持较好。对css3的新特性如圆形图片样式支持行不好。它的主要优点是轻前端,对于改变原有页面的样式问题,可先导出图片后,重新刷新一次页面。

6.总结

通过对以上案例的测试,网上介绍的常用html转换为pdf的方法,大多数就是简单的html转换可用,但是在实际应用中,还是存在诸多问题,难以应用。通过对这些方法的实现原理分析,可得出以下结论:

  • html网页完整转换为pdf,所有的方案均有不足。若只是部分表单页面,html样式尽量不采用css3的属性,可用客户端模式和html2canvas处理。
  • html前端样式发展快,css3新特性效果好,css定义了新的规则,语法。IText和Flying Sauser这样的java转换类根本兼容不了这些变化,因为无法及时写出转换的函数,并且这些开源项目是较老的技术,后期的开源团队已经停止维护和更新了。
  • PD4ML本质也是java处理css的样式转换,他是商业软件,在兼容css3方面有团队支持,相对IText和Flying Sauser在性能和功能方面都更强大。但对少部分css样式也支持不好。并且中文乱码问题解决也不便。
  • 针对客户端浏览器内核模式,PhantomJS和wkhtmltopdf比较而言,PhantomJS更强大,截图仅仅只是其中的一个小功能,通过它还可以做网页分析,建议使用PhantomJS。
  • html2canvas的截图模式灵活,是轻量级的前端截图工具。目前来说,部分功能不全,但整体效果还不错,针对部分截图影响原页面的问题,可先截图保存成功后,在刷新一次页面,达到截图导出到pdf的效果。

7.参考链接

http://blog.csdn.net/ouyhong123/article/details/26401967

http://blog.csdn.net/tengdazhang770960436/article/details/41320079

http://www.cnblogs.com/jasondan/p/4108263.html

http://blog.csdn.net/accountwcx/article/details/46785437

http://blog.csdn.net/zdtwyjp/article/details/5769353

关于html转换为pdf案例的一些测试与思考的更多相关文章

  1. Office系列(1)---将Office文件(Word、PPT、Excel)转换为PDF文件

    需求: 将Office文件作为文章并在网页上预览,主要为(Word.PPT.Excel)3种类型文件. 研究了一下,找到了两种解决方案 直接调用微软的在线预览功能实现(预览前提:预览资源必须可以直接通 ...

  2. Java用OpenOffice将word转换为PDF

    一.      软件安装以及jar包下载 官网的下载地址如下(英文): OpenOffice 下载地址http://www.openoffice.org/ JodConverter 下载地址http: ...

  3. Java使用Openoffice将word、ppt转换为PDF

    最近项目中要实现WORD的文件预览功能,我们可以通过将WORD转换成PDF或者HTML,然后通过浏览器预览. OpenOffice OpenOffice.org 是一套跨平台的办公室软件套件,能在 W ...

  4. 通过Pdf预览Excel或者word或者Powerpoint (C#将Office转换为PDF)

    下面代码是Excel转换为PDF using System; using System.Collections.Generic; using System.Linq; using System.Web ...

  5. C#/VB.NET 将SVG图片添加到PDF、转换为PDF

    以下内容介绍在C# 程序中如何将SVG图片添加到PDF文档.以及如何将SVG图片转换为PDF文档. 一.环境准备 先下载PDF类库工具,Spire.PDF for .NET hotfix 6.5.6及 ...

  6. Office系列---将Office文件(Word、PPT、Excel)转换为PDF文件,提取Office文件(Word、PPT)中的所有图片

    将Office文件转换为PDF文件,提取Office文件中的所有图片 1.Office系列---将Office文件(Word.PPT.Excel)转换为PDF文件 1.1 基于Office实现的解决方 ...

  7. 在禅道中实现WORD等OFFICE文档转换为PDF进行在线浏览

    条件: 安装好禅道的服务器 能直接浏览PDF的浏览器(或通过 安装插件实现 ) 文档转换服务程序(建议部署在另一台服务器上)     实现 原理: 修改禅道的文件预览功能(OFFICE文档其使用的是下 ...

  8. wkhtmltopdf 将网页转换为PDF和图片

    wkhtmltopdf 是一个shell工具,它使用了WebKit渲染引擎和Qt,将网页html转换为pdf的强大工具,转换后的pdf也可以通过pdf工具进行复制.备注.修改 官网下载地址:http: ...

  9. 上传Text文档并转换为PDF(解决乱码)

    前些日子,Insus.NET有分享一篇<上传Text文档并转换为PDF>http://www.cnblogs.com/insus/p/4313092.html 它是按最简单与默认方式来处理 ...

随机推荐

  1. redis学习(1)--- NoSQL介绍

    一.NoSQL介绍 1.什么是NoSQL NoSQL = Not Only SQL 非关系型数据库 2.为什么用NoSQL High performance - 高并发读写 Huge Storage ...

  2. datatables 学习笔记1 基础篇

    本文共3部分:基本使用|遇到的问题|属性表 1.DataTables的默认配置 $(document).ready(function() { $('#example').dataTable(); } ...

  3. Webpack 代码分离

    Webpack 代码分离 代码分离是 webpack 中最引人注目的特性之一. 你可以把你的代码分离到不同的 bundle 中,然后你就可以去按需加载这些文件. 总的来说, webpack 分离可以分 ...

  4. JS语句

    JS语句包括: 1.顺序语句 2.分支语句:  if...else                   switch...case 3.循环语句 一.先看顺序语句: </body> < ...

  5. 生成淘口令发现的一个趣事 c#

    1.今天,查看网站log,发现如下报错 详细错误:未将对象引用设置到对象的实例. 报错url:http://www.94dazhe.com/mobile/goods/show-546829202052 ...

  6. 探索Windows命令行系列(3):命令行脚本基础

    1.实用功能 1.1.为脚本添加注释 1.2.控制命令的回显 1.3.使用数学表达式 1.4.向脚本传递参数 2.使用变量 2.1.变量的命名及定义 2.2.调用变量 2.3.变量的作用域 3.结构语 ...

  7. 小程序解析html标签wxPrase插件

    微信小程序的标签和原来我们习惯用的标签是不一样的,例如视图容器标签小程序是view,然而html就很多比如常用的div就和小程序的view类似. 通常我们在开发小程序(从列表页跳转到详情页)通过富文本 ...

  8. 【Android Developers Training】 100. 使用Intent修改联系人数据

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. 【Android Developers Training】 41. 向另一台设备发送文件

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  10. Windows PowerShell 默认颜色

    屏幕背景:1,36,86 屏幕文字:238,237,240 弹出文字:0,128,128 弹出窗口背景:255,255,255