pdf-picker
基于 Go 的 PDF 回执拆分与分类工具。
功能说明:
- 扫描输入目录中的 PDF 文件
- 将回执按页面内多条回执进行拆分并导出图片
- 从文本中提取“收款人全称”并按名称分类到输出目录
- 识别失败时可使用 OCR 兜底
- 生成执行结果记录文件(含每个 PDF 的目录与图片明细)
1. 项目结构
- index.go: Go 主程序
- go.mod / go.sum: Go 模块依赖
- source/: 默认输入目录(放 PDF)
- output/: 默认输出目录(分类后的图片)
2. 运行环境
- Windows
- Go 1.19+
- C 编译器(用于 cgo,go-fitz 依赖)
- 可选:Tesseract OCR(用于识别扫描件)
当前项目依赖:
- github.com/gen2brain/go-fitz v1.20.2
3. 工具链配置(Windows)
如果构建时报错 gcc not found,可使用 LLVM-MinGW。
示例(已验证可用路径):
- 安装 LLVM-MinGW(任选一种)
- 使用 winget
- 手动下载并解压到 C:/llvm-mingw
- 配置 Go 使用 clang 作为 cgo 编译器(PowerShell)
go env -w CC="C:\llvm-mingw\llvm-mingw-20260519-ucrt-x86_64\bin\clang.exe"
go env -w CXX="C:\llvm-mingw\llvm-mingw-20260519-ucrt-x86_64\bin\clang++.exe"
go env -w CGO_ENABLED=1
- 检查配置
go env CC CXX CGO_ENABLED
4. 编译
go mod tidy
go build index.go
编译成功后会生成可执行文件:
- index.exe
5. 运行
5.1 默认目录
.\index.exe
等价于:
- 输入目录:./source
- 输出目录:./output
5.2 指定目录(短参数)
.\index.exe -i ./source -o ./output2
5.3 指定目录(位置参数)
.\index.exe ./source ./output2
优先级:
- 命名参数(-i/-o 或 --input/--output)
- 位置参数
- 默认目录(source/output)
6. 输出结果
运行结束后会看到控制台统计,并在项目根目录生成记录文件:
- 执行结果记录_YYYYMMDD_HHMMSS.txt
记录内容包括:
- 每个 PDF 拆分目录数
- 每个目录对应图片数量
- 识别成功/失败数量
- 全部汇总
7. OCR 说明
程序在文本提取失败时会尝试调用:
tesseract <image> stdout -l chi_sim+eng
如果本机未安装 tesseract,OCR 兜底会自动跳过,不影响程序主流程(但扫描件识别率会下降)。
8. 常见问题
Q1: 构建时报 gcc not found
原因:缺少 cgo 编译器。 处理:按第 3 节安装并配置 LLVM-MinGW。
Q2: 构建时出现大量 ld.lld: warning: duplicate symbol
这是链接阶段警告,若最终退出码为 0 且生成 index.exe,可继续使用。
Q3: 没有识别出“收款人全称”
- 可能是 PDF 为扫描件且 OCR 不可用
- 可能是单据模板字段格式与当前规则不一致
可通过增强正则规则或补充 OCR 环境提升识别率。
9. 快速开始
# 1) 放入 PDF 到 source
# 2) 编译
go build index.go
# 3) 运行
.\index.exe -o ./output2
Description
Languages
Go
73.5%
Python
26.5%