LF Tip: 从HTML文件生成PDF

ArticleCategory:

Applications

AuthorImage:[Here we need a little image from you]

[Photo of the Author]

TranslationInfo:[Author + translation history. mailto: or http://homepage]

original in en Guido Socher

en to zh_CN SEVEN

AboutTheAuthor:[A small biography about the author]

以前我们说希望Linuxfocus的文章能用PDF格式的文件存放并让大家下载。 作为回应我们收到好多的建议并把它们总结成了这个tip。感谢所有的建议。

Abstract:

这是一个小技巧,从现在开始,LinuxFocus每月都会至少提供一个这样的技巧。 如果你有有关这些小技巧的新想法,请发邮件到:guido(at)linuxfocus.org。

ArticleIllustration:

mozilla firefox

ArticleBody:

简介

你可能已经看到我们已经把所有使用ISO8859-1字符集的文章转换成PDF文件了。 这是很不容易实现的。特别是因为我们想自动生成它们而又不想它们与对应的HTML 文件有所不同。

下面就是现在我们怎样使用一系列的选项生成PDF文件的一些经验。

思想

所有的Linux系统都有ghostscript工具ps2pdf。它工作的非常好并且生成的PDF文件也非常漂亮。 换句话说如果我们使用postscript文件管理我们的文档,我们就总是能够生成PDF文件。

整个Linux打印系统都是基于postscript的,所以这项工作应该很容易?! 但问题是我们必须寻找一个使用命令行脚本的方法。 因为我想假设有几千个文件需要打印的话你肯定不想用鼠标一直点下去。

如果你不关心表格、颜色和图像的话,那么命令组合“lynx -dump .... | nenscript”肯定是可以的。 但如果你想要表格或者图像,那就继续往下看。

候选项

html2ps

这是一个perl脚本。我们进行测试的版本号是html2ps 1.0 beta3。 它的主页是http://user.it.uu.se/~jan/html2ps.html
该程序工作的相当好。但它需要依赖好多perl模块并且在处理含有表格的页面时会有些问题。 如果你的页面布局比较简单的话这还是一个很好的选择。

Latex

有一个Latex到PDF的转换工具。你可以先使用xslt将HTML转为Latex。 但要使用它你的HTML必须有正确的语法结构。当然你可以使用Tidy工具来完成:
HTML --(tidy)--> XHTML --(XSLT)--> Latex --(pdflatex)--> PDF
因为我发现xslt和Latex太过于笨重和复杂,所以对此没有进行深入研究。

远程控制Web浏览器

如果我们可以对web浏览器进行远程控制的话我们就可以生成跟你通常从浏览器里看到的一模一样的PDF。 问题是我们需要X11显示,而这不大可能由cron-job来执行的。

Mozilla项目增强了打印和显示功能,但是去除了一些在netscape communicator中存在的一些远程控制特性。 下面的解决方案只有使用communicator 4.x才能工作。
netscape -noraise -remote "openurl(http://somepage)"
sleep(10) # there is no way to know if the page is completely loaded
          # so we just wait a bit
          # 我们无法知道页面是否已经装载完毕,所有只好等一会儿了
netscape -noraise -remote saveas(somepage.ps,PostScript)
sleep(10)
ps2pdf somepage.ps
有些读者告诉我说他们认为在konqueror中使用远程打印也是可能的,但没有人提供一个可行的解决方案。

htmldoc

Htmldoc是一个写得很好的工具(http://www.htmldoc.org/)。 下面的命令可以得到我们需要的结果(非常完美):
htmldoc -t pdf -webpage -f file.pdf file.html
我们使用版本1.8.24,它做的非常完美。唯一的问题是无论我们在Htmldoc中使用何种压缩选项, 它生成的PDF都会比任何其他的解决方案生成的文件平均大10倍。 如果你有几千个文档那肯定是个大问题。

结论Conclusion

我们现在结合使用netscape远程控制和Htmldoc。 由于Htmldoc生成的文件太大,我们不能仅仅指望它。 如果你有关于该主题进一步的解决方案请给我们发邮件。