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之禅

猜你喜欢

2024-03-04
Python中的 if __name__ == '__main__' 是什么?
2024-03-04
用 Python 破解隔壁老王家的 Wi-Fi 密码,刺激!
2023-06-12
Python3.12新特性
2023-04-17
Python虚拟环境使用
2023-04-15
如何删除macOS系统默认的Python2.7并替换成最新版python3.11
2022-12-09
python 中return和yield有什么区别
2022-08-17
如何利用多态干掉 if else 语句
2022-07-22
10个python初学者常犯的错误
2022-06-10
flask-siwadoc 支持openapi 分组功能
2022-06-10
在Python应用中Telegram 机器人搭建消息提醒