Java实现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 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);

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

  以上就是解决方案。

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-11-10 00:03:49

Java实现HTML页面转PDF解决方案的相关文章

JavaScript+Java实现HTML页面转为PDF文件保存的方法_javascript技巧

需求是一个导出pdf的功能,多方奔走终于实现了,走了不少弯路,而且怀疑现在这个方法仍是弯的. 有个jsPDF 插件可以在前端直接生成pdf,很简便,但不支持IE. 前端: 首先引入  html2canvas.js html2canvas(document.body, { //截图对象 //此处可配置详细参数 onrendered: function(canvas) { //渲染完成回调canvas canvas.id = "mycanvas"; // 生成base64图片数据 var

100分求java语言程序设计进阶篇pdf

问题描述 求java语言程序设计进阶篇pdf 解决方案 解决方案二:同求啊!!!解决方案三:这个网上是没有的,我也在网上找过,我建议你去网上找java核心技术<上下卷>pdf这本书写的也是不错的,,这个网上有电子书的,,这两本书配合着java编程思想,相当的不错的解决方案四:真正的进阶是需要项目练习的,纸上得来终觉浅解决方案五:引用2楼xinzailiulei的回复: 这个网上是没有的,我也在网上找过,我建议你去网上找java核心技术<上下卷>pdf这本书写的也是不错的,,这个网上

windows-怎么使用JAVA在window下将PDF转换为HTML

问题描述 怎么使用JAVA在window下将PDF转换为HTML 网上看了很多工具比如xpdf,pdftoHTML,但自己研究了几天也不得要领,也没有找到一篇完整有效的教程,希望有人能帮我讲一下,感激不尽 解决方案 package cn.spring.test.htmltopdf; import java.io.File;import java.io.FileOutputStream;import java.io.OutputStream; import org.xhtmlrenderer.pd

java 生成静态页面

问题描述 哥们 ....谁写过java 生成静态页面给个思路 问题补充:<div class="quote_title">guoxu0514 写道</div><div class="quote_div">用过freemarker吗?<br />用之类的模板引擎,很简单的</div><br /><br />没用过...<br />有demo没... 解决方案 用过freem

pdf页面尺寸-pdf文件尺寸,vc6怎么读取?

问题描述 pdf文件尺寸,vc6怎么读取? 各位大神,在vc6里怎样打开一个pdf文件,读取它的页面尺寸? 解决方案 http://blog.csdn.net/dragoo1/article/details/39520381 解决方案二: 参考:http://bbs.csdn.net/topics/240015528 http://bbs.csdn.net/topics/380235565 http://blog.sina.com.cn/s/blog_5922b64101011s3d.html

struts action取数-Java Struts2 框架页面传参问题

问题描述 Java Struts2 框架页面传参问题 strut2 中 可以在action中 将页面参数封装成对象 如果我的对象包括属性对象 的集合(List) 要怎么配置才能自动封装呢 解决方案 把页面参数封装成对象,这是有限制的.一般只能封装成含有基本数据类型属性的对象,集合类型需要自己去单独处理. 解决方案二: 需要怎么处理呢 或者能否给我一个其他的思路 怎么处理 相同name 的标签传的值呢 谢谢 解决方案三: 需要怎么处理呢 或者能否给我一个其他的思路 怎么处理 相同name 的标签传

java 编程-如何用java在后台页面开发一个计时器

问题描述 如何用java在后台页面开发一个计时器 主要用于考试系统计时,时间结束,页面自动提交到服务器求各位大神帮忙讲一下,我是一个初学者,谢谢大家了! 解决方案 直接前台获取js的倒计时就可以了,但是保险一点的话,后台也可以同时计时,通知前台自动提交试卷. 解决方案二: 客户端轮询服务器时间,到点提交就可以了. 解决方案三: 用JS做定时器就行了 var s = 59;//用来记录秒,因为需求是从59开始的. var m = residueTime-1;//用来记录分钟 var w = set

图片-java中刷新页面后怎么保留addClass样式

问题描述 java中刷新页面后怎么保留addClass样式 就是这种效果,鼠标点击后打勾,现在页面刷新后打勾就没了,是不是可以存在cookie里,具体怎么实现,请各位高手帮忙 解决方案 既然是add上去的,那刷新页面也应该走那个js去add啊 解决方案二: ready之后再add上去 解决方案三: 记录到Cookie中,页面加载 的时候去读取加载:或者使用HTML5的本地存储: 解决方案四: 放到cookie里后在js初始化方法中添加样式呀 解决方案五: $(function(){ $("#预览

关于java代码调用页面中javascript代码

问题描述 关于java代码调用页面中javascript代码,如何调用,这方面的参考资料,各位能否推荐下?... 解决方案 解决方案二:为什么要调用页面中的那些代码?如果你把层次分的很清楚,就不存在这些问题.解决方案三:有的时候,实现一个功能,javascript更方便,java代码只要调用一下就可以,解决方案四:importnetscape.javascript.JSObject;JSObjectwindow=null;window=JSObject.getWindow(this);windo