1. 为什么需要OFD与PDF双向转换?
在日常办公和文档处理中,PDF格式大家都很熟悉了,但你可能对OFD这个国产文档格式还不太了解。OFD全称是Open Fixed-layout Document,是我国自主制定的电子文件格式标准,特别适合处理中文文档。我在处理政府公文和电子发票时发现,OFD在中文排版、印章支持和版式固定方面表现非常出色,完全不会出现PDF常见的乱码问题。
举个例子,去年我帮一家企业做财务系统升级,他们收到的电子发票全是OFD格式,但财务人员习惯用PDF工具查看和打印。这时候就需要一个可靠的格式转换工具,既能保持原始版式,又能确保所有中文内容正确显示。PyMuPDF这个Python库完美解决了这个问题,它不仅能处理PDF,还原生支持OFD格式的读写和转换。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与PyMuPDF安装
2.1 安装PyMuPDF的正确姿势
安装PyMuPDF其实很简单,但我在实际项目中踩过几个坑。最稳妥的方式是使用pip安装指定版本:
bash复制pip install PyMuPDF==1.23.0
为什么强调版本号?因为我在使用最新版时遇到过OFD转换的兼容性问题,1.23.0这个版本经过长期测试最稳定。安装完成后,可以用以下代码检查是否安装成功:
python复制import fitz # PyMuPDF的导入名称
print(fitz.__doc__)
如果看到输出中包含"PDF"和"OFD"相关说明,说明安装正确。有个小细节要注意:在Linux系统上可能需要先安装一些依赖库,比如libmupdf-dev,否则可能会报错。
2.2 处理中文文档的额外配置
为了让转换后的文档完美支持中文,我建议在代码开头添加这些配置:
python复制import fitz
# 设置中文字体映射
font = fitz.Font("china-s") # 使用内置中文字体
fitz.TOOLS.set_small_glyph_heights(False) # 确保中文显示清晰
这个配置特别重要,我遇到过很多次转换后中文变成方框的情况,都是因为没有正确设置中文字体。china-s是PyMuPDF内置的思源宋体,对中文排版支持很好。
3. OFD转PDF的实战技巧
3.1 基础转换函数优化
原始文章给出了基本的转换函数,但在实际使用中我发现还需要考虑更多细节。这是我优化后的版本:
python复制def ofd_to_pdf(file_path, output_path=None, dpi=300):
"""
增强版OFD转PDF函数
:param file_path: OFD文件路径
:param output_path: 输出路径,默认为同目录下同名文件
:param dpi: 输出分辨率,影响图像质量
:return: 输出文件路径
"""
try:
doc = fitz.open(file_path)
# 设置转换选项
options = {
"dpi": dpi,
"no_anti_alias": 0, # 启用抗锯齿
"graph": 1, # 保留图形
"text": 1 # 保留文本
}
pdf_bytes = doc.convert_to_pdf(options=options)
if not output_path:
output_path = file_path[:-4] + ".pdf"
with open(output_path, "wb") as f:
f.write(pdf_bytes)
print(f"转换成功: {file_path}
