转换HTML内容为PDF格式

浏览:39日期:2023-02-14
内容: 为网页提供PDF文件支持概要在这篇文章里,Nick Afshartous描述了一种把HTML的内容转换为PDF格式的方法。这种方法相当有用,比如说,一个web程序可以在它的页面上提供如“下载为PDF的功能。这种功能方便了打印和储存,以供日后使用。Afshartous的转换方法只使用开源的组件。也有一些商业产品可供使用。因此,在这篇文章里描述的这种方法既在价格上可以承担,又能够获得所用组件的源码。把网页内容以PDF的格式呈献有利于内容的传播。在一些应用中,提供格式便于打印的文档是一个必需的功能,比如员工利益表等。事实上,法律规定Summmary Plan Descriptions(SPDs)必须能够打印,即使它们是在线提供的也是如此。然而只打印网页本身是不够的,因为打印格式必包含表格内容和页码。为了提供这样的功能,开发人员可以把HTML内容转换为PDF格式。在此即做介绍。这里介绍的这种方法只使用开源组件。一些商业产品也支持动态的文档生成,比如说Adobe,它有Document Server产品线。但是,使用商业产品的开销是相当可观的。使用开源方案可以缓解开销的问题,并增加了组件源码的透明度。转换过程包含以下三步:1.把HTML转换为XHTML;2.把XHTML转换为XSL-FO(Extensible Stylesheet Language Formatting Objects扩展样式表语言格式化对象)。这里使用XSL样式表和XSLT转换器;3.把XSL-FO文档传递给格式化程序来生成目标PDF文档。本文先介绍怎样用命令行界面来做这种转换,然后介绍怎样在JAVA中使用DOM接口来做同样的工作。组件版本:本文中的代码在以下版本中进行了测试:组件 版本JDK 1.5_06JTidy r7-devXalan-J 2.7FOP 0.20.5版权声明:任何获得Matrix授权的网站,转载时请务必保留以下作者信息和链接作者:Nick Afshartous;rainy14f(作者的blog:http://blog.matrix.org.cn/page/rainy14f)原文:http://www.javaworld.com/javaworld/jw-04-2006/jw-0410-html.htmlMatrix:http://www.matrix.org.cn/resource/article/44/44489_HTML+PDF.html关键字:HTML;PDF使用命令行界面在转换过程中的每一步都包含了从一个输入文件生成输出文件的过程。这个过程可以用下图来表示: 使用这三个工具的命令行界面开始我们的工作是个好方法,尽管这种方法并不适合产品级的系统,因为它需要往磁盘中写入临时的中间文件。这种额外的I/O会导致性能的降低。稍后,在我们用JAVA来调用这三个工具时,这个问题就会得到解决。第一步:转换HTML为XHTML第一步就是把HTML转换为一个新的XHTML文件。当然,如果文件本来已经就是XHTML,那就不需要这一步了。我用JTidy来完成这个转换。JTidy是Tidy HTML解析器的JAVA版本。在转换的过程中,JTidy会自动添加缺少的标签来创建格式良好(well-formed)的XML文档。我用的是在SourceForge上的最新版本r7-dev。可以用以下的脚本来运行JTidy:#/bin/shjava -classpath lib/Tidy.jar org.w3c.tidy.Tidy -asxml $1>$2此脚本设置了CLASSPATH并调用了JTidy。运行时,要输入的文件是以命令行参数的形式传给JTidy。默认情况下,生成的XHTML将被输出到标准输出设备。-modify开关可以用来覆写输入文件。-asxml开关把JTidy的输出重定向到格式良好的XML。调用时像这样:tidy.sh hello.html hello.xmlhello.html(输入)和hello.xml(输出)的内容如下:

Hello World!

是JTidy自动添加的[译注1]。第二步:转换XHTML为XSL-FO[译注2]下面,XHTML将被转换为XSL-FO,一种用来为XML文档指定打印格式的语言。我通过用XSLT转换器(Apache Xalan)处理XSL样式表来完成这个转换。我使用的样式表是由Antenna House提供的xhtml2fo.xsl。Antenna House是一个出售XSL-FO上商用格式程序的公司。xhtml2fo.xsl样式表指定了如何把每个HTML标签翻译成相应的XSL-FO格式化命令序列。举例来说,HTML中的H2标签在翻译中被定义为:[code] 在处理的过程中,每次遇到H2标签,以上XSLT模板都会被调用。html:前缀表明H2标签是HTML的命名空间(namespace)。样式表的命名空间在顶层xsl:stylesheet指示符的属性中被指定。在xhtml2fo.xsl的最顶层,我们可以看到它指定了三个命名空间,分别对应于XSL,XSL-FO和HTML语言。 ...模板中的第二行 致使fo:block标签被输出,并且H2的属性被生成为fo:block标签的属性和值。每个XSL-FO块(block)都是一段文字,它们的格式基于块的属性的值。H2的属性在样式表中被定义为: 10mm 10mm 1em 0.5em x-large bold black start-indent及其后的属性用来指定H2块的格式化后的外观。当你想改变PDF文档中用同样HTML标签的文字块的外观时,使用属性集可以使这种改变更加容易。只要改动属性的设置,那么输出的文件中所有使用这些属性的地方都会被改动。下一个指示符调用一个名为'process-common-attributes-and-children'的模板: 这个模板在样式表中被指定。它的作用是检查一些普通的HTML属性(如lang,id,align,valign,style)并生成相应的XSL-FO指示符。要触发对嵌在顶层H2标签中的任意标签的翻译,process-common-attributes-and-children会调用: 因此,如果输入是 Hello there 那么在H2的模板中的就会触发用来翻译标签的模板。翻译H2标签的输出是:
相关文章: