# PDF-EXCEL **Repository Path**: jackyzhouqiang/pdf-excel ## Basic Information - **Project Name**: PDF-EXCEL - **Description**: 常州公司用,PDF转EXCEL工具 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-01-06 - **Last Updated**: 2026-07-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PDF转换工具 - 项目说明文档 ## 📋 项目概述 **项目名称**: PDF转换工具 **开发语言**: Python 3.8 **GUI框架**: PyQt5 **主要功能**: 从各公司的PDF发票/订单中提取表格数据,并查询ERP数据库获取厂内编码和原材料信息,最终导出为Excel文件。 --- ## 🛠️ 技术栈 | 技术 | 版本 | 用途 | |------|------|------| | Python | 3.8.8 | 核心语言 | | PyQt5 | 5.12.3 | GUI界面框架 | | pdfplumber | 0.10.3 | PDF文件解析 | | pandas | 1.5.3 | 数据处理和Excel导出 | | openpyxl | 3.1.2 | Excel文件操作 | | pyodbc | 5.2.0 | SQL Server数据库连接 | | numpy | 1.24.4 | 数值计算 | | PyInstaller | 6.17.0 | 打包成exe | | UPX | 4.2.4 | exe压缩 | --- ## 📁 项目结构 ``` outpdf-bak/ ├── integrated_pdf_app_pyqt.py # 主应用程序(PyQt5 GUI) ├── company_handlers.py # 各公司PDF处理和SQL查询逻辑 ├── customer_manager.py # 客户处理器注册表 ├── license_manager.py # 许可证管理器(激活系统) ├── 启动程序.bat # 使用虚拟环境启动程序 ├── 重新打包.bat # PyInstaller打包脚本(带UPX压缩) ├── 激活说明.txt # 激活使用说明 ├── PDF提取工具.spec # PyInstaller配置文件 ├── 1.ico # 程序图标 ├── venv/ # Python虚拟环境 ├── build/ # PyInstaller构建临时文件 ├── dist/ # 打包后的exe文件 │ └── PDF转换工具.exe # 最终可执行程序(57MB) └── README.md # 本文档 ``` --- ## 🎯 核心功能 ### 1. PDF数据提取 - 支持多公司PDF格式解析 - 自动识别表格结构和字段 - 提取订单号、日期、料号、数量等信息 ### 2. ERP数据库查询 - **数据库**: 10.7.2.20\pcb_biz - **主要表**: - `product_model_manage` - 产品型号管理 - `product_customers` - 客户产品对应关系 - `com_plugin` - 组件插件 - `process_intro` - 工序介绍 - `bom` - 物料清单 - `material_project` - 材料项目 ### 3. 数据导出 - 导出到Excel文件(.xlsx格式) - 支持自定义列顺序 - 自动格式化数值和日期 ### 4. 激活系统 - **试用期限**: 2026年3月30日 - **激活码**: `PDF2026ACTIVATE` - **过期行为**: 完全锁定,只能输入激活码 --- ## 🏢 各公司配置详情 ### 艾福电子(AntaiNuoHandler) #### PDF提取规则 - **客户料号字段**: 客户料号、客户产品代码、零件号/MPN - **表格识别**: - 表头: 第1列空,第2列"存货编码",第3列"存货名称及规格" - 表尾: 第3列包含"总数量" - **数据清洗**: 去括号、去特殊字符、PBAN过滤 #### SQL查询规则 ```sql SELECT DISTINCT customer_model, our_factory_no+version_code AS PN FROM [pcb_biz].[dbo].[product_model_manage] A JOIN [pcb_biz].[dbo].[product_customers] B ON A.product_no=B.product_no WHERE A.our_factory_no+A.version_code NOT LIKE '%PBAN%' AND A.our_factory_no+A.version_code NOT LIKE '%SA%' AND B.version_overdue=0 ``` **特点**: - ✅ 全量预加载映射(性能优化) - ✅ SQL过滤 PBAN 和 SA 开头 - ✅ SQL过滤过期记录(version_overdue=0) - ✅ Python 代码处理(去括号、去特殊字符) - ✅ 材料查询(与深圳镭华相同规则) --- ### 深圳镭华(LeiHuaHandler) #### PDF提取规则 - **客户料号字段**: 客户产品代码 - **表格识别**: - 跳过第1行(表头) - 表尾: 第1列包含"订单未税总金额" - **数据处理**: - 客户产品代码: `row[1]`,去除换行符 - 零件号/MPN: `row[3]`,去除括号,提取连字符格式 - 层数: 从描述中提取,匹配 `(\d+)\s*(Layer|layer|layers|lay)` - 订单数量: `row[5]` - 未税单价: `row[6]`,格式化为 xxx.xx #### SQL查询规则 ```sql SELECT TOP 1 our_factory_no+version_code AS PN, customer_model FROM [pcb_biz].[dbo].[product_model_manage] A JOIN [pcb_biz].[dbo].[product_customers] B ON A.product_no=B.product_no WHERE customer_model LIKE '%{customer_model}%' AND our_factory_no NOT LIKE '%PBAN%' ORDER BY PN DESC ``` **特点**: - ✅ 动态查询(不预加载) - ✅ **去除客户料号前6位**:`cleaned_model[6:]` - ✅ TOP 1 只返回最匹配的1条 - ✅ 过滤 PBAN - ✅ 按PN降序排序 - ✅ 材料查询(换行分隔多材料) --- ## 🔒 激活系统说明 ### 激活码 ``` PDF2026ACTIVATE ``` ### 试用规则 - **到期日期**: 2026年3月30日 - **过期前7天**: 每次启动弹出提醒 - **过期后**: 完全锁定,只能输入激活码或退出 - **激活后**: 永久有效 ### 激活文件 - **文件位置**: `license.dat`(程序根目录) - **文件格式**: JSON - **内容**: ```json { "activated": true, "activate_date": "2026-02-03 12:00:00", "activation_code": "PDF2026ACTIVATE" } ``` ### 状态栏显示 - **试用中**: `⚠️ 试用版:剩余 X 天(将于2026年03月30日到期)` - **已激活**: `✅ 已激活 - 感谢您的使用!` - **已过期**: `❌ 试用期已过 - 请激活软件` ### 重置激活状态 删除 `license.dat` 文件即可恢复到试用状态。 --- ## 📦 打包说明 ### 打包命令 #### 方式1: 使用批处理脚本(推荐) ```bash 双击运行 "重新打包.bat" ``` #### 方式2: 命令行 ```bash venv\Scripts\pyinstaller.exe PDF提取工具.spec --upx-dir "E:\upx" --noconfirm ``` ### Spec文件配置 - **文件名**: `PDF提取工具.spec` - **图标**: `1.ico` - **UPX压缩**: 启用 - **控制台**: 禁用(GUI应用) - **单文件**: 是 ### 打包输出 - **位置**: `dist/PDF转换工具.exe` - **大小**: 约57 MB(UPX压缩后) - **无UPX**: 约72 MB ### UPX压缩 - **UPX版本**: 4.2.4 - **UPX位置**: `E:\upx\upx.exe` - **压缩率**: 约20.8% --- ## 🔧 修改记录 ### 2026-02-03 - ✅ 添加激活码系统(试用至2026-03-30) - ✅ 添加过期锁定功能 - ✅ 艾福电子添加 PBAN、SA 过滤 - ✅ 艾福电子添加材料查询功能 - ✅ 深圳镭华优化SQL(TOP 1) - ✅ 添加状态栏和菜单栏 ### 2025-12-18 - 初始版本 - 基本PDF提取功能 - 艾福电子和深圳镭华支持 --- ## 💡 如何添加新公司 ### 步骤1: 创建公司处理类 在 `company_handlers.py` 中添加新类: ```python class NewCompanyHandler(CompanyHandler): """新公司处理类""" def __init__(self): super().__init__("新公司名称") def is_sql_enabled(self): """是否启用SQL查询""" return True # 或 False def get_sql_query(self): """定义SQL查询语句(可选)""" return """SELECT ...""" def get_customer_model_field(self): """定义客户料号字段名(可选)""" return ["客户料号", "客户产品代码"] def extract_data(self, pdf_path): """提取PDF数据""" # PDF提取逻辑 pass def process_data(self, data): """处理数据(可选)""" # 数据处理逻辑 pass ``` ### 步骤2: 注册新公司 在 `company_handlers.py` 底部添加: ```python customer_manager.register_customer("新公司名称", NewCompanyHandler) ``` ### 步骤3: 更新主程序 在 `integrated_pdf_app_pyqt.py` 的公司列表中添加: ```python companies = [ # ... 现有公司 {"name": "新公司名称", "color": "#4CAF50"}, ] ``` --- ## 🐛 常见问题 ### 1. numpy导入错误 **问题**: `ImportError: No module named 'numpy.core._multiarray_umath'` **原因**: 使用了系统Python而不是虚拟环境 **解决**: 使用 `启动程序.bat` 或虚拟环境的Python ### 2. 打包后文件被占用 **问题**: `PermissionError` when rebuilding **原因**: exe文件正在运行或资源管理器打开了dist文件夹 **解决**: 关闭所有程序和文件夹窗口后重新打包 ### 3. 数据库连接失败 **问题**: 无法查询厂内编码 **原因**: VPN未连接或数据库服务不可用 **解决**: 检查VPN连接,确保能访问 10.7.2.20 ### 4. 材料查询为空 **问题**: 厂内编码有值但原材料为空 **原因**: 1. 数据库中没有对应的材料信息 2. 厂内编码不正确 3. 材料表的关联关系有问题 --- ## 📞 联系信息 - **开发者**: [您的名字] - **项目位置**: `E:\pro\outpdf-bak` - **Git仓库**: `gitee.com:jackyzhouqiang/pdf-excel.git` --- ## 📝 待办事项 - [ ] 添加更多公司支持 - [ ] 优化PDF解析准确率 - [ ] 添加批量PDF处理功能 - [ ] 支持PDF拖拽导入 - [ ] 添加导出历史记录 --- **最后更新**: 2026-02-03 **版本**: 1.0.0