上一篇《天善博客内容如何转成PDF文档》介绍了如何从html生成pdf的原理,
不过wkhtmltopdf有限制,文档多了,需要生成多个pdf文件,原来使用http://www.pdfmerge.com/在线服务合并文档。
感觉不完美,合并更多文件就比较麻烦了,找了一些工具最终解决了,生成的pdf见<天善用户的博客内容合集PDF>。
当然程序还有些欠缺:
1.uft8的文件名在linux能使用,到windows下就软乱码了。
2.wkhtmltopdf读取html遇到503错误,需要再次检查和重新读取。
测试了PyPDF2、pdftk、ghostscript,都能合并,不过PyPDF2、pdftk对wkhtmltopdf生成的文档的outline合并有问题,特别是PyPDF2需要修改代码,才能完成合并。
最后还是用了ghostscript,才完成。
相关工具版本要求:
ghostscript:9.19
wkhtmltopdf:0.12.3 (with patched qt)
ghostscript的安装使用:
下载:
http://ghostscript.com/download/gsdnld.html
帮助文档:
http://www.ghostscript.com/doc/9.19/Use.htm
命令示例:
gs-919-linux_x86_64 -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=./output/all_coffee.pdf coffee1_20.pdf coffee21_40.pdf
linux_x86_64 -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=all_seng.pdf seng*.pdf
PyPDF2的安装使用:
PyPDF2版本:1.25.1
https://pypi.python.org/pypi/PyPDF2/1.25.1
或
https://github.com/mstamy2/PyPDF2
安装:
pip install PyPDF2
使用示例:
from PyPDF2 import PdfFileMerger
merger = PdfFileMerger()
input1 = open("hql_1_20.pdf", "rb")
input2 = open("hql_21_40.pdf", "rb")
merger.append(input1)
merger.append(input2)
# Write to an output PDF document
output = open("hql_all.pdf", "wb")
merger.write(output)
--------------------
注意合并wkhtmltopdf系统会出错:
PdfReadError: Unexpected destination '/__WKANCHOR_2'
#fix PyPDF2 merge outline出问题的解决
#参考https://github.com/mstamy2/PyPDF2/issues/193
pdf.py 1225-1226按如下屏蔽即可
# if destination found, then create outline
if dest:
if isinstance(dest, ArrayObject):
outline = self._buildDestination(title, dest)
elif isinstance(dest, Str) and dest in self._namedDests:
outline = self._namedDests[dest]
outline[NameObject("/Title")] = title
#### else:
#### raise utils.PdfReadError("Unexpected destination %r" % dest)
return outline
pdftk的安装使用:
安装:
sudo yum install libgcj
sudo rpm -i pdftk-2.02-1.*.rpm
使用:
pdftk a1*.pdf cat output combined.pdf
outline的手工修复:
pdftk支持outline的编辑,可以参考这个,
http://stackoverflow.com/questions/2969479/merge-pdfs-with-pdftk-with-bookmarks
pdftk hql_1_20.pdf dump_data > in1.info
#手工修改in1.info文件
pdftk hql_1_20.pdf update_info in1.info output out.pdf.