只有在单独的文件中给出转换命令时,才能将 HTML 转换为 PDF
Converting HTML to PDF works only when conversion command is given in separate file
我想用我编写的 Python 小程序生成发票。我希望它首先将发票输出为 HTML 文件,然后将其转换为 PDF。目前我的代码正在根据需要创建 HTML 文档,但它输出的是空白 PDF 文件:
import pdfkit
import time
name = input('Enter business name: ')
date = input('Enter the date: ')
invoice = input('Enter invoice number: ')
total = 1000 # Fixed number for now just for testing purposes
f = open('invoice.html','w')
message = f"""<html>
<head>
<link rel='stylesheet' href='style.css')>
</head>
<body>
<h1>INVOICE<span id="invoice-number"> {invoice}</h1>
<h3>{date} </h3>
<h3>{name} </h3>
<h3>Total: ${total}</h3>
</body>
</html>"""
f.write(message)
time.sleep(2)
options = {
'enable-local-file-access': None
}
pdfkit.from_file('invoice.html', 'out.pdf', options = options)
当我 运行 上面的代码时,它输出的 HTML 文档看起来很好,但它创建的 PDF 是空白的。我根本没有收到任何错误消息。终端中的输出是:
Loading pages (1/6)
Counting pages (2/6)
Resolving links (4/6)
Loading headers and footers (5/6)
Printing pages (6/6)
Done
但是,我在同一目录中有另一个名为 test.py
的文件。此文件包含导入语句,最后四行与第一个代码完全相同,没有其他内容:
import pdfkit
options = {
'enable-local-file-access': None
}
pdfkit.from_file('invoice.html', 'out.pdf', options = options)
如果我在上一个文件之后 运行 这个文件,它会正确输出 PDF 看起来就像 HTML 版本。为什么此代码在单独文件中 运行 时有效,但包含在原始文件中时无效?我怎样才能在同一个文件中得到它 运行 这样我就不必执行两个命令来获取发票?
您永远不会关闭正在写入的文件,或明确刷新它。由于它是一个小文本片段,并且默认情况下启用缓冲,因此在您的进程终止之前不会将其写入磁盘。您没有看到错误,因为文件确实在打开时立即创建。这个问题不是你想象的时间问题。
这个问题有很多解决方案。最简单和最正确的方法是在完成写入后立即关闭文件。这就是您在 python:
中惯用地打开文件的方式
name = input('Enter business name: ')
date = input('Enter the date: ')
total = 1000 # Fixed number for now just for testing purposes
message = ...
options = {
'enable-local-file-access': None
}
with open('invoice.html','w') as f:
f.write(message)
pdfkit.from_file('invoice.html', 'out.pdf', options = options)
请注意,您不需要等待任何事情:退出 with
块将关闭文件并在进程中刷新它 即使发生错误 .您应该养成在完成对文件的处理后立即关闭文件的习惯:大多数操作系统支持每个进程的文件句柄数量有限。这意味着在 with
块之后调用 pdfkit.from_file
可以保证它将有一个完全刷新的文件可以使用。
这里还有一些其他的方法,不是惯用的,不推荐在实践中使用。我提供它们只是为了让您了解不同步骤的工作原理:
在尝试读取之前刷新文件。调用
而不是 sleep
f.flush()
这将使文件对象保持打开状态,不一定能正确处理错误,但会确保在您尝试读取之前写出 HTML 内容。
关闭缓冲。缓冲意味着在您写入 4kb 左右的数据(无论您的磁盘块大小是多少)之前,none 的数据将被写入磁盘,直到您刷新它。您可以通过像这样
调用 open
来禁用此行为,以便立即写出字节
open('invoice.html', 'w', buffering=0)
我想用我编写的 Python 小程序生成发票。我希望它首先将发票输出为 HTML 文件,然后将其转换为 PDF。目前我的代码正在根据需要创建 HTML 文档,但它输出的是空白 PDF 文件:
import pdfkit
import time
name = input('Enter business name: ')
date = input('Enter the date: ')
invoice = input('Enter invoice number: ')
total = 1000 # Fixed number for now just for testing purposes
f = open('invoice.html','w')
message = f"""<html>
<head>
<link rel='stylesheet' href='style.css')>
</head>
<body>
<h1>INVOICE<span id="invoice-number"> {invoice}</h1>
<h3>{date} </h3>
<h3>{name} </h3>
<h3>Total: ${total}</h3>
</body>
</html>"""
f.write(message)
time.sleep(2)
options = {
'enable-local-file-access': None
}
pdfkit.from_file('invoice.html', 'out.pdf', options = options)
当我 运行 上面的代码时,它输出的 HTML 文档看起来很好,但它创建的 PDF 是空白的。我根本没有收到任何错误消息。终端中的输出是:
Loading pages (1/6)
Counting pages (2/6)
Resolving links (4/6)
Loading headers and footers (5/6)
Printing pages (6/6)
Done
但是,我在同一目录中有另一个名为 test.py
的文件。此文件包含导入语句,最后四行与第一个代码完全相同,没有其他内容:
import pdfkit
options = {
'enable-local-file-access': None
}
pdfkit.from_file('invoice.html', 'out.pdf', options = options)
如果我在上一个文件之后 运行 这个文件,它会正确输出 PDF 看起来就像 HTML 版本。为什么此代码在单独文件中 运行 时有效,但包含在原始文件中时无效?我怎样才能在同一个文件中得到它 运行 这样我就不必执行两个命令来获取发票?
您永远不会关闭正在写入的文件,或明确刷新它。由于它是一个小文本片段,并且默认情况下启用缓冲,因此在您的进程终止之前不会将其写入磁盘。您没有看到错误,因为文件确实在打开时立即创建。这个问题不是你想象的时间问题。
这个问题有很多解决方案。最简单和最正确的方法是在完成写入后立即关闭文件。这就是您在 python:
中惯用地打开文件的方式name = input('Enter business name: ')
date = input('Enter the date: ')
total = 1000 # Fixed number for now just for testing purposes
message = ...
options = {
'enable-local-file-access': None
}
with open('invoice.html','w') as f:
f.write(message)
pdfkit.from_file('invoice.html', 'out.pdf', options = options)
请注意,您不需要等待任何事情:退出 with
块将关闭文件并在进程中刷新它 即使发生错误 .您应该养成在完成对文件的处理后立即关闭文件的习惯:大多数操作系统支持每个进程的文件句柄数量有限。这意味着在 with
块之后调用 pdfkit.from_file
可以保证它将有一个完全刷新的文件可以使用。
这里还有一些其他的方法,不是惯用的,不推荐在实践中使用。我提供它们只是为了让您了解不同步骤的工作原理:
在尝试读取之前刷新文件。调用
而不是sleep
f.flush()
这将使文件对象保持打开状态,不一定能正确处理错误,但会确保在您尝试读取之前写出 HTML 内容。
关闭缓冲。缓冲意味着在您写入 4kb 左右的数据(无论您的磁盘块大小是多少)之前,none 的数据将被写入磁盘,直到您刷新它。您可以通过像这样
调用open
来禁用此行为,以便立即写出字节open('invoice.html', 'w', buffering=0)