wkhtmltopfd python包装器,使用webkit呈现引擎和qt将html转换为pdf

pdfkit的Python项目详细描述


https://travis-ci.org/JazzCore/python-pdfkit.png?branch=masterhttps://badge.fury.io/py/pdfkit.svg

Python2和3 WKHTMLTOPDF实用程序的包装器,用于使用WebKit将HTML转换为PDF。

这是ruby PDFKit库的改编版本,非常感谢他们!

安装

  1. 安装python pdfkit:

    $ pip install pdfkit
    
  2. 安装wkhtmltoppdf:

  • debian/ubuntu:

    $ sudo apt-get install wkhtmltopdf
    

警告!debian/ubuntu repos中的版本减少了功能(因为它在编译时没有wkhtmltopfd qt补丁),例如添加大纲、页眉、页脚、目录等。要使用这些选项,您应该从wkhtmltopdf站点安装静态二进制文件,或者可以使用this script

  • windows和其他选项:检查wkhtmltopdfhomepage中的二进制安装程序

用法

对于简单的任务:

import pdfkit

pdfkit.from_url('http://google.com', 'out.pdf')
pdfkit.from_file('test.html', 'out.pdf')
pdfkit.from_string('Hello!', 'out.pdf')

您可以传递包含多个URL或文件的列表:

pdfkit.from_url(['google.com', 'yandex.ru', 'engadget.com'], 'out.pdf')
pdfkit.from_file(['file1.html', 'file2.html'], 'out.pdf')

您还可以传递打开的文件:

with open('file.html') as f:
    pdfkit.from_file(f, 'out.pdf')

如果您希望进一步处理生成的pdf,可以将其读取到变量:

# Use False instead of output path to save pdf to a variable
pdf = pdfkit.from_url('http://google.com', False)

您可以指定所有wkhtmltopdfoptions。您可以在选项名称中删除“-”。如果选项没有值,请使用none、false''作为dict值:。对于可重复选项(包括allow、cookie、自定义头、post、postfile、run script、replace),可以使用列表或元组。对于需要多个值的选项(例如-自定义头授权密钥),我们可以使用2元组(参见下面的示例)。

options = {
    'page-size': 'Letter',
    'margin-top': '0.75in',
    'margin-right': '0.75in',
    'margin-bottom': '0.75in',
    'margin-left': '0.75in',
    'encoding': "UTF-8",
    'custom-header' : [
        ('Accept-Encoding', 'gzip')
    ]
    'cookie': [
        ('cookie-name1', 'cookie-value1'),
        ('cookie-name2', 'cookie-value2'),
    ],
    'no-outline': None
}

pdfkit.from_url('http://google.com', 'out.pdf', options=options)

默认情况下,pdfkit将显示所有wkhtmltopdf输出。如果不需要,则需要传递quiet选项:

options = {
    'quiet': ''
    }

pdfkit.from_url('google.com', 'out.pdf', options=options)

由于wkhtmltoppdf命令语法,必须分别指定toccover选项。如果您在目录前需要封面,请使用cover_first选项:

toc = {
    'xsl-style-sheet': 'toc.xsl'
}

cover = 'cover.html'

pdfkit.from_file('file.html', options=options, toc=toc, cover=cover)
pdfkit.from_file('file.html', options=options, toc=toc, cover=cover, cover_first=True)

使用css选项转换文件或字符串时,可以指定外部css文件。

警告这是wkhtmltoppdf中this bug的解决方法。您应该首先尝试–用户样式表选项。

# Single CSS file
css = 'example.css'
pdfkit.from_file('file.html', options=options, css=css)

# Multiple CSS files
css = ['example.css', 'example2.css']
pdfkit.from_file('file.html', options=options, css=css)

您还可以通过HTML中的元标记传递任何选项:

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调用的实例。它将配置选项作为初始参数。可用选项有:

  • wkhtmltopdf-二进制文件wkhtmltopdf的位置。默认情况下,pdfkit将尝试使用which(在unix类型系统上)或where(在windows上)来定位此文件。
  • meta_tag_prefix-特定于pdfkit元标记的前缀-默认情况下为pdfkit-

示例-例如当wkhtmltopdf不在$PATH

config = pdfkit.configuration(wkhtmltopdf='/opt/bin/wkhtmltopdf')
pdfkit.from_string(html_string, output_file, configuration=config)

故障排除

  • IOError: 'No wkhtmltopdf executable found'

    确保您的$path中有wkhtmltopdf,或通过自定义配置进行设置(请参阅前面的部分)。where wkhtmltopf在windows中,或where wkhtmltopf在linux上应该返回二进制文件的实际路径。

  • IOError: 'Command Failed'

    此错误表示pdfkit无法处理输入。您可以尝试直接从错误消息中运行命令,并查看导致失败的错误(在某些WKHTMLTOPDF版本中,这可能是由于分段错误引起的)

更改日志

  • 0.6.1
    • 在尝试解码PDF输出时修复Python3+上的回归
  • 0.6.0
    • 支持可重复选项
    • 对某些选项支持多个值
    • 当需要特定的参数顺序时,修复一些角点情况
    • 一些python 3+兼容性修复程序
    • 更新自述文件
  • 0.5.0
    • 允许传递多个css文件
    • 修复外部文件编码的问题
    • 在*nix系统上缺少x服务器时引发错误s
    • 修复最新wkhtmltopdf版本中断的测试
    • 更新自述文件
  • 0.4.1
    • 更轻松的自定义配置设置
    • 更新自述文件
  • 0.4.0
    • 允许传递类似文件的对象
    • 能够将pdf作为字符串返回
    • 允许用户指定配置
    • api调用现在在成功时返回true
    • 错误修复
  • 0.3.0
    • python 3支持
  • 0.2.4
    • 添加历史记录
    • 更新setup.py
  • 0.2.3
    • 用setup.py修复安装问题
    • 更新自述文件

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java:不解析XML的简单XML。例外   KIE Workbench的java自定义UI   java将元素从bucket移动到LinkedList,但有一个元素被完全删除   如何将java stream collect转换为scala   java运行AsynkTask多次不工作   java组织。xml。萨克斯。SAXParseException:cvccomplextype。2.4.c:匹配的通配符是严格的   java是一种计算排序算法所需时间的合适方法   java在O(logn)时间内对排序整数数组中具有相同数字的数字进行计数   xpages从当前数据库javaAgent调用另一个数据库的javaAgent   java如何在instagram中上传特定位置的所有照片   JavaApachePOI可以有效地删除多个列   java创建的对象数   java我可以在关闭连接时关闭Oracle JDBC自动提交吗?