PDF转换库 WeasyPrint 使用指南

By 刘志军 , 2020-12-25, 分类: python

pdf , python

最近发现一个新的库 WeasyPrint , 经过一番测试效果非常不错,无论是从官方网站的介绍还是提供的文档,看得出作者应该是花了不少心思来做这件事。

安装简单,使用方便。不像pdfkit调用的都是wkhtmltopdf提供的指令,而 WeasyPrint 是一个原生的Python项目,所以特别适合做Python定制开发,当然,它也需要依赖其它第三方库。

安装

WeasyPrint 能在 Linux, macOS and Windows 多平台支持,因为WeasyPrint需要依赖cairo, Pango 和 GDK-PixBuf ,所以这些软件需要独立安装,而 WeasyPrint 可以直接通过pip安装。

Mac

brew install python3 cairo pango gdk-pixbuf libffi

Window

Windows的安装要稍微麻烦些, 主要是安装 GTK+ 这个库,下载地址: https://github.com/tschoonj/GTK-for-Windows-Runtime-Environment-Installer/releases/download/2020-11-22/gtk3-runtime-3.24.23-2020-11-22-ts-win64.exe

安装WeasyPrint

pip install WeasyPrint

不出意外的话,你现在就可以使用WeasyPrint这个工具了。执行weasyprint命令, 指定要转换的url地址和pdf文件名即可。 我们随便指定一个URL地址

weasyprint https://foofish.net/base64.html  base64.pdf

最后生成的效果图

微信截图_20201223131958.png

这就完了吗?

肯定不是,如果只是单纯的转换一个网页,直接用浏览器的打印功能,然后另存为PDF就可以了。没必要绕个这么大的弯子来做这件事。

我们希望用它来做自动化、批量化、个性化的任务。例如一次将几十个html链接转换成PDF,或者每个html页面我还想加一些自定义的内容进去等等。

要实现这些东西,我们首先要熟悉WeasyPrint的几个概念。

构建HTML对象

生成PDF文件前,首先需要构建一个HTML对象,HTML对象可以通过url链接、文件路径,或者是HTML文档字符串指定

from weasyprint import HTML

HTML(filename='../foo.html')

HTML(url='http://weasyprint.org')

HTML(string='''
    <h1>The title</h1>
    <p>Content goes here
''')

生成pdf文件只需要调用html对象的write_pdf方法

一个最简单的例子:

from weasyprint import HTML
HTML('https://foofish.net/base64.html').write_pdf('base64.pdf')

你还可以自定义样式

from weasyprint import HTML, CSS
HTML('https://foofish.net/base64.html').write_pdf('base64.pdf',
    stylesheets=[CSS(string='body { font-family: serif !important }')])

当然不仅可以生成PDF,也可以生成PNG图片, 只需要调用 html.write_png("filename.png")。

Document对象

此外,HTML对象的render()方法返回一个document对象,通过docuemnt对象可以拿到所有页码(page)数据,这样你就可以获取指定页的数据来生成PDF或者将多个HTML的document对象合并成一个PDF文件。

例如,将每页单独生成一张图片

html1 = HTML("https://foofish.net/base64.html")
document = html1.render()
for i, page in enumerate(document.pages):
    document.copy([page]).write_png('page_%s.png' % i)

微信截图_20201223145602.png

例如:将两个链接整个生成一个PDF文件

html1 = HTML("https://foofish.net/base64.html")
html2 = HTML("https://foofish.net/python-wsgi.html")
pages = []
pages.extend(html1.render().pages)
pages.extend(html2.render().pages)
HTML(string="").render().copy(pages).write_pdf("foofish.pdf")

微信截图_20201223150754.png

更多实用方法可以参考文档。

如果本文对你有帮助,请帮忙给我一个小小的赞,谢谢


关注公众号「Python之禅」,回复「1024」免费获取Python资源

python之禅

猜你喜欢

2016-12-07
好玩的Python彩蛋
2023-04-15
如何删除macOS系统默认的Python2.7并替换成最新版python3.11
2017-10-29
Python每日一题:第1题
2017-12-26
5个酷毙的Python工具
2019-11-21
自己动手写个"狗屁不通"文章生成器
2014-02-10
python 函数式编程处理函数:map(),filter(),reduce()
2014-03-26
斐波那契数列(Fibonacci)递归与非递归的性能对比
2022-08-17
如何利用多态干掉 if else 语句
2017-07-19
如何正确理解@classmethod与@staticmethod
2017-12-26
用 Python 处理 HTML 转义字符