最近在工作中遇到了一个很囧的事情。要把HTML页面转换成PDF或者tiff图片等其他形式,目前tiff还是一头雾水,如果各位大师有真的可行的想法(不要是别人那边抄的,百度最近搜索的质量严重的打击了我对国货的信心。)希望能够告诉我,先谢了。

言归正传。所以,我就做了把HTML转换成PDF的形式。目前可以完美支持一比一转换,下面就把我的解决方案贴出来。

首先,当然是找到能够解析PDF的完美组件,百度和谷歌不约而同的告诉我们。IText是王道。而目前开源的组件中,Itext的确是一个First Choice,如果各位单纯是做把图片转成PDF或者自己写了Velocity或者FreeMarker模板生成了HTML是非常推荐直接用Itext来进行的。而如果,大家像我这样已经有前人写好了HTML页面或者懒得写FreeMarker模板的话。可以直接看下一段。

由于他们已经写好了HTML页面,而且显示已经很完美了。那我要做的就是能完美解析HTML+CSS的PDF生成工具。这时候flying-saucer进入了我的选择范围中。

http://code.google.com/p/flying-saucer/

上面是网址,这个工具托管在GoogleCode上面,作者做他们能够做下面的工作:

Flying Saucer takes XML or XHTML and applies CSS 2.1-compliant stylesheets to it, in order to render to PDF (via iText), images, and on-screen using Swing or SWT。

不难看出工作原理,就是解析XML或者XHTML并且包括css样式表,并且用Swing或者SWT的组件生成PDF的功能。这解决了页面的显示问题。IText自身的一个很严重的问题就是解析CSS有很大的问题。而这个解决了。下面就是用Flying Saucer来实现的代码:

public booleanconvertHtmlToPdf(String inputFile, String outputFile)throwsException {OutputStream os= newFileOutputStream(outputFile);     ITextRenderer renderer= newITextRenderer();     String url= newFile(inputFile).toURI().toURL().toString(); renderer.setDocument(url);//解决中文支持问题ITextFontResolver fontResolver =renderer.getFontResolver();    fontResolver.addFont("C:/Windows/Fonts/SIMSUN.TTC", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//解决图片的相对路径问题renderer.getSharedContext().setBaseURL("file:/D:/");renderer.layout();    renderer.createPDF(os);  os.flush();os.close();return true;}

上面这段代码是这样的,输入一个HTML地址URL = inputFile,输入一个要输出的地址,就可以在输出的PDF地址中生成这个PDF。

注意事项:

1.输入的HTML页面必须是标准的XHTML页面。页面的顶上必须是这样的格式:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

并且HTML页面的语法必须是非常严谨的,所有标签都必须闭合等等(由于flying-Saucer做了XML解析的工作,不严谨会报错的。),这是对页面的第一个要求。

2.要用到图片的地方写相对路径的形式,比如:

<img src="a.jpg" alt="323" width="252" height="80" />

而它的图片位置则必须在Java代码中指定。

renderer.getSharedContext().setBaseURL("file:/D:/");

也有另一种方法就是直接在<img>标签中写绝对路径。

3.Flying-Saucer在解析tiff格式的图片的时候会报错。具体原因我还没找到。希望大家能够指点我。

4.如果在页面中有中文字体的话。必须在HTML代码中的样式中写上某种字体的css,并且必须是用英文的,然后在Java代码中写上对应的文件位置。

ITextFontResolver fontResolver = renderer.getFontResolver();

fontResolver.addFont("C:/Windows/Fonts/SIMSUN.TTC", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

上面的方法是添加了宋体。也可以添加其他字体。

以上就是解决方案。

下面给出这几个包的下载地址。大家可以直接下载。



下载地址,猛点我吧!

转自:http://blog.csdn.net/jasonchris/article/details/7705631

转载于:https://www.cnblogs.com/licomeback/articles/3056492.html

Java实现HTML页面转PDF解决方案(转)相关推荐

  1. java实现html页面转pdf解决方案_[Java教程]纯js实现html转pdf

    [Java教程]纯js实现html转pdf 0 2017-02-16 00:00:30 项目开发中遇到了一个变态需求,需要把一整个页面导出为pdf格式,而且要保留页面上的所有的表格.svg图片和样式. ...

  2. java网页保存pdf_JavaScript+Java实现HTML页面转为PDF文件保存的方法

    JavaScript+Java实现HTML页面转为PDF文件保存的方法 发布于 2017-02-27 09:58:50 | 160 次阅读 | 评论: 0 | 来源: 网友投递 JavaScript客 ...

  3. java 网页保存为pdf文件怎么打开方式_js相关:JavaScript+Java实现HTML页面转为PDF文件保存的方法...

    js相关:JavaScript+Java实现HTML页面转为PDF文件保存的方法 发布于 2020-8-12| 复制链接 借助iText这个Java库,我们可以将HTML文件保存为图片文件进而转换成P ...

  4. (Java实现)HTML页面转PDF解决方案

    最近在工作中遇到了一个很囧的事情.要把HTML页面转换成PDF或者tiff图片等其他形式,目前tiff还是一头雾水,如果各位大师有真的可行的想法(不要是别人那边抄的,百度最近搜索的质量严重的打击了我对 ...

  5. java将HTML文件转化为pdf文件,如何使用Java将HTML网页转换为PDF文件

    我一直在互联网上搜索如何使用Java将HTML页面转换为PDF文件.我发现了很多指针,简而言之,它们不起作用或难以实现.我也下载了一个商业产品,pdf4ml;该API是我很乐意与之合作的,除了当我在维 ...

  6. java从页面下载pdf文件到本地

    java从页面下载pdf文件,strtus2为例,其他框架语法大致一样 直接上代码 这边我传了个参数 从数据库中查出来文件存在服务器的相对路径 页面 <button class="la ...

  7. flyingsaucer转换多个html,java - 使用FlyingSaucer将包含阿拉伯字符的HTML页面转换为PDF - 堆栈内存溢出...

    我想使用FlyingSaucer将包含阿拉伯字符的HTML页面转换为PDF文件,但生成的PDF不包含组合字符并向后打印输出. HTML: جميع الحقوق Java摘录: String inpu ...

  8. Puppeteer将动态html页面生成pdf(终极解决方案)

    开通掘金好几年一直没有写文章,近一年经常有朋友问我将动态的h5/vue/react/原生js 页面转成pdf,我觉得有必要写个文章,给大家提供一套经过多个项目验证的完整解决方案的思路:觉得有用可以点赞 ...

  9. java jsp导出pdf文件_JSP页面导出PDF格式文件

    JSP页面导出PDF格式文件基本在前端页面可以全部完成 添加下载链接的点击事件 var downPdf = document.getElementById("downLoad"); ...

最新文章

  1. 【Transact-SQL】SQL Server自动把left join自动转化为inner join、以及关联时的数据重复问题...
  2. 【iOS - 周总结】开发中遇到的小知识点(2018.12.10-2018.12.15)
  3. 指标的检测及检测仪器
  4. Node-webpack基本使用和详细案例
  5. select * 与 count(*)数量不一致_技术分享 | MySQL:count(*)、count(字段) 实现上区别
  6. 精选 | 2017年11月R新包推荐
  7. 在双屏软件中,PPT自定义动画注意事项
  8. 千万级用户的大型网站,应该如何设计其高并发架构?(彩蛋)
  9. cookie和session机制之间的区别与联系
  10. 微软手机远程桌面使用
  11. DSP 6678的NETCP
  12. 计算机四级 网络工程师 考过指南
  13. 可能是最全的h5唤起App方案
  14. 外资餐饮连锁或因产品质量影响销售额
  15. 如何用C语言画立体几何图形,立体几何图形公式大全
  16. matlab fscanf
  17. 软件 黑苹果盒盖不休眠_怎么解决苹果电脑合盖自动休眠问题?
  18. Android逐帧动画——让图片动起来
  19. 【算法leetcode】1557. 可以到达所有点的最少点数目(rust和go我都要)
  20. 前端讲义64_AngularJS鼠标与键盘事件有关指令

热门文章

  1. redis 端口_「建议收藏」手把手教你搭建redis集群
  2. 天龙八部手游linux源码,天龙八部手游登录源码
  3. python 共享内存_37. Python 多进程锁 多进程共享内存
  4. java catch自定义异常_java异常类-java自定义异常-嗨客网
  5. Redis入门,Redis的安装
  6. 轻松理解条件随机场(CRF)
  7. The constructor someMethod() is not accessible due to restriction on required library
  8. 15.try...except...finally
  9. 创建一个显示所有预定义系统颜色的ListBox
  10. Vue编写动态组件实践(render函数的使用心得)