Java实现HTML页面转PDF解决方案

标签: java html 页面 | 发表时间:2013-12-15 09:08 | 作者:flycars001
出处:http://www.iteye.com
首先,当然是找到能够解析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 boolean convertHtmlToPdf(String inputFile, String outputFile)
throws Exception {
OutputStream os = new FileOutputStream(outputFile);
ITextRenderer renderer = new ITextRenderer();
String url = new File(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);
  上面的方法是添加了宋体。也可以添加其他字体。
  以上就是解决方案。


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [java html 页面] 推荐:

Java实现HTML页面转PDF解决方案

- - Java - 编程语言 - ITeye博客
首先,当然是找到能够解析PDF的完美组件,. 而目前开源的组件中,Itext的确是一个First Choice,如果各位单纯是做把图片转成PDF或者自己写了Velocity或者FreeMarker模板生成了HTML是非常推荐直接用Itext来进行的. 而如果,大家像我这样已经有前人写好了HTML页面或者懒得写FreeMarker模板的话.

了解html页面的渲染过程

- - 博客园_首页
最近在学习前端的性能优化,有必要了解一下页面的渲染流程,以便对症下药,找出性能的瓶颈所在. 以下是我看到的一些东西,分享给大家. 参考: Understanding the renderer. 定义明确、连续、操作有序(HTML5). 当我们从网络上得到HTML的相应字节时,DOM树就开始构建了.

HTML页面实现全方位页面缓存

- - CSDN博客推荐文章
【1】服务端配置一个Filter,实现对js、css和image的缓存. 完成这一步,在服务端已经实现了对页面的缓存,但是当前情况下页面还是会每次访问服务器的,只是压力减小了. 如何让页面在一段时间内不访问服务器呢. 实现方式是对应公用的JS都放到一个页面中,别的页面包含他,在这个页面中增加页面缓存.

Java实现HTML代码生成PDF文档

- - 企业架构 - ITeye博客
1、IText实现html2pdf,速度快,纠错能力差,支持中文(要求HTML使用unicode编码),但中支持一种中文字体,开源. 2、Flying Sauser实现html2pdf,纠错能力差,支持多种中文字体(部分样式不能识别),开源. 3、PD4ML实现html2pdf,速度快,纠错能力强,支持多种中文字体,商业.

CSS3 Region:基于HTML和CSS3的富页面布局

- John - 前端观察
译自:CSS3 regions: Rich page layout with HTML and CSS3. 中文:CSS3 Region:基于HTML和CSS3的富页面布局. 请尊重版权,转载请注明来源,多谢. 互联网已经成为一个提供参考、教材、新闻、文章和交互应用的大宝库了. 然而,当为印刷设计内容时,一些功能显然仍然不可能或者很难使用Web标准来实现.

使用HTML与CSS3进行富页面布局

- - InfoQ cn
长久以来,复杂布局一直是印刷媒体的一个主要关注点. 出版物如杂志、报纸上固有的物理限制导致它们创造了非常复杂的流布局. 在这样的布局中,内容可以跨越多个列显示并且可以环绕在图片和表格周围进行编排. 布局需要能够在整个排版过程中随着内容添加和改变进行动态调整. Adobe正通过向W3C提案 CSS Regions Module与 CSS Exclusions Module,力图将该层次的布局控制引入到Web中.

怪异模式(Quirks Mode)对 HTML 页面的影响

- - Web前端 - ITeye博客
怪异模式(Quirks Mode)对 HTML 页面的影响. Quirks Mode 概述. 什么是 Quirks Mode. 简单来说,Quirks Mode 就是浏览器为了兼容很早之前针对旧版本浏览器设计、并未严格遵循 W3C 标准的网页而产生的一种页面渲染模式. 由渲染引擎产生的两种文档模式.

页面架构HTML+CSS ●▽● 各种布局各种实现

- - SegmentFault 最新的文章
(1)清除浏览器默认样式. (1)项目开发初期就定义好. (2) reset.css 在引入的时候一定要放在第一位. (3)不同的产品 reset.css不一样. 3.table合并边框间距. table { border-collapse: collapse; // 合并边框 border-spacing: 0; //边框间距.

Java实现将字符串中的html代码过滤掉的方法

- - CSDN博客推荐文章
* 将带有html代码的字符串过滤掉其中的html代码. String htmlStr = inputString; //含html标签的字符串. String regEx_script = "<[\\s]*?script[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?script[\\s]*?>"; //定义script的正则表达式{或]*?>[\\s\\S]*?<\\/script> }.

Java与Flex学习笔记----用CSS控制页面样式

- - BlogJava-首页技术区
以前对于Flex网页布局还不是很明白,基本上没有什么修饰. 但是做完了一个仿“115网盘”的页面后,对页面控制有了一个基本的了解,现总结一下.      本人一开始接触的就是Flex4,据说Flex3的css布局很脊椎,也不知道是不是这样. 但是Flex4的网页布局很牛X,再配上各种事件,可以实现需要写很多JavaScript/Ajax代码才能实现的效果.