美文网首页
python操作PDF

python操作PDF

作者: 缓慢移动的蜗牛 | 来源:发表于2020-12-23 22:53 被阅读0次

    将网页转换为pdf之前用过wkhtmltopdf这个工具,对应的python库是pdfkit,但是最终转换出来的效果总是不尽如意。

    最近发现一个新的库 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
    

    最后生成的效果图


    这就完了吗?

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

    我们之所以用它来做PDF转换肯定是希望它能够为我们实现自动化、批量化、个性化的任务。

    构建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)
    

    例如:将两个链接整个生成一个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")
    

    原文

    相关文章

      网友评论

          本文标题:python操作PDF

          本文链接:https://www.haomeiwen.com/subject/ifcpnktx.html