使用Python从HTML/Javascript创建PDF,不需要任何操作系统依赖项

7
有没有办法使用Python从HTML/CSS/Javascript创建PDF文档,而不需要引入任何操作系统级别的依赖项?
似乎每个现有的解决方案都需要特殊的辅助软件,但是在审查PDF格式规范和HTML/CSS/Javascript渲染后,没有理由认为不能存在一个不需要它们的Python解决方案。一些解决方案接近,例如pyppeteer,但它仍然依赖于本地安装的无头Chrome。这些依赖关系意味着无法利用微服务,即使PDF生成似乎是可行的用例。
虽然类似的问题在SO上已经提出了很多次,但似乎没有出现过一种不必在操作系统上安装专用依赖项的可行技术。
一些类似的问题经常推荐wkhtmltopdf或者已经过时(例如将PDF打印支持移出Chrome现在已死): 如果我错过了一种可行的方法,请随时将其标记为重复,谢谢! 2021年2月编辑:看来cefpython项目可以满足这些要求 - PDF打印支持似乎很快就可以实现。

可以将数据发送到外部 Web 服务吗? - user2864740
1
任何外部的东西在这种情况下都不会真正属于Python - 我会说这是代码高尔夫规则,因此从远程服务获取解决方案将是无效的。 - bsplosion
进一步澄清其他人所说的:如果您希望它呈现JavaScript,则必须包含JavaScript引擎。没有以纯Python编写的符合ECMAscript标准且得到良好维护的JavaScript引擎(那将是一个巨大的项目)...因此,大多数HTML渲染器和JavaScript引擎通常都是用C ++开发的,因此这两个东西是浏览器的主要部分,因此无头浏览器是解决此要求的好方法。 - reverse_engineer
@reverse_engineer,这都很公平,也许这就是答案——没有用Python编写的JavaScript引擎,从过去几年的一些被放弃的项目来看,似乎也没有太多的动力去这样做。如果您想将您的评论改为答案,那似乎是可以接受的。 - bsplosion
好的,我已经将它写成答案了! - reverse_engineer
显示剩余5条评论
2个回答

4

为了澄清和正式化其他人所说的:

  • 如果您想从HTML/CSS/javascript内容创建PDF文档,您必须需要一个javascript引擎(因为您显然需要执行javascript以影响文档的外观)。这是您需要的最复杂的组件。

  • 目前为止,没有用纯Python编写的符合ECMAscript规范的引擎得到很好地维护(这将是一个巨大的项目)...可能永远不会有一个,因为语言的编译器和虚拟机需要具有高性能,因此通常使用高性能的低级语言进行编写。

  • 因此,您总是需要编译后的二进制文件以及HTML渲染器,后者较不复杂,但如果在浏览器中使用,则也需要具有高性能,因此通常也是C++或类似的语言。

  • Javascript引擎和HTML渲染器是浏览器的主要部分,因此无头浏览器是满足此要求的良好解决方案。


3

尝试使用这个库:xhtml2pdf

这个库对我很有用。以下是它的文档:doc

以下是一些示例代码:

from xhtml2pdf import pisa             

def convert_html_to_pdf(source_html, output_filename):
    # open output file for writing (truncated binary)
    result_file = open(output_filename, "w+b")

    # convert HTML to PDF
    pisa_status = pisa.CreatePDF(
            source_html,                # the HTML to convert
            dest=result_file)           # file handle to recieve result

    # close output file
    result_file.close()                 # close output file

    # return False on success and True on errors
    return pisa_status.err

# Define your data
source_html = open('2020-06.html')
output_filename = "test.pdf"
convert_html_to_pdf(source_html, output_filename)

1
谢谢您的建议!不幸的是,xhtml2pdf不支持任何形式的Javascript。我已经更新了问题的标题,以使该要求更加清晰 - 之前只在问题正文中提到过。 - bsplosion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接