安装

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

macOS

brew install python3 cairo pango gdk-pixbuf libffi

Windows

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

最后生成的效果图

这就完了吗?

肯定不是,如果只是单纯的转换一个网页,直接用浏览器的打印功能,然后另存为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)数据,因为一个很长的html可能很好几页,通过document对象你可以获取指定页的数据来生成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)

例如:将两个链接整个生成一个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")
作者:Jeebiz  创建时间:2023-02-15 23:49
最后编辑:Jeebiz  更新时间:2024-03-12 09:16