主要使用的是wkhtmltopdf
的Python封装——pdfkit
。
安装
Install python-pdfkit:
Install wkhtmltopdf:
1 2 3 4
| Debian/Ubuntu: sudo apt-get install wkhtmltopdf Redhat/CentOS sudo yum intsall wkhtmltopdf
|
使用
一个简单的例子:
1 2 3 4
| import pdfkit pdfkit.from_url('http://google.com', 'out.pdf') pdfkit.from_file('test.html', 'out.pdf') pdfkit.from_string('Hello!', 'out.pdf')
|
你也可以传递一个url或者文件名列表:
1 2
| pdfkit.from_url(['google.com', 'yandex.ru', 'engadget.com'], 'out.pdf') pdfkit.from_file(['file1.html', 'file2.html'], 'out.pdf')
|
也可以传递一个打开的文件:
1 2
| with open('file.html') as f: pdfkit.from_file(f, 'out.pdf')
|
如果你想对生成的PDF作进一步处理, 你可以将其读取到一个变量中:
1 2
| pdf = pdfkit.from_url('http://google.com', False)
|
你可以制定所有的 wkhtmltopdf . 你可以移除选项名字前面的 ‘–‘ .如果选项没有值, 使用None, False or * 作为字典值:
1 2 3 4 5 6 7 8 9 10 11
| options = { 'page-size': 'Letter', 'margin-top': '0.75in', 'margin-right': '0.75in', 'margin-bottom': '0.75in', 'margin-left': '0.75in', 'encoding': "UTF-8", 'no-outline': None }
pdfkit.from_url('http://google.com', 'out.pdf', options=options)
|
默认情况下, PDFKit 将会显示所有的 wkhtmltopdf 输出. 如果你不想看到这些信息,你需要传递一个 quiet 选项:
1 2 3 4 5
| options = { 'quiet': '' }
pdfkit.from_url('google.com', 'out.pdf', options=options)
|
由于wkhtmltopdf的命令语法 , TOC 和 Cover 选项必须分开指定:
1 2 3 4 5 6 7
| toc = { 'xsl-style-sheet': 'toc.xsl' }
cover = 'cover.html'
pdfkit.from_file('file.html', options=options, toc=toc, cover=cover)
|
当你转换文件、或字符串的时候,你可以通过css选项指定扩展的 CSS 文件。
1 2 3 4 5 6 7
| css = 'example.css' pdfkit.from_file('file.html', options=options, css=css)
css = ['example.css', 'example2.css'] pdfkit.from_file('file.html', options=options, css=css)
|
你也可以通过你的HTML中的meta tags传递任意选项:
1 2 3 4 5 6 7 8 9 10 11
| body = """ <html> <head> <meta name="pdfkit-page-size" content="Legal"/> <meta name="pdfkit-orientation" content="Landscape"/> </head> Hello World! </html> """
pdfkit.from_string(body, 'out.pdf') #with --page-size=Legal and --orientation=Landscape
|
配置
每个API调用都有一个可选的参数。这应该是pdfkit.configuration()
API 调用的一个实例. 采用configuration
选项作为初始化参数。可用的选项有:
1 2
| wkhtmltopdf ——wkhtmltopdf 二进制文件所在的位置。默认情况下pdfkit 会尝试使用which (在类UNIX系统中) 或 where (在Windows系统中)来判断. meta_tag_prefix — pdfkit的前缀指定 meta tags(元标签) – 默认情况是pdfkit-
|
示例 :针对wkhtmltopdf不在系统路径中(不在$PATH里面):
1 2
| config = pdfkit.configuration(wkhtmltopdf='/opt/bin/wkhtmltopdf')) pdfkit.from_string(html_string, output_file, configuration=config)
|
问题
IOError: 'No wkhtmltopdf executable found':
确保 wkhtmltopdf 在你的系统路径中($PATH), 会通过 configuration进行了配置 (详情看上文描述)。 在Windows系统中使用where wkhtmltopdf
命令或在linux
系统中使用 which wkhtmltopdf
会返回 wkhtmltopdf
二进制可执行文件所在的确切位置.
IOError: 'Command Failed'
如果出现这个错误意味着 PDFKit不能处理一个输入。你可以尝试直接在错误信息后面直接运行一个命令来查看是什么导致了这个错误 (某些版本的 wkhtmltopdf会因为段错误导致处理失败)。
正常生成,但是出现中文乱码确保两项:
- 你的系统中有中文字体
- 在html中加入
下面是我随便写的一个HTML表格:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| <html> <head><meta charset="UTF-8"></head> <body> <table width="400" border="1"> <tr> <th align="left">Item....</th> <th align="right">1</th> </tr> <tr> <td align="left">衣服</td> <td align="right">$241.10</td> </tr> <tr> <td align="left">化妆品</td> <td align="right">$30.00</td> </tr> <tr> <td align="left">食物</td> <td align="right">$730.40</td> </tr> <tr> <th align="left">tOTAL</th> <th align="right">$1001.50</th> </tr> </table> </body> </html>
|