使用docxtpl可保存为DOCX但无法保存为PDF格式求助
问题原因
docxtpl库的DocxTemplate.save()方法仅支持保存为DOCX格式,没有直接生成PDF的功能。你调用doc.save(f"{row['name']}.pdf")本质上是把DOCX内容强行改了后缀名,生成的文件实际还是DOCX格式,自然无法用PDF阅读器正常打开。
解决方案
提供两种实用的实现方式,按需选择:
方式一:用docx2pdf库(简单快捷,依赖微软Word)
docx2pdf可以直接将DOCX转PDF,要求系统安装微软Word(Windows/macOS均可)。
操作步骤
- 安装依赖包:
pip install docxtpl pandas docx2pdf
- 修改后的代码:
import pandas as pd from datetime import datetime from docxtpl import DocxTemplate from docx2pdf import convert today_date = datetime.today().strftime("%d/%m/%y") my_context = {'today_date': today_date} df = pd.read_excel('list.xlsx') for index, row in df.iterrows(): # 每次循环重新加载模板,避免之前的渲染内容残留 doc = DocxTemplate("sample.docx") context = {'my_name': row['name'], 'my_age': row['age']} context.update(my_context) doc.render(context) docx_path = f"{row['name']}.docx" doc.save(docx_path) # 调用docx2pdf转换为PDF convert(docx_path)
方式二:用LibreOffice(跨平台,无需微软Word)
如果系统没装微软Word,可借助LibreOffice的命令行工具完成转换,支持Windows、Linux、macOS。
操作步骤
- 安装LibreOffice,并确保
soffice命令行工具在系统PATH中。 - 修改后的代码:
import pandas as pd from datetime import datetime from docxtpl import DocxTemplate import subprocess today_date = datetime.today().strftime("%d/%m/%y") my_context = {'today_date': today_date} df = pd.read_excel('list.xlsx') for index, row in df.iterrows(): doc = DocxTemplate("sample.docx") context = {'my_name': row['name'], 'my_age': row['age']} context.update(my_context) doc.render(context) docx_path = f"{row['name']}.docx" pdf_path = f"{row['name']}.pdf" doc.save(docx_path) # 调用LibreOffice命令行转换 subprocess.run([ 'soffice', '--headless', # 无界面模式 '--convert-to', 'pdf', '--outdir', '.', # 输出到当前目录 docx_path ], check=True)
额外注意事项
- 必须每次循环重新加载
DocxTemplate,否则前一次的渲染内容会保留在模板对象中,导致后续文件内容重复。 - 使用docx2pdf时,Word会后台启动,转换过程中不要手动关闭Word进程。
内容的提问来源于stack exchange,提问作者jjbkd
相关产品推荐
相关产品推荐

