我建议不要直接创建 PDF,因为它需要大量不同于 HTML 的格式。最好创建一个 HTML 文档,然后将其转换为 PDF。我在最近的一个项目(打印 mtg 卡片组)中使用了它,并且效果非常好:
import pdfkit
from jinja2 import Template, Environment, FileSystemLoader
class Html(object):
def __init__(self):
self.template: Optional[Template] = None
def load_template(self):
template_loader = FileSystemLoader(searchpath="./")
template_env = Environment(loader=template_loader)
self.template = template_env.get_template("template.html")
def write_html(self, deck_name: str, data: list):
with io.open("index.html", mode="w", encoding="utf-8") as fh:
if self.template:
fh.write(self.template.render(deck_name=deck_name, rows=data))
class Pdf(object):
def __init__(self, deck_name: str):
self.deck_name = deck_name
self.options = {
'margin-left': '5mm',
'margin-right': '5mm',
'margin-top': '5mm',
'margin-bottom': '5mm',
}
def create(self):
# create pdf
pdfkit.from_file('index.html', f'{self.deck_name}.pdf', options=self.options)
html = Html()
html.load_template()
html.write_html(deck_name=deck_name, data=rows)
pdf = Pdf(deck_name=deck_name)
pdf.create()
我猜如果不做任何更改,代码将无法运行,因为我只是尝试将其剥离为基本功能,但您可以了解它是如何工作的。
它使用Jinja2作为模板引擎以便于格式化,然后使用pdfkit模块将html导出为带有wkhtmltopdf的pdf,可以从https://wkhtmltopdf.org/下载