From dadabf11d1b9d173da014e0ded74fc59b91449b8 Mon Sep 17 00:00:00 2001 From: Swei-xiao Date: Tue, 3 Jun 2025 14:58:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ocrmypdf-gui/.DS_Store | Bin 0 -> 6148 bytes ocrmypdf-gui/.idea/.gitignore | 8 + ocrmypdf-gui/.idea/OCRmyPDF-GUI.iml | 14 + .../inspectionProfiles/profiles_settings.xml | 6 + ocrmypdf-gui/.idea/misc.xml | 4 + ocrmypdf-gui/.idea/modules.xml | 8 + ocrmypdf-gui/.idea/vcs.xml | 6 + ocrmypdf-gui/README.md | 79 ++++ ...模板-开源软件维护报告文档.docx | Bin 0 -> 147939 bytes ocrmypdf-gui/requirements.txt | 2 + ocrmypdf-gui/run.py | 18 + ocrmypdf-gui/src/__init__.py | 1 + .../src/__pycache__/__init__.cpython-313.pyc | Bin 0 -> 156 bytes .../src/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 150 bytes .../src/__pycache__/main.cpython-313.pyc | Bin 0 -> 2012 bytes .../src/__pycache__/main.cpython-39.pyc | Bin 0 -> 1322 bytes ocrmypdf-gui/src/core/__init__.py | 1 + .../core/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 155 bytes .../core/__pycache__/config.cpython-39.pyc | Bin 0 -> 4041 bytes .../__pycache__/ocr_engine.cpython-39.pyc | Bin 0 -> 4734 bytes ocrmypdf-gui/src/core/config.py | 129 ++++++ ocrmypdf-gui/src/core/ocr_engine.py | 119 +++++ ocrmypdf-gui/src/gui/__init__.py | 1 + .../gui/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 154 bytes .../__pycache__/batch_dialog.cpython-39.pyc | Bin 0 -> 10427 bytes .../__pycache__/main_window.cpython-39.pyc | Bin 0 -> 12086 bytes .../gui/__pycache__/settings.cpython-39.pyc | Bin 0 -> 5832 bytes ocrmypdf-gui/src/gui/batch_dialog.py | 363 +++++++++++++++ ocrmypdf-gui/src/gui/main_window.py | 417 ++++++++++++++++++ ocrmypdf-gui/src/gui/settings.py | 211 +++++++++ ocrmypdf-gui/src/gui/widgets/__init__.py | 1 + ocrmypdf-gui/src/main.py | 48 ++ ocrmypdf-gui/src/utils/__init__.py | 1 + .../utils/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 156 bytes .../__pycache__/file_utils.cpython-39.pyc | Bin 0 -> 3257 bytes ocrmypdf-gui/src/utils/file_utils.py | 124 ++++++ ocrmypdf-gui/src/utils/log_utils.py | 88 ++++ 37 files changed, 1649 insertions(+) create mode 100644 ocrmypdf-gui/.DS_Store create mode 100644 ocrmypdf-gui/.idea/.gitignore create mode 100644 ocrmypdf-gui/.idea/OCRmyPDF-GUI.iml create mode 100644 ocrmypdf-gui/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 ocrmypdf-gui/.idea/misc.xml create mode 100644 ocrmypdf-gui/.idea/modules.xml create mode 100644 ocrmypdf-gui/.idea/vcs.xml create mode 100644 ocrmypdf-gui/README.md create mode 100644 ocrmypdf-gui/docs/文档模板-开源软件维护报告文档.docx create mode 100644 ocrmypdf-gui/requirements.txt create mode 100644 ocrmypdf-gui/run.py create mode 100644 ocrmypdf-gui/src/__init__.py create mode 100644 ocrmypdf-gui/src/__pycache__/__init__.cpython-313.pyc create mode 100644 ocrmypdf-gui/src/__pycache__/__init__.cpython-39.pyc create mode 100644 ocrmypdf-gui/src/__pycache__/main.cpython-313.pyc create mode 100644 ocrmypdf-gui/src/__pycache__/main.cpython-39.pyc create mode 100644 ocrmypdf-gui/src/core/__init__.py create mode 100644 ocrmypdf-gui/src/core/__pycache__/__init__.cpython-39.pyc create mode 100644 ocrmypdf-gui/src/core/__pycache__/config.cpython-39.pyc create mode 100644 ocrmypdf-gui/src/core/__pycache__/ocr_engine.cpython-39.pyc create mode 100644 ocrmypdf-gui/src/core/config.py create mode 100644 ocrmypdf-gui/src/core/ocr_engine.py create mode 100644 ocrmypdf-gui/src/gui/__init__.py create mode 100644 ocrmypdf-gui/src/gui/__pycache__/__init__.cpython-39.pyc create mode 100644 ocrmypdf-gui/src/gui/__pycache__/batch_dialog.cpython-39.pyc create mode 100644 ocrmypdf-gui/src/gui/__pycache__/main_window.cpython-39.pyc create mode 100644 ocrmypdf-gui/src/gui/__pycache__/settings.cpython-39.pyc create mode 100644 ocrmypdf-gui/src/gui/batch_dialog.py create mode 100644 ocrmypdf-gui/src/gui/main_window.py create mode 100644 ocrmypdf-gui/src/gui/settings.py create mode 100644 ocrmypdf-gui/src/gui/widgets/__init__.py create mode 100644 ocrmypdf-gui/src/main.py create mode 100644 ocrmypdf-gui/src/utils/__init__.py create mode 100644 ocrmypdf-gui/src/utils/__pycache__/__init__.cpython-39.pyc create mode 100644 ocrmypdf-gui/src/utils/__pycache__/file_utils.cpython-39.pyc create mode 100644 ocrmypdf-gui/src/utils/file_utils.py create mode 100644 ocrmypdf-gui/src/utils/log_utils.py diff --git a/ocrmypdf-gui/.DS_Store b/ocrmypdf-gui/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..3487410d4b50f30874cedf2e18b567fc803e49f3 GIT binary patch literal 6148 zcmeHK%Z}496uoXU(}odJ7a+|BDH7YNl$i>I*knp)!Gg^M!2(cenhGM)xHJg`Rh6=a zf8ZC`@+JHWD>&EoNJ$2^2vxq4ef+q`_B~1Ln25xJ0I-!RXPN7WAG9idAWeT1q)(VCVFa@;blurond=E5qsvl;&VJ*Z8f$ID}t;IR><% zPxaBUa-y%5c-mM8My-2^Ta6KoSGdVmW^el*u97&*hr=JD)piaJI~})k)Oi)Wm75@+ zBj#yYWb-`7BNsYek5o1zcV}kJCtQ#>wDV=C&RusI=#2sx!s$$?>xMizDt&={EU^u1omQO*9~667Zgl1 zAA)t7$dvVF?*lvyXvuQhB|MS1!|LY`MvkF)R_DTWaOoGW6A(^xF yN^pGEdPuL4*x0Yss3^$HajXh_6dxlgL!ZY5pl`6$h!&Xr5l}MN%qs9t75EL*h~NbP literal 0 HcmV?d00001 diff --git a/ocrmypdf-gui/.idea/.gitignore b/ocrmypdf-gui/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/ocrmypdf-gui/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/ocrmypdf-gui/.idea/OCRmyPDF-GUI.iml b/ocrmypdf-gui/.idea/OCRmyPDF-GUI.iml new file mode 100644 index 0000000..3215f97 --- /dev/null +++ b/ocrmypdf-gui/.idea/OCRmyPDF-GUI.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/ocrmypdf-gui/.idea/inspectionProfiles/profiles_settings.xml b/ocrmypdf-gui/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/ocrmypdf-gui/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/ocrmypdf-gui/.idea/misc.xml b/ocrmypdf-gui/.idea/misc.xml new file mode 100644 index 0000000..35d9e0e --- /dev/null +++ b/ocrmypdf-gui/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ocrmypdf-gui/.idea/modules.xml b/ocrmypdf-gui/.idea/modules.xml new file mode 100644 index 0000000..6d2a594 --- /dev/null +++ b/ocrmypdf-gui/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/ocrmypdf-gui/.idea/vcs.xml b/ocrmypdf-gui/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/ocrmypdf-gui/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ocrmypdf-gui/README.md b/ocrmypdf-gui/README.md new file mode 100644 index 0000000..1041de9 --- /dev/null +++ b/ocrmypdf-gui/README.md @@ -0,0 +1,79 @@ +# OCRmyPDF GUI + +OCRmyPDF的图形用户界面,让OCR处理PDF文件变得简单。 + +## 功能特点 + +- 简洁直观的图形界面 +- 批量处理PDF文件 +- 拖放支持 +- 多语言OCR支持 +- 可自定义OCR选项 +- 保存处理配置 + +## 安装要求 + +- Python 3.7+ +- OCRmyPDF +- Tesseract OCR +- PySide6 (Qt for Python) + +## 安装步骤 + +1. 安装OCRmyPDF和其依赖: + +```bash +# macOS +brew install ocrmypdf + +# Ubuntu/Debian +apt install ocrmypdf + +# 或使用pip +pip install ocrmypdf +``` + +2. 安装GUI依赖: + +```bash +pip install PySide6 +``` + +3. 克隆本仓库: + +```bash +git clone https://github.com/yourusername/OCRmyPDF-GUI.git +cd OCRmyPDF-GUI +``` + +## 使用方法 + +运行启动脚本: + +```bash +python run.py +``` + +或在Windows上双击`run.py`文件。 + +## 开发计划 + +- [ ] 高级OCR选项 +- [ ] 多语言界面 +- [ ] 暗黑模式 +- [ ] 自定义输出文件名模板 +- [ ] 处理历史记录 + +## 贡献 + +欢迎提交Pull Request或Issue。 + +## 许可证 + +本项目采用与OCRmyPDF相同的许可证。 + +## 致谢 + +- [OCRmyPDF](https://github.com/ocrmypdf/OCRmyPDF) - 强大的OCR工具 +- [Tesseract OCR](https://github.com/tesseract-ocr/tesseract) - OCR引擎 +- [Qt for Python (PySide6)](https://wiki.qt.io/Qt_for_Python) - GUI框架 \ No newline at end of file diff --git a/ocrmypdf-gui/docs/文档模板-开源软件维护报告文档.docx b/ocrmypdf-gui/docs/文档模板-开源软件维护报告文档.docx new file mode 100644 index 0000000000000000000000000000000000000000..1d921dfffd2171febd77ef9fcda1f9642b73fd0e GIT binary patch literal 147939 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 |aL~ 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 literal 0 HcmV?d00001 diff --git a/ocrmypdf-gui/requirements.txt b/ocrmypdf-gui/requirements.txt new file mode 100644 index 0000000..2256d12 --- /dev/null +++ b/ocrmypdf-gui/requirements.txt @@ -0,0 +1,2 @@ +PySide6>=6.5.0 +pytest>=7.0.0 \ No newline at end of file diff --git a/ocrmypdf-gui/run.py b/ocrmypdf-gui/run.py new file mode 100644 index 0000000..a06f501 --- /dev/null +++ b/ocrmypdf-gui/run.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python3 +""" +OCRmyPDF GUI 启动脚本 +""" + +import sys +import os +from pathlib import Path + +# 添加项目根目录到Python路径 +project_root = Path(__file__).resolve().parent +sys.path.insert(0, str(project_root)) + +# 导入主模块 +from src.main import main + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/ocrmypdf-gui/src/__init__.py b/ocrmypdf-gui/src/__init__.py new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/ocrmypdf-gui/src/__init__.py @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ocrmypdf-gui/src/__pycache__/__init__.cpython-313.pyc b/ocrmypdf-gui/src/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f044463edc54dbb37309da6f3643af75644b6ca3 GIT binary patch literal 156 zcmey&%ge<81TO?EG8lpMV-N=hKms7}nFUBpWk_exWb|9fP{afh0*T+U)(fkB`sH%PfhH*DI*J g#bJ}1pHiBWYFESxGz(-`F^KVznURsPh#ANN08+6ex&QzG literal 0 HcmV?d00001 diff --git a/ocrmypdf-gui/src/__pycache__/__init__.cpython-39.pyc b/ocrmypdf-gui/src/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f955d7432d9b6294c4cb9a86e3424bc119498be GIT binary patch literal 150 zcmYe~<>g`kf)@f78H_;sF^Gct<8&fT literal 0 HcmV?d00001 diff --git a/ocrmypdf-gui/src/__pycache__/main.cpython-313.pyc b/ocrmypdf-gui/src/__pycache__/main.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3be1c911a104605557a34369f714893a323dcb3 GIT binary patch literal 2012 zcmZuy&2JM&6rc5u?TxPXhI-mJISyVmRm zlBfq$fdb@^Rw^QgO085O(F;BFR@C-iAPH5{fvAVZO?!(-552W-cD=REo8(P#+4`tQ|Kg$0bzAB^#quSV>C3d9{GA&E;P;+`DgfcK?+DW32mlksVs@)N&9 z<8&YuB*BzG1c&#hTT&qsa_B%hoQjYL(7|p*qLKi6Y^qgid2bRSSwLti){9QoLW@Y_ zG%gWXaZrV;ni@c0EH8&*-aO+tg?=S@W}s$drymUZKz zZsg6Yzy$_OV_Mggns?`bh=_;(-G5=bgR+j0Z5i+T>k@<-nMquK7$E~qpp3uCphikQ z_~TFeM9@pvvE;G=&o0Aa?peL4N$>RJc>~Gcq>ntWV_YM%CcD_n>?XLAoGVZIq`+zD zo)(M?Gi@OI>%q_4KRx*K?!D?Scej6dxc%_!`DnsaNNKK|pYGRY^b1gGL7mktJ7->| z!Lm$L!?x!4HQOYLrZ#`#=rP$+Y`vt$EwNubdd!gPWKq4M7Mu8zYFV-dhH;+y9VHD+ zo1`S$R4B+szNivwBrXuvC5j7XNu~bM<-87!hESSrXf%9DwsghqF2(0Y21jXBvWY5} zhFk|UJg67d8Ur7}ZswQ^ff3W7vsk-Dk-nRpupnSEuNvkRQz@uMa*UXtsETbR;WLw? z1DVp?*oTAtXD7}jEuth#fUrb)jz%rjo+;;QDUmL4$NFgHVXL66Slg0*TVK4qJh~F= ztDN1y;f3LA!^RQt?)CqxGY$$bt39 zk=4kNwaDvF8GU#)a`+ozEfU}H^KGHsV9+1fg*fOrXv2ecp>0FM0ot{;qo(JTt%E$n ztoN*DPm~S>7GUzL9hH9wT6TSthT&DEIC+^3ibIKf`=&-(Rf$ zxKzDyue$W@4Eu=c=igUv-xob7i2$YfNHa$Tj~j`%I#434JhVkq?eld?95=}Prd1r7kAz{Oa1letD70jy?!~3?` zt}1a%0}Rg)j+e`28c>}1Nds4%iE6Q!A}rGBTxTzV^a07rYh8n_g8m60f7|uZr_uKH zXwPc2=d0PZ=&{P+1`aKxucaUDJNg*E0XE@|FRiG1z0Yuz3q0#-=el;@LO61BevR+?4GT90cX))m9nb#*5TU$f literal 0 HcmV?d00001 diff --git a/ocrmypdf-gui/src/__pycache__/main.cpython-39.pyc b/ocrmypdf-gui/src/__pycache__/main.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39c92f9be60cafeba6fc488276d89b492f571414 GIT binary patch literal 1322 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 Xl6%RH%{}SK_Yzi|Ef6^-&$E)&~v&P z>x`TsZOokcoWgWw995WcM9W!BeO}3!tMH*rWmIA8&j+&w`s#hUeeHqPQ^?CbO9Xjl~iyiC>!yus)VTjl&G|v`Hj>`t*TkE5%a93m=6yd^JBk z*Lv&J-H&em^V2t*SAV(k=hvZJSls{2-n+j)x^nf%-Lvl%)SltcX!`Izjn}^o5hzP) zpe?JB;_CH>7)Dn%8Yirik~RG-+3x8f^fa*e*SIHH zw~6&p-OrVZwyQ0ff;CA^ahl%2a2WE=t8R_k`SIoE>mSD*PNu`JeX-5TXJ?z|FRq^b-O80KVfu^hS{FWOow(h6 z<7#G5*yU;w!B7;5q8I!GWseKTbu0M=&vk`GwI1gNoC!PhJvUz~38Pe*sfxaR3$-c_ zp5?sCMbZzaYrIY?UEe`L%cmk`$%xcQi}Ypv5W*GTX74vZwHu*sExw~F4FeELOJ6oK zBctQ%5W=0Q4dYdVSl$_oPw}EZ+5I9nr3ymZox$#=$Fb*`$@I$Yx0`S^4-%^Y+noZDKs!)9Cn( z|J$e*09Jl_oRtazy20M8zII}D`ID~eZsCB8#|;CWu2##F>3EW@cdj(gyxV%?O!L=& z?6#T;2e5-}13CZ6blpg2pG=2z1a|uaFt=_nY`uN0dHe>@IGNs?aX6Xteh6VQZ#pdU z6qSeEHfr2gO2Mo|*9KK#fr-SkhYOyZD&K-u8Ix0IBDuECqOWKDgk6o-MW~*{Of0}+ zib!?(qursi#3zqR%25q%R2@dt0|DBII-m}#^(||$-rHNZ0+B6WXnH?b2AB>DSb4DQmvMm?1$h@SU!Uzv3Z0qw1!SIZ_ z_ymBMXaiASve{^q=(LwW)EbFb6Ko7XlqCs74M5x$K7_Sgk3S-y-sqD|H6;?|e5DxX zi=Hp+!feU)OAB!!;CZ3roD=$7ts?Y!9L@R+>6jPN!Hm<{ujMldPTbGGNrFy4o*}V= z#A76OlE{*H9O85JG2wK26c+RRdG8gG;?*D@cy3J&!z`4&d_@>@)oH&QjKN~f3rFAq zaU>H8Ii1tLYMr|}na*fDO+7peaWJId?6vCUvKT;;gRFe5=2aN=Q>w(6dJrvzj`N)p zeZ~MuN`S2S=Z{cT>|q}CQ}lCkLheGomNRK;zA)&A6C^fZhJOV*%JTdJ5Q^sLhVJN+ z7-D*e<-e?y0fKM}y7nK-B(ed_wy(kLp5tI0)@*d&#oCJ! zYegLEpc6vbqmi*Bb4y?cnIU1PD08DoU(yJF%NpMU8=V0~pd8XVQhPvZ6J2dmYGQjL|=R^h@#-GJDBl9yO6ZzoCymm(Aghz8J$sV9_0&&AchS2n}EwD;;yr2do z2U?s29{YjEp8=0n8;@kYHL})hL5!mf>s3n@SNm`7#OokQz z22AT(w#+9`;NODSTX(YA7%Th3 zLp>{TL`2j&@fT#6acVf3{#;ETm^0a)OO+OPs}0eH8huu8xx z8QD>C4v86VS!z_wXW=rO;RQJUbEOMZ|Z zC)rKq;@EG#@%GB{d)?+~JncM$m3VLNcl^fP^B*>Eom+4ErP&)fMCMV%4ZwE``Eq$W zUzksiQz<`P_GmPpop0WF7uOzKyPC&ufmv`VYn{5>I(w}tiDtYIa_&`vo#_C4RoI}<`LdljxhCCr6+thPva zm2ko1pk!R00&f9G3uk6Zhu1Ps{&kpV`s3s=(cM{*T-!5Al)0gM)?C=}CCnG5T*h1{ z->l*P6+*>k!*#BmkdjW)y0F{Jyn#_ge%J7`%k8VI?YgX5a9zF~c5)>o zuX8$1_-v3CCgf6*6O e)t7cXUS%ibS~z>+kv>WL>eJ{QOqvo1NBbYsHf1XS literal 0 HcmV?d00001 diff --git a/ocrmypdf-gui/src/core/config.py b/ocrmypdf-gui/src/core/config.py new file mode 100644 index 0000000..557a2eb --- /dev/null +++ b/ocrmypdf-gui/src/core/config.py @@ -0,0 +1,129 @@ +import json +import os +from pathlib import Path +import logging + +class Config: + """配置管理类,负责加载和保存应用程序配置""" + + def __init__(self): + self.logger = logging.getLogger(__name__) + self.config_dir = Path.home() / ".ocrmypdf-gui" + self.config_file = self.config_dir / "config.json" + self.default_config = { + "recent_files": [], + "recent_output_dirs": [], + "default_options": { + "deskew": True, + "rotate_pages": True, + "clean": False, + "output_type": "pdfa", + "jobs": 4 + }, + "ui": { + "theme": "system", + "language": "zh_CN" + } + } + self.current_config = self.default_config.copy() + self.load_config() + + def load_config(self): + """加载配置文件""" + if not self.config_dir.exists(): + self.config_dir.mkdir(parents=True, exist_ok=True) + + if self.config_file.exists(): + try: + with open(self.config_file, 'r', encoding='utf-8') as f: + loaded_config = json.load(f) + # 合并配置,保留默认值 + self._merge_config(self.current_config, loaded_config) + self.logger.info("配置文件加载成功") + except Exception as e: + self.logger.error(f"加载配置文件出错: {e}") + else: + self.logger.info("配置文件不存在,使用默认配置") + self.save_config() + + def save_config(self): + """保存配置文件""" + try: + with open(self.config_file, 'w', encoding='utf-8') as f: + json.dump(self.current_config, f, indent=2, ensure_ascii=False) + self.logger.info("配置文件保存成功") + except Exception as e: + self.logger.error(f"保存配置文件出错: {e}") + + def _merge_config(self, target, source): + """递归合并配置字典""" + for key, value in source.items(): + if key in target and isinstance(target[key], dict) and isinstance(value, dict): + self._merge_config(target[key], value) + else: + target[key] = value + + def get(self, key, default=None): + """获取配置项 + + Args: + key: 配置项键名,支持点号分隔的多级键名,如 'ui.theme' + default: 如果配置项不存在,返回的默认值 + + Returns: + 配置项的值 + """ + keys = key.split('.') + value = self.current_config + + for k in keys: + if isinstance(value, dict) and k in value: + value = value[k] + else: + return default + + return value + + def set(self, key, value): + """设置配置项 + + Args: + key: 配置项键名,支持点号分隔的多级键名,如 'ui.theme' + value: 配置项的值 + """ + keys = key.split('.') + target = self.current_config + + for i, k in enumerate(keys[:-1]): + if k not in target: + target[k] = {} + target = target[k] + + target[keys[-1]] = value + self.save_config() + + def add_recent_file(self, file_path): + """添加最近使用的文件 + + Args: + file_path: 文件路径 + """ + recent_files = self.get('recent_files', []) + if file_path in recent_files: + recent_files.remove(file_path) + recent_files.insert(0, file_path) + # 保留最近的10个文件 + self.set('recent_files', recent_files[:10]) + + def add_recent_output_dir(self, dir_path): + """添加最近使用的输出目录 + + Args: + dir_path: 目录路径 + """ + recent_dirs = self.get('recent_output_dirs', []) + if dir_path in recent_dirs: + recent_dirs.remove(dir_path) + recent_dirs.insert(0, dir_path) + # 保留最近的10个目录 + self.set('recent_output_dirs', recent_dirs[:10]) \ No newline at end of file diff --git a/ocrmypdf-gui/src/core/ocr_engine.py b/ocrmypdf-gui/src/core/ocr_engine.py new file mode 100644 index 0000000..312acbb --- /dev/null +++ b/ocrmypdf-gui/src/core/ocr_engine.py @@ -0,0 +1,119 @@ +import logging +import subprocess +from pathlib import Path +import sys +import os + +class OCREngine: + """OCR引擎类,封装OCRmyPDF的调用""" + + def __init__(self): + self.logger = logging.getLogger(__name__) + # 检查命令行工具是否可用 + try: + result = subprocess.run( + ["ocrmypdf", "--version"], + capture_output=True, + text=True, + check=False + ) + if result.returncode == 0: + self.logger.info(f"OCRmyPDF命令行工具可用: {result.stdout.strip()}") + else: + self.logger.warning("OCRmyPDF命令行工具返回错误") + except FileNotFoundError: + self.logger.error("OCRmyPDF命令行工具未找到") + + def process_file(self, input_file, output_file, options=None): + """ + 使用OCRmyPDF处理单个文件 + + Args: + input_file (str): 输入PDF文件路径 + output_file (str): 输出PDF文件路径 + options (dict): OCR选项 + + Returns: + bool: 处理是否成功 + """ + if options is None: + options = {} + + self.logger.info(f"处理文件: {input_file} -> {output_file}") + + # 构建命令行参数 + cmd = ["ocrmypdf"] + + # 添加语言选项 - 默认使用英文 + cmd.extend(["-l", "eng"]) + + # 添加其他选项 + if options.get('deskew', False): + cmd.append("--deskew") + + if options.get('rotate_pages', False): + cmd.append("--rotate-pages") + + if options.get('clean', False): + cmd.append("--clean") + + if 'jobs' in options: + cmd.extend(["--jobs", str(options['jobs'])]) + + if 'output_type' in options: + cmd.extend(["--output-type", options['output_type']]) + + # 添加输入和输出文件 + cmd.extend([str(input_file), str(output_file)]) + + # 执行命令 + self.logger.debug(f"执行命令: {' '.join(cmd)}") + try: + result = subprocess.run( + cmd, + capture_output=True, + text=True, + check=False + ) + if result.returncode == 0: + self.logger.info("OCRmyPDF命令执行成功") + return True + else: + self.logger.error(f"OCRmyPDF命令执行失败: {result.stderr}") + return False + except Exception as e: + self.logger.error(f"执行OCRmyPDF命令时出错: {e}") + return False + + def process_batch(self, file_list, output_dir, options=None, progress_callback=None): + """ + 批量处理文件 + + Args: + file_list (list): 输入文件列表 + output_dir (str): 输出目录 + options (dict): OCR选项 + progress_callback (callable): 进度回调函数,接收参数(current, total, file, success) + + Returns: + dict: 处理结果,键为输入文件路径,值为处理是否成功 + """ + results = {} + total = len(file_list) + + # 确保输出目录存在 + output_path = Path(output_dir) + output_path.mkdir(parents=True, exist_ok=True) + + for i, input_file in enumerate(file_list): + input_path = Path(input_file) + output_file = output_path / f"{input_path.stem}_ocr{input_path.suffix}" + + self.logger.info(f"处理文件 {i+1}/{total}: {input_file}") + success = self.process_file(input_file, output_file, options) + results[input_file] = success + + if progress_callback: + progress_callback(i + 1, total, input_file, success) + + return results \ No newline at end of file diff --git a/ocrmypdf-gui/src/gui/__init__.py b/ocrmypdf-gui/src/gui/__init__.py new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/ocrmypdf-gui/src/gui/__init__.py @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ocrmypdf-gui/src/gui/__pycache__/__init__.cpython-39.pyc b/ocrmypdf-gui/src/gui/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fdb6e7f2abf9c1a8a655991fc15c9437bfb3d1d6 GIT binary patch literal 154 zcmYe~<>g`kg1-V58H_;sF^Gctg&iZ> literal 0 HcmV?d00001 diff --git a/ocrmypdf-gui/src/gui/__pycache__/batch_dialog.cpython-39.pyc b/ocrmypdf-gui/src/gui/__pycache__/batch_dialog.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a760ac9c0af538ab78906d6c8cd4882dd114a8b1 GIT binary patch literal 10427 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 F{{dn;0wVwb literal 0 HcmV?d00001 diff --git a/ocrmypdf-gui/src/gui/__pycache__/settings.cpython-39.pyc b/ocrmypdf-gui/src/gui/__pycache__/settings.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4156eb84a6ce8d571a6f7f0ac5432cae03f37c9 GIT binary patch literal 5832 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 literal 0 HcmV?d00001 diff --git a/ocrmypdf-gui/src/gui/batch_dialog.py b/ocrmypdf-gui/src/gui/batch_dialog.py new file mode 100644 index 0000000..050abc6 --- /dev/null +++ b/ocrmypdf-gui/src/gui/batch_dialog.py @@ -0,0 +1,363 @@ +from PySide6.QtWidgets import ( + QDialog, QVBoxLayout, QHBoxLayout, QGroupBox, + QPushButton, QLabel, QFileDialog, QProgressBar, + QComboBox, QCheckBox, QListWidget, QMessageBox, + QRadioButton +) +from PySide6.QtCore import Qt, Signal, Slot, QThread +from pathlib import Path +import os + +from src.core.ocr_engine import OCREngine +from src.core.config import Config +from src.utils.file_utils import FileUtils + +class BatchOCRWorker(QThread): + """批量OCR处理线程""" + progress_updated = Signal(int, int, str, bool) + file_progress_updated = Signal(int, int) # 当前文件的进度 + finished = Signal(dict) + + def __init__(self, engine, files, output_dir, options): + super().__init__() + self.engine = engine + self.files = files + self.output_dir = output_dir + self.options = options + + def run(self): + results = self.engine.process_batch( + self.files, + self.output_dir, + self.options, + lambda current, total, file, success: self.progress_updated.emit(current, total, file, success) + ) + self.finished.emit(results) + +class BatchDialog(QDialog): + """批量处理对话框""" + + def __init__(self, parent=None): + super().__init__(parent) + self.setWindowTitle("批量OCR处理") + self.resize(700, 500) + + self.config = Config() + self.ocr_engine = OCREngine() + self.selected_files = [] + + self.init_ui() + + def init_ui(self): + """初始化UI""" + # 主布局 + main_layout = QVBoxLayout(self) + + # 文件选择区域 + file_group = QGroupBox("文件选择") + file_layout = QVBoxLayout(file_group) + + file_buttons_layout = QHBoxLayout() + self.add_files_btn = QPushButton("添加文件") + self.add_files_btn.clicked.connect(self.add_files) + self.add_folder_btn = QPushButton("添加文件夹") + self.add_folder_btn.clicked.connect(self.add_folder) + self.clear_files_btn = QPushButton("清除") + self.clear_files_btn.clicked.connect(self.clear_files) + self.select_all_btn = QPushButton("全选") + self.select_all_btn.clicked.connect(self.select_all_files) + + file_buttons_layout.addWidget(self.add_files_btn) + file_buttons_layout.addWidget(self.add_folder_btn) + file_buttons_layout.addWidget(self.clear_files_btn) + file_buttons_layout.addWidget(self.select_all_btn) + file_buttons_layout.addStretch() + + self.file_list = QListWidget() + self.file_list.setSelectionMode(QListWidget.SelectionMode.ExtendedSelection) + + file_layout.addLayout(file_buttons_layout) + file_layout.addWidget(self.file_list) + + # 输出选项 + output_group = QGroupBox("输出选项") + output_layout = QVBoxLayout(output_group) + + # 输出目录 + output_dir_layout = QHBoxLayout() + output_dir_layout.addWidget(QLabel("输出目录:")) + self.output_dir_edit = QComboBox() + self.output_dir_edit.setEditable(True) + self.output_dir_edit.addItems(self.config.get('recent_output_dirs', [])) + self.output_dir_btn = QPushButton("浏览...") + self.output_dir_btn.clicked.connect(self.select_output_dir) + output_dir_layout.addWidget(self.output_dir_edit, 1) + output_dir_layout.addWidget(self.output_dir_btn) + + # 输出文件命名 + naming_layout = QHBoxLayout() + naming_layout.addWidget(QLabel("输出文件命名:")) + self.naming_combo = QComboBox() + self.naming_combo.addItems(["原文件名_ocr", "原文件名", "自定义前缀_原文件名"]) + naming_layout.addWidget(self.naming_combo, 1) + + output_layout.addLayout(output_dir_layout) + output_layout.addLayout(naming_layout) + + # OCR选项 + ocr_group = QGroupBox("OCR选项") + ocr_layout = QVBoxLayout(ocr_group) + + # 使用配置文件 + config_layout = QHBoxLayout() + config_layout.addWidget(QLabel("使用配置文件:")) + self.config_combo = QComboBox() + self.config_combo.addItems(["默认配置"]) + self.save_config_btn = QPushButton("保存当前配置") + self.save_config_btn.clicked.connect(self.save_current_config) + config_layout.addWidget(self.config_combo, 1) + config_layout.addWidget(self.save_config_btn) + + # 处理选项 + self.deskew_cb = QCheckBox("自动校正倾斜页面") + self.deskew_cb.setChecked(self.config.get('default_options.deskew', True)) + + self.rotate_cb = QCheckBox("自动旋转页面") + self.rotate_cb.setChecked(self.config.get('default_options.rotate_pages', True)) + + self.clean_cb = QCheckBox("清理图像") + self.clean_cb.setChecked(self.config.get('default_options.clean', False)) + + self.optimize_cb = QCheckBox("优化输出文件大小") + self.optimize_cb.setChecked(self.config.get('default_options.optimize', True)) + + # 添加到布局 + ocr_layout.addLayout(config_layout) + ocr_layout.addWidget(self.deskew_cb) + ocr_layout.addWidget(self.rotate_cb) + ocr_layout.addWidget(self.clean_cb) + ocr_layout.addWidget(self.optimize_cb) + + # 进度条 + progress_group = QGroupBox("处理进度") + progress_layout = QVBoxLayout(progress_group) + + # 总进度 + total_progress_layout = QHBoxLayout() + total_progress_layout.addWidget(QLabel("总进度:")) + self.total_progress_bar = QProgressBar() + total_progress_layout.addWidget(self.total_progress_bar) + + # 当前文件进度 + file_progress_layout = QHBoxLayout() + file_progress_layout.addWidget(QLabel("当前文件:")) + self.file_progress_bar = QProgressBar() + file_progress_layout.addWidget(self.file_progress_bar) + + self.status_label = QLabel("准备就绪") + + progress_layout.addLayout(total_progress_layout) + progress_layout.addLayout(file_progress_layout) + progress_layout.addWidget(self.status_label) + + # 操作按钮 + buttons_layout = QHBoxLayout() + self.start_btn = QPushButton("开始批量处理") + self.start_btn.clicked.connect(self.start_batch_ocr) + self.cancel_btn = QPushButton("取消") + self.cancel_btn.clicked.connect(self.cancel_batch_ocr) + self.cancel_btn.setEnabled(False) + self.close_btn = QPushButton("关闭") + self.close_btn.clicked.connect(self.reject) + + buttons_layout.addStretch() + buttons_layout.addWidget(self.start_btn) + buttons_layout.addWidget(self.cancel_btn) + buttons_layout.addWidget(self.close_btn) + + # 添加所有元素到主布局 + main_layout.addWidget(file_group) + main_layout.addWidget(output_group) + main_layout.addWidget(ocr_group) + main_layout.addWidget(progress_group) + main_layout.addLayout(buttons_layout) + + def add_files(self): + """添加文件""" + files, _ = QFileDialog.getOpenFileNames( + self, + "选择PDF文件", + "", + "PDF文件 (*.pdf);;所有文件 (*.*)" + ) + + if files: + self.add_files_to_list(files) + + def add_folder(self): + """添加文件夹""" + folder = QFileDialog.getExistingDirectory( + self, + "选择包含PDF文件的文件夹" + ) + + if folder: + pdf_files = FileUtils.get_pdf_files_in_dir(folder, recursive=True) + if pdf_files: + self.add_files_to_list(pdf_files) + else: + QMessageBox.information(self, "提示", "所选文件夹中未找到PDF文件") + + def add_files_to_list(self, files): + """添加文件到列表""" + # 过滤已存在的文件 + new_files = [f for f in files if f not in self.selected_files] + if not new_files: + return + + self.selected_files.extend(new_files) + + # 更新列表显示 + self.file_list.clear() + for file in self.selected_files: + self.file_list.addItem(Path(file).name) + + # 更新状态 + self.status_label.setText(f"已添加 {len(self.selected_files)} 个文件") + + # 保存最近使用的文件 + for file in new_files: + self.config.add_recent_file(file) + + def clear_files(self): + """清除文件列表""" + self.selected_files = [] + self.file_list.clear() + self.status_label.setText("文件列表已清空") + + def select_all_files(self): + """全选文件""" + self.file_list.selectAll() + + def select_output_dir(self): + """选择输出目录""" + dir_path = QFileDialog.getExistingDirectory( + self, + "选择输出目录", + "" + ) + + if dir_path: + self.output_dir_edit.setCurrentText(dir_path) + self.config.add_recent_output_dir(dir_path) + + def save_current_config(self): + """保存当前配置""" + # 这里可以实现保存当前配置的功能 + QMessageBox.information(self, "提示", "配置保存功能尚未实现") + + def start_batch_ocr(self): + """开始批量OCR处理""" + if not self.selected_files: + QMessageBox.warning(self, "警告", "未选择文件") + return + + output_dir = self.output_dir_edit.currentText() + if not output_dir: + QMessageBox.warning(self, "警告", "未选择输出目录") + return + + # 确保输出目录存在 + if not FileUtils.ensure_dir(output_dir): + QMessageBox.critical(self, "错误", f"无法创建输出目录: {output_dir}") + return + + # 收集OCR选项 + options = { + "deskew": self.deskew_cb.isChecked(), + "rotate_pages": self.rotate_cb.isChecked(), + "clean": self.clean_cb.isChecked(), + "optimize": self.optimize_cb.isChecked() + } + + # 禁用UI元素 + self.start_btn.setEnabled(False) + self.cancel_btn.setEnabled(True) + self.add_files_btn.setEnabled(False) + self.add_folder_btn.setEnabled(False) + self.clear_files_btn.setEnabled(False) + self.select_all_btn.setEnabled(False) + self.output_dir_btn.setEnabled(False) + self.output_dir_edit.setEnabled(False) + + # 重置进度条 + self.total_progress_bar.setValue(0) + self.file_progress_bar.setValue(0) + self.status_label.setText("处理中...") + + # 创建并启动工作线程 + self.worker = BatchOCRWorker( + self.ocr_engine, + self.selected_files, + output_dir, + options + ) + self.worker.progress_updated.connect(self.update_progress) + self.worker.file_progress_updated.connect(self.update_file_progress) + self.worker.finished.connect(self.ocr_finished) + self.worker.start() + + def cancel_batch_ocr(self): + """取消批量OCR处理""" + if hasattr(self, 'worker') and self.worker.isRunning(): + self.worker.terminate() + self.worker.wait() + self.status_label.setText("处理已取消") + + # 启用UI元素 + self.enable_ui() + + def enable_ui(self): + """启用UI元素""" + self.start_btn.setEnabled(True) + self.cancel_btn.setEnabled(False) + self.add_files_btn.setEnabled(True) + self.add_folder_btn.setEnabled(True) + self.clear_files_btn.setEnabled(True) + self.select_all_btn.setEnabled(True) + self.output_dir_btn.setEnabled(True) + self.output_dir_edit.setEnabled(True) + + @Slot(int, int, str, bool) + def update_progress(self, current, total, file, success): + """更新总进度""" + percent = int(current * 100 / total) + self.total_progress_bar.setValue(percent) + + file_name = Path(file).name + status = "成功" if success else "失败" + self.status_label.setText(f"处理 {file_name}: {status} ({current}/{total})") + + @Slot(int, int) + def update_file_progress(self, current, total): + """更新当前文件进度""" + percent = int(current * 100 / total) if total > 0 else 0 + self.file_progress_bar.setValue(percent) + + @Slot(dict) + def ocr_finished(self, results): + """OCR处理完成""" + success_count = sum(1 for success in results.values() if success) + total_count = len(results) + + self.status_label.setText(f"处理完成: {success_count}/{total_count} 文件成功") + + # 启用UI元素 + self.enable_ui() + + # 显示完成消息 + QMessageBox.information( + self, + "处理完成", + f"批量OCR处理已完成\n成功: {success_count} 文件\n失败: {total_count - success_count} 文件" + ) \ No newline at end of file diff --git a/ocrmypdf-gui/src/gui/main_window.py b/ocrmypdf-gui/src/gui/main_window.py new file mode 100644 index 0000000..b0a617b --- /dev/null +++ b/ocrmypdf-gui/src/gui/main_window.py @@ -0,0 +1,417 @@ +import sys +import logging +from pathlib import Path + +from PySide6.QtWidgets import ( + QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, + QPushButton, QLabel, QFileDialog, QProgressBar, + QComboBox, QCheckBox, QGroupBox, QListWidget, + QMessageBox, QStatusBar, QMenu, QMenuBar +) +from PySide6.QtCore import Qt, Signal, Slot, QThread +from PySide6.QtGui import QIcon, QDragEnterEvent, QDropEvent, QAction + +from src.core.ocr_engine import OCREngine +from src.core.config import Config +from src.utils.file_utils import FileUtils +from src.gui.settings import SettingsDialog +from src.gui.batch_dialog import BatchDialog + +class OCRWorker(QThread): + """OCR处理线程""" + progress_updated = Signal(int, int, str, bool) + finished = Signal(dict) + + def __init__(self, engine, files, output_dir, options): + super().__init__() + self.engine = engine + self.files = files + self.output_dir = output_dir + self.options = options + + def run(self): + results = self.engine.process_batch( + self.files, + self.output_dir, + self.options, + lambda current, total, file, success: self.progress_updated.emit(current, total, file, success) + ) + self.finished.emit(results) + +class MainWindow(QMainWindow): + """主窗口类""" + + def __init__(self): + super().__init__() + self.logger = logging.getLogger(__name__) + self.setWindowTitle("OCRmyPDF GUI") + self.resize(800, 600) + self.setAcceptDrops(True) # 启用拖放 + + self.config = Config() + self.ocr_engine = OCREngine() + self.selected_files = [] + + self.init_ui() + self.logger.info("主窗口初始化完成") + + def init_ui(self): + """初始化UI""" + # 创建菜单栏 + self.create_menu_bar() + + # 创建状态栏 + self.statusBar = QStatusBar() + self.setStatusBar(self.statusBar) + self.statusBar.showMessage("就绪") + + # 创建中央部件 + central_widget = QWidget() + self.setCentralWidget(central_widget) + + # 主布局 + main_layout = QVBoxLayout(central_widget) + + # 文件选择区域 + file_group = QGroupBox("文件选择") + file_layout = QVBoxLayout(file_group) + + file_buttons_layout = QHBoxLayout() + self.add_files_btn = QPushButton("添加文件") + self.add_files_btn.clicked.connect(self.add_files) + self.add_folder_btn = QPushButton("添加文件夹") + self.add_folder_btn.clicked.connect(self.add_folder) + self.clear_files_btn = QPushButton("清除文件") + self.clear_files_btn.clicked.connect(self.clear_files) + file_buttons_layout.addWidget(self.add_files_btn) + file_buttons_layout.addWidget(self.add_folder_btn) + file_buttons_layout.addWidget(self.clear_files_btn) + file_buttons_layout.addStretch() + + self.file_list = QListWidget() + self.file_list.setSelectionMode(QListWidget.SelectionMode.ExtendedSelection) + + file_layout.addLayout(file_buttons_layout) + file_layout.addWidget(self.file_list) + + # 输出目录选择 + output_layout = QHBoxLayout() + output_layout.addWidget(QLabel("输出目录:")) + self.output_dir_edit = QComboBox() + self.output_dir_edit.setEditable(True) + self.output_dir_edit.addItems(self.config.get('recent_output_dirs', [])) + self.output_dir_btn = QPushButton("浏览...") + self.output_dir_btn.clicked.connect(self.select_output_dir) + output_layout.addWidget(self.output_dir_edit, 1) + output_layout.addWidget(self.output_dir_btn) + + # OCR选项 + options_group = QGroupBox("OCR选项") + options_layout = QVBoxLayout(options_group) + + # 处理选项 + self.deskew_cb = QCheckBox("自动校正倾斜页面") + self.deskew_cb.setChecked(self.config.get('default_options.deskew', True)) + self.rotate_cb = QCheckBox("自动旋转页面") + self.rotate_cb.setChecked(self.config.get('default_options.rotate_pages', True)) + self.clean_cb = QCheckBox("清理图像") + self.clean_cb.setChecked(self.config.get('default_options.clean', False)) + self.optimize_cb = QCheckBox("优化输出文件大小") + self.optimize_cb.setChecked(self.config.get('default_options.optimize', True)) + + options_layout.addWidget(self.deskew_cb) + options_layout.addWidget(self.rotate_cb) + options_layout.addWidget(self.clean_cb) + options_layout.addWidget(self.optimize_cb) + + # 进度条 + progress_layout = QVBoxLayout() + self.progress_bar = QProgressBar() + self.progress_bar.setRange(0, 100) + self.progress_bar.setValue(0) + self.status_label = QLabel("准备就绪") + progress_layout.addWidget(self.progress_bar) + progress_layout.addWidget(self.status_label) + + # 操作按钮 + buttons_layout = QHBoxLayout() + self.start_btn = QPushButton("开始OCR处理") + self.start_btn.clicked.connect(self.start_ocr) + self.cancel_btn = QPushButton("取消") + self.cancel_btn.clicked.connect(self.cancel_ocr) + self.cancel_btn.setEnabled(False) + buttons_layout.addStretch() + buttons_layout.addWidget(self.start_btn) + buttons_layout.addWidget(self.cancel_btn) + + # 添加所有元素到主布局 + main_layout.addWidget(file_group) + main_layout.addLayout(output_layout) + main_layout.addWidget(options_group) + main_layout.addLayout(progress_layout) + main_layout.addLayout(buttons_layout) + + def create_menu_bar(self): + """创建菜单栏""" + menu_bar = QMenuBar() + self.setMenuBar(menu_bar) + + # 文件菜单 + file_menu = QMenu("文件(&F)", self) + menu_bar.addMenu(file_menu) + + add_files_action = QAction("添加文件(&A)...", self) + add_files_action.triggered.connect(self.add_files) + file_menu.addAction(add_files_action) + + add_folder_action = QAction("添加文件夹(&D)...", self) + add_folder_action.triggered.connect(self.add_folder) + file_menu.addAction(add_folder_action) + + file_menu.addSeparator() + + batch_action = QAction("批量处理(&B)...", self) + batch_action.triggered.connect(self.show_batch_dialog) + file_menu.addAction(batch_action) + + file_menu.addSeparator() + + exit_action = QAction("退出(&X)", self) + exit_action.triggered.connect(self.close) + file_menu.addAction(exit_action) + + # 编辑菜单 + edit_menu = QMenu("编辑(&E)", self) + menu_bar.addMenu(edit_menu) + + clear_action = QAction("清除文件列表(&C)", self) + clear_action.triggered.connect(self.clear_files) + edit_menu.addAction(clear_action) + + settings_action = QAction("设置(&S)...", self) + settings_action.triggered.connect(self.show_settings) + edit_menu.addAction(settings_action) + + # 帮助菜单 + help_menu = QMenu("帮助(&H)", self) + menu_bar.addMenu(help_menu) + + about_action = QAction("关于(&A)", self) + about_action.triggered.connect(self.show_about) + help_menu.addAction(about_action) + + def add_files(self): + """添加文件""" + files, _ = QFileDialog.getOpenFileNames( + self, + "选择PDF文件", + "", + "PDF文件 (*.pdf);;所有文件 (*.*)" + ) + + if files: + self.add_files_to_list(files) + + def add_folder(self): + """添加文件夹""" + folder = QFileDialog.getExistingDirectory( + self, + "选择包含PDF文件的文件夹" + ) + + if folder: + pdf_files = FileUtils.get_pdf_files_in_dir(folder, recursive=True) + if pdf_files: + self.add_files_to_list(pdf_files) + else: + QMessageBox.information(self, "提示", "所选文件夹中未找到PDF文件") + + def add_files_to_list(self, files): + """添加文件到列表""" + # 过滤已存在的文件 + new_files = [f for f in files if f not in self.selected_files] + if not new_files: + return + + self.selected_files.extend(new_files) + + # 更新列表显示 + self.file_list.clear() + for file in self.selected_files: + self.file_list.addItem(Path(file).name) + + # 更新状态 + self.status_label.setText(f"已添加 {len(self.selected_files)} 个文件") + self.statusBar.showMessage(f"已添加 {len(self.selected_files)} 个文件") + + # 保存最近使用的文件 + for file in new_files: + self.config.add_recent_file(file) + + def clear_files(self): + """清除文件列表""" + self.selected_files = [] + self.file_list.clear() + self.status_label.setText("文件列表已清空") + self.statusBar.showMessage("文件列表已清空") + + def select_output_dir(self): + """选择输出目录""" + dir_path = QFileDialog.getExistingDirectory( + self, + "选择输出目录", + "" + ) + + if dir_path: + self.output_dir_edit.setCurrentText(dir_path) + self.config.add_recent_output_dir(dir_path) + + def start_ocr(self): + """开始OCR处理""" + if not self.selected_files: + QMessageBox.warning(self, "警告", "未选择文件") + return + + output_dir = self.output_dir_edit.currentText() + if not output_dir: + QMessageBox.warning(self, "警告", "未选择输出目录") + return + + # 确保输出目录存在 + if not FileUtils.ensure_dir(output_dir): + QMessageBox.critical(self, "错误", f"无法创建输出目录: {output_dir}") + return + + # 收集OCR选项 + options = { + "deskew": self.deskew_cb.isChecked(), + "rotate_pages": self.rotate_cb.isChecked(), + "clean": self.clean_cb.isChecked(), + "optimize": self.optimize_cb.isChecked() + } + + # 禁用UI元素 + self.start_btn.setEnabled(False) + self.cancel_btn.setEnabled(True) + self.add_files_btn.setEnabled(False) + self.add_folder_btn.setEnabled(False) + self.clear_files_btn.setEnabled(False) + self.output_dir_btn.setEnabled(False) + self.output_dir_edit.setEnabled(False) + self.progress_bar.setValue(0) + self.status_label.setText("处理中...") + self.statusBar.showMessage("OCR处理中...") + + # 创建并启动工作线程 + self.worker = OCRWorker( + self.ocr_engine, + self.selected_files, + output_dir, + options + ) + self.worker.progress_updated.connect(self.update_progress) + self.worker.finished.connect(self.ocr_finished) + self.worker.start() + + def cancel_ocr(self): + """取消OCR处理""" + if hasattr(self, 'worker') and self.worker.isRunning(): + self.worker.terminate() + self.worker.wait() + self.status_label.setText("处理已取消") + self.statusBar.showMessage("OCR处理已取消") + + # 启用UI元素 + self.enable_ui() + + def enable_ui(self): + """启用UI元素""" + self.start_btn.setEnabled(True) + self.cancel_btn.setEnabled(False) + self.add_files_btn.setEnabled(True) + self.add_folder_btn.setEnabled(True) + self.clear_files_btn.setEnabled(True) + self.output_dir_btn.setEnabled(True) + self.output_dir_edit.setEnabled(True) + + @Slot(int, int, str, bool) + def update_progress(self, current, total, file, success): + """更新进度""" + percent = int(current * 100 / total) + self.progress_bar.setValue(percent) + + file_name = Path(file).name + status = "成功" if success else "失败" + self.status_label.setText(f"处理 {file_name}: {status} ({current}/{total})") + self.statusBar.showMessage(f"处理 {file_name}: {status} ({current}/{total})") + + @Slot(dict) + def ocr_finished(self, results): + """OCR处理完成""" + success_count = sum(1 for success in results.values() if success) + total_count = len(results) + + self.status_label.setText(f"处理完成: {success_count}/{total_count} 文件成功") + self.statusBar.showMessage(f"OCR处理完成: {success_count}/{total_count} 文件成功") + + # 启用UI元素 + self.enable_ui() + + # 显示完成消息 + QMessageBox.information( + self, + "处理完成", + f"OCR处理已完成\n成功: {success_count} 文件\n失败: {total_count - success_count} 文件" + ) + + def show_settings(self): + """显示设置对话框""" + dialog = SettingsDialog(self) + if dialog.exec(): + # 更新UI以反映新设置 + self.deskew_cb.setChecked(self.config.get('default_options.deskew', True)) + self.rotate_cb.setChecked(self.config.get('default_options.rotate_pages', True)) + self.clean_cb.setChecked(self.config.get('default_options.clean', False)) + self.optimize_cb.setChecked(self.config.get('default_options.optimize', True)) + + def show_batch_dialog(self): + """显示批量处理对话框""" + dialog = BatchDialog(self) + dialog.exec() + + def show_about(self): + """显示关于对话框""" + QMessageBox.about( + self, + "关于 OCRmyPDF GUI", + "OCRmyPDF GUI v0.1.0\n\n" + "OCRmyPDF的图形用户界面\n\n" + "基于OCRmyPDF开源项目\n" + "https://github.com/ocrmypdf/OCRmyPDF" + ) + + def dragEnterEvent(self, event: QDragEnterEvent): + """拖拽进入事件""" + if event.mimeData().hasUrls(): + event.acceptProposedAction() + + def dropEvent(self, event: QDropEvent): + """拖拽放下事件""" + urls = event.mimeData().urls() + files = [] + + for url in urls: + path = url.toLocalFile() + if Path(path).is_dir(): + # 如果是目录,获取目录中的所有PDF文件 + pdf_files = FileUtils.get_pdf_files_in_dir(path, recursive=True) + files.extend(pdf_files) + elif FileUtils.is_valid_pdf(path): + # 如果是PDF文件,直接添加 + files.append(path) + + if files: + self.add_files_to_list(files) + + event.acceptProposedAction() \ No newline at end of file diff --git a/ocrmypdf-gui/src/gui/settings.py b/ocrmypdf-gui/src/gui/settings.py new file mode 100644 index 0000000..5aeef56 --- /dev/null +++ b/ocrmypdf-gui/src/gui/settings.py @@ -0,0 +1,211 @@ +from PySide6.QtWidgets import ( + QDialog, QVBoxLayout, QHBoxLayout, QTabWidget, + QPushButton, QLabel, QComboBox, QCheckBox, + QGroupBox, QSpinBox, QRadioButton +) +from PySide6.QtCore import Qt + +from src.core.config import Config + +class SettingsDialog(QDialog): + """设置对话框""" + + def __init__(self, parent=None): + super().__init__(parent) + self.setWindowTitle("设置") + self.resize(500, 400) + + self.config = Config() + self.init_ui() + + def init_ui(self): + """初始化UI""" + # 主布局 + main_layout = QVBoxLayout(self) + + # 创建选项卡 + tab_widget = QTabWidget() + main_layout.addWidget(tab_widget) + + # 常规选项卡 + general_tab = QWidget() + tab_widget.addTab(general_tab, "常规") + self.setup_general_tab(general_tab) + + # OCR选项卡 + ocr_tab = QWidget() + tab_widget.addTab(ocr_tab, "OCR") + self.setup_ocr_tab(ocr_tab) + + # 界面选项卡 + ui_tab = QWidget() + tab_widget.addTab(ui_tab, "界面") + self.setup_ui_tab(ui_tab) + + # 按钮区域 + button_layout = QHBoxLayout() + button_layout.addStretch() + + self.ok_btn = QPushButton("确定") + self.ok_btn.clicked.connect(self.accept) + self.cancel_btn = QPushButton("取消") + self.cancel_btn.clicked.connect(self.reject) + + button_layout.addWidget(self.ok_btn) + button_layout.addWidget(self.cancel_btn) + + main_layout.addLayout(button_layout) + + def setup_general_tab(self, tab): + """设置常规选项卡""" + layout = QVBoxLayout(tab) + + # 启动选项 + startup_group = QGroupBox("启动选项") + startup_layout = QVBoxLayout(startup_group) + + self.check_update_cb = QCheckBox("启动时检查更新") + self.check_update_cb.setChecked(self.config.get('general.check_update_on_startup', False)) + + self.show_welcome_cb = QCheckBox("显示欢迎页面") + self.show_welcome_cb.setChecked(self.config.get('general.show_welcome', True)) + + self.remember_window_cb = QCheckBox("记住窗口大小和位置") + self.remember_window_cb.setChecked(self.config.get('general.remember_window_geometry', True)) + + startup_layout.addWidget(self.check_update_cb) + startup_layout.addWidget(self.show_welcome_cb) + startup_layout.addWidget(self.remember_window_cb) + + # 文件历史 + history_group = QGroupBox("文件历史") + history_layout = QVBoxLayout(history_group) + + recent_files_layout = QHBoxLayout() + recent_files_layout.addWidget(QLabel("最近文件数量:")) + self.recent_files_spin = QSpinBox() + self.recent_files_spin.setRange(0, 30) + self.recent_files_spin.setValue(self.config.get('general.max_recent_files', 10)) + recent_files_layout.addWidget(self.recent_files_spin) + recent_files_layout.addStretch() + + self.clear_history_btn = QPushButton("清除历史记录") + self.clear_history_btn.clicked.connect(self.clear_history) + + history_layout.addLayout(recent_files_layout) + history_layout.addWidget(self.clear_history_btn) + + layout.addWidget(startup_group) + layout.addWidget(history_group) + layout.addStretch() + + def setup_ocr_tab(self, tab): + """设置OCR选项卡""" + layout = QVBoxLayout(tab) + + # 默认选项 + options_group = QGroupBox("默认处理选项") + options_layout = QVBoxLayout(options_group) + + self.deskew_cb = QCheckBox("自动校正倾斜页面") + self.deskew_cb.setChecked(self.config.get('default_options.deskew', True)) + + self.rotate_cb = QCheckBox("自动旋转页面") + self.rotate_cb.setChecked(self.config.get('default_options.rotate_pages', True)) + + self.clean_cb = QCheckBox("清理图像") + self.clean_cb.setChecked(self.config.get('default_options.clean', False)) + + self.optimize_cb = QCheckBox("优化输出文件大小") + self.optimize_cb.setChecked(self.config.get('default_options.optimize', True)) + + options_layout.addWidget(self.deskew_cb) + options_layout.addWidget(self.rotate_cb) + options_layout.addWidget(self.clean_cb) + options_layout.addWidget(self.optimize_cb) + + # 输出类型 + output_group = QGroupBox("默认输出类型") + output_layout = QVBoxLayout(output_group) + + self.output_type_combo = QComboBox() + self.output_type_combo.addItems(["pdf", "pdfa", "pdfa-1", "pdfa-2", "pdfa-3"]) + self.output_type_combo.setCurrentText(self.config.get('default_options.output_type', 'pdfa')) + + output_layout.addWidget(self.output_type_combo) + + layout.addWidget(options_group) + layout.addWidget(output_group) + layout.addStretch() + + def setup_ui_tab(self, tab): + """设置界面选项卡""" + layout = QVBoxLayout(tab) + + # 语言 + language_group = QGroupBox("界面语言") + language_layout = QVBoxLayout(language_group) + + self.ui_language_combo = QComboBox() + self.ui_language_combo.addItems(["简体中文", "English"]) + current_lang = "简体中文" if self.config.get('ui.language') == 'zh_CN' else "English" + self.ui_language_combo.setCurrentText(current_lang) + + language_layout.addWidget(self.ui_language_combo) + + # 主题 + theme_group = QGroupBox("主题") + theme_layout = QVBoxLayout(theme_group) + + self.light_theme_rb = QRadioButton("浅色") + self.dark_theme_rb = QRadioButton("深色") + self.system_theme_rb = QRadioButton("跟随系统") + + current_theme = self.config.get('ui.theme', 'system') + if current_theme == 'light': + self.light_theme_rb.setChecked(True) + elif current_theme == 'dark': + self.dark_theme_rb.setChecked(True) + else: + self.system_theme_rb.setChecked(True) + + theme_layout.addWidget(self.light_theme_rb) + theme_layout.addWidget(self.dark_theme_rb) + theme_layout.addWidget(self.system_theme_rb) + + layout.addWidget(language_group) + layout.addWidget(theme_group) + layout.addStretch() + + def clear_history(self): + """清除历史记录""" + self.config.set('recent_files', []) + self.config.set('recent_output_dirs', []) + + def accept(self): + """确定按钮点击事件""" + # 保存常规设置 + self.config.set('general.check_update_on_startup', self.check_update_cb.isChecked()) + self.config.set('general.show_welcome', self.show_welcome_cb.isChecked()) + self.config.set('general.remember_window_geometry', self.remember_window_cb.isChecked()) + self.config.set('general.max_recent_files', self.recent_files_spin.value()) + + # 保存OCR设置 + self.config.set('default_options.deskew', self.deskew_cb.isChecked()) + self.config.set('default_options.rotate_pages', self.rotate_cb.isChecked()) + self.config.set('default_options.clean', self.clean_cb.isChecked()) + self.config.set('default_options.optimize', self.optimize_cb.isChecked()) + self.config.set('default_options.output_type', self.output_type_combo.currentText()) + + # 保存界面设置 + ui_lang = 'zh_CN' if self.ui_language_combo.currentText() == '简体中文' else 'en_US' + self.config.set('ui.language', ui_lang) + + if self.light_theme_rb.isChecked(): + self.config.set('ui.theme', 'light') + elif self.dark_theme_rb.isChecked(): + self.config.set('ui.theme', 'dark') + else: + self.config.set('ui.theme', 'system') + + super().accept() diff --git a/ocrmypdf-gui/src/gui/widgets/__init__.py b/ocrmypdf-gui/src/gui/widgets/__init__.py new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/ocrmypdf-gui/src/gui/widgets/__init__.py @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ocrmypdf-gui/src/main.py b/ocrmypdf-gui/src/main.py new file mode 100644 index 0000000..86ed824 --- /dev/null +++ b/ocrmypdf-gui/src/main.py @@ -0,0 +1,48 @@ +import sys +import logging +from pathlib import Path +from PySide6.QtWidgets import QApplication +from PySide6.QtCore import QTranslator, QLocale + +from src.gui.main_window import MainWindow +from src.core.config import Config + +def setup_logging(): + """设置日志系统""" + log_dir = Path.home() / ".ocrmypdf-gui" + log_dir.mkdir(exist_ok=True, parents=True) + log_file = log_dir / "ocrmypdf-gui.log" + + logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + handlers=[ + logging.StreamHandler(), + logging.FileHandler(log_file) + ] + ) + +def main(): + """程序入口""" + # 设置日志 + setup_logging() + logger = logging.getLogger(__name__) + logger.info("启动 OCRmyPDF GUI") + + # 创建应用 + app = QApplication(sys.argv) + app.setApplicationName("OCRmyPDF GUI") + app.setOrganizationName("OCRmyPDF") + + # 加载配置 + config = Config() + + # 创建并显示主窗口 + window = MainWindow() + window.show() + + # 运行应用 + sys.exit(app.exec()) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/ocrmypdf-gui/src/utils/__init__.py b/ocrmypdf-gui/src/utils/__init__.py new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/ocrmypdf-gui/src/utils/__init__.py @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ocrmypdf-gui/src/utils/__pycache__/__init__.cpython-39.pyc b/ocrmypdf-gui/src/utils/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..92374e478e4c9f683a6db2ddc7161529d00a06ae GIT binary patch literal 156 zcmYe~<>g`k0!~4T3`QXR7{oyaAVCKpE@lA|DGb33nv8xc8Hzx{2;!HcerR!OQL%nX zYF>U>esV@?o_;`4epYI7NwI!@a*@8jb5L$&fQy^1d#I;=aZ$2%^ literal 0 HcmV?d00001 diff --git a/ocrmypdf-gui/src/utils/__pycache__/file_utils.cpython-39.pyc b/ocrmypdf-gui/src/utils/__pycache__/file_utils.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..418d99a3ef11bea39ab458ca3b4f98db78a1efa0 GIT binary patch literal 3257 zcmbVO>u(%a6~Fh+V;|m_Bv|H=60NENT}169h^n$86rAFKpl(zrvbri7HalZ`htE1q5F6W{xZ-3z$ zb0K7i0gT&h}43=Lm}TBr2QPyvmC4KQD6hMODmbMUBT} zdQm^dY|Yjen61x?qG9tfRxs{CmW>v;(vO$?sWSDpe>yrxP`pu84kNuqVe_Kq=(e!6 z1vbx%2HLu9L~Rr8UOQ!{7dU28=w<9|G?PZV$IeCVjJ*qce??_RDplvCU#WWaA3%Tm z%~#j&eiYum9=>wB^WNQmfAX95#ijL6m*esF?=Gybt#p>}gs*(i`NKl^>#G~{Yh@0( z%}<~~S9TP|JAtb4b)N+=@ie#TCoTxi#&J<&OlQ8B8|AFYIcx0qwN>5L0=~?yh!#f1 z+4H!hCVz?B##py?fE_>!W}Ed-XrFxd>$Kik|NE8B@;l+$8{y5%;mX^vJG}97`;RN@ zcP_*u;o|SZ#pUqs$B9(Z__3VyhLRrXv@6n@g)fHkvC@s(x57^sb}UIc&pCcw*6veq z%5|$l`S`lpmv4njH`t_yqE9hjlKj;16xaX0EAvl8YKeA%V@;#SmiC|?Iu|G zg5a{MwHN>aD0ttY(Z;ZE1b931;^JdX9`IGu)?2(O0%04|Vw?$Pn>rvhkGD3?#@IpT zy>Ni>==VJ8aaQXC;8JtJ<``)OoJ_zeRsRPJNqp1()A{z*>s`dh&bxf8z4BW7jYWVS zcN9-0>yyUkffQX|jHFoT%OdFum@(4O2WIUFCFH4l2F~MA^=)$LXdxYg$BcmHDb4ex zGOF%5M*@5`+dEhBrfr(V#ST2pTtfq~xRO%t-(JP*u$teNtSRWnGnxI7$) z)s&wOQuCbn=FH(U1GNEY&9oS#9&4I`xthgJGLkSMA-fW0R|0*2hu7OMF~PvbZ*PYe z-;7`H`kk8qO#8L-0MGvgo6Yz8U-(Bl<+}7LXC2T?1de;>Uk}$_Z!fKMK71>@xfENF zm_@9XbRI}qRZ!4SJ~1-}YPfi5qxE(oSm=pxB=_LN%7h1riiGPa{amR!E$MB`Z$@*a zSzyVQd#RJE_>QENDM%2Y07r@uDw7;SWdNOM4!Wf4`ifi1ptb1JpZpr>z7KePla5cA ziv_JpjqLd$7J84MVmY0s#cr+(o%iu{1j0U%16l1Bjs06de2|idQ`Q6&H-522TBk)5 zaSe$19>@ssZJNm^@vki-AO`}`OcN3P5K3+FEkwIBecgHE3WzI;gWBA$5?TTwftFH0 zR=WOAY?fSpjI5YO!fSsH-@Qm7_~xa~-)^kmc^_`-T>C=7jjppB-M%Czfjxk_I8%rW zNvw$DZvN4O1Bdd@3_qIKUN96NE{dO{JcDu!<;3tLIf=2QBMoif;KXM<-_Y{MhwJ3z z_R3#7SFgvX94+WEd+DBE@>L3v(yKI_E=5JaP&$ni^?I%1-w%>K z$fVHKE7HJ5KhKI@BB*^kaj`>g2T2julSGFyv&LQ@)D*zYt(_^(Pm$taq?_U(V(mzA zw5E7TP*P(@ttiFO;C!RLMmx~Er7yg8Azb_@zVl=-X?#BLAcDh1A1^)B!#2HkkVJd+ z)rYQ0^goa={&$WOr!(6u54WW=%Jilvu~0_Yot--rxlN8olrB zXGkjY>ojKLOe9B