# ofd2pdf **Repository Path**: wx-rdc/ofd2pdf ## Basic Information - **Project Name**: ofd2pdf - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-01 - **Last Updated**: 2026-03-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # OFD 转 PDF 工具 基于 [easyofd](https://github.com/renoyuan/easyofd) 库实现的 OFD 文件转 PDF 工具。 ## 项目结构 ``` . ├── convert.py # 转换脚本 ├── easyofd/ # easyofd 库源码(已修复 bug) │ ├── draw/ │ ├── parser_ofd/ │ ├── template_ofd/ │ ├── tests/ │ └── ... ├── ofd/ # OFD 文件目录(示例) └── README.md ``` ## convert.py 使用说明 ### 功能 将 OFD(电子文件格式)文件转换为 PDF 文件,支持单文件转换和批量转换。 ### 使用方式 #### 1. 批量转换当前目录下所有 OFD 文件 ```bash python convert.py ``` 自动扫描当前目录下所有 `.ofd` 文件,并在同目录生成对应的 `.pdf` 文件。 #### 2. 转换单个文件 ```bash python convert.py [输出PDF路径] ``` 示例: ```bash python convert.py invoice.ofd python convert.py invoice.ofd output.pdf ``` #### 3. 批量转换指定目录 ```bash python convert.py --batch <输入目录> [输出目录] ``` 示例: ```bash python convert.py --batch ./ofd_files python convert.py --batch ./ofd_files ./pdf_output ``` ### 作为模块使用 ```python from convert import convert_ofd_to_pdf, batch_convert_ofd_to_pdf # 转换单个文件 convert_ofd_to_pdf("example.ofd", "output.pdf") # 批量转换 batch_convert_ofd_to_pdf("./ofd_files", "./pdf_output") ``` ## 依赖安装 ```bash pip install -r requirements.txt ``` 或手动安装: ```bash pip install reportlab Pillow loguru fonttools pymupdf xmltodict ``` ## easyofd 库修改说明 本项目使用的 easyofd 库相对于原版进行了以下修改: ### 修复 `draw_annotation` 方法空指针异常 **文件位置:** `easyofd/draw/draw_pdf.py` **问题描述:** 原代码在处理签章注释时,未对 `ImgageObject` 进行空值检查,当 OFD 文件中的签章注释缺少 `ImgageObject` 信息时,会抛出 `AttributeError: 'NoneType' object has no attribute 'split'` 异常,导致 PDF 生成失败并输出"ofd 格式错误,不支持解析"。 **原代码:** ```python def draw_annotation(self, canvas, annota_info, images, page_size): img_list = [] for key, annotation in annota_info.items(): if annotation.get("AnnoType").get("type") == "Stamp": pos = annotation.get("ImgageObject").get("Boundary","").split(" ") # 此处会报错 # ... ``` **修改后:** ```python def draw_annotation(self, canvas, annota_info, images, page_size): img_list = [] for key, annotation in annota_info.items(): if annotation.get("AnnoType").get("type") == "Stamp": img_obj = annotation.get("ImgageObject") or {} # 添加空值保护 pos = img_obj.get("Boundary","") pos = pos.split(" ") if pos else [] # ... ``` **修改原因:** 部分 OFD 电子发票文件的签章注释结构中,`ImgageObject` 字段为 `None`,但 `Appearance` 字段包含有效的位置信息。原代码直接调用 `.get()` 方法导致异常,修改后增加了空值检查,使程序能够正常处理此类 OFD 文件。 ## 许可证 本项目遵循 MIT 许可证。easyofd 库沿用原项目许可证。