PDF-AI-Viewer

AGENTS.md — 给 AI 助手的项目说明

本文件面向后续进入此仓库的 AI 助手 / 开发者,提供工程上下文与约定,避免重复摸索。 面向用户的介绍请看 README.md。

项目是什么

一个类似「知云文献翻译」的桌面 PDF 阅读翻译工具,Python + PyQt6 开发。 左侧阅读 PDF(可刷选文本),右侧显示翻译结果;支持多翻译引擎、AI 总结、 边读边问的多轮 AI 问答(问答追加到同名 .md 笔记)、阅读位置记忆。

技术栈与依赖

依赖清单见 requirements.txt。

项目结构

main.py          # 主窗口:分栏布局、工具栏、菜单栏、翻译/总结/问答线程、浮动按钮、全局样式
pdf_viewer.py    # PDF 阅读器:按需渲染、刷选、缩放、链接点击
translator.py    # 翻译引擎:Edge / OpenAI 兼容大模型 / MyMemory,流式总结与多轮对话
chat_window.py   # AI 阅读问答:浮动对话窗口(气泡 HTML 渲染、流式显示、字号/主题)
chat_log.py      # 问答记录读写:与 PDF 同目录同名的 .md 笔记
latex_fallback.py # LaTeX 公式 → Unicode 兜底转换(总结与问答共用)
settings.py      # 配置存储:阅读位置、最近历史、界面设置、大模型配置、问答笔记回退目录
make_logo.py     # Logo 生成脚本(logo.ico / logo.png)

运行

python main.py

打包(重要)

用 PyInstaller,必须通过 spec 文件打包,不要直接 pyinstaller main.py:

pyinstaller --noconfirm "PDF阅读翻译器.spec"

产物在 dist/PDF阅读翻译器.exe。

打包陷阱(务必遵守)

  1. 必须保留 spec 里的 excludes 列表。PyMuPDF 的 pymupdf.table 模块会 import pandas, 进而拖入 numpy / matplotlib / lxml / openpyxl / fontTools 等一整套数据科学库, 导致 exe 从 ~65MB 膨胀到 ~110MB,超过 GitHub 100MB 文件限制导致无法推送。 本项目只用 pymupdf 渲染 PDF,不需要这些库,已在 spec 中排除。
  2. exe 约 65MB,超过 GitHub 50MB 推荐上限但低于 100MB 硬限制,可正常推送(会有警告)。
  3. 若改动后 exe 体积异常增大,先检查是否又引入了被排除的依赖。
  4. 打包后窗口/任务栏图标:窗口/任务栏图标由 exe 运行时加载 logo.ico,必须在 spec 的 Analysis.datas 里把 logo.ico/logo.png 打包进去(datas=[('logo.ico', '.'), ('logo.png', '.')]), 并且代码里用 resource_path()(基于 sys._MEIPASS)解析,直接拼 __file__ 目录在冻结环境找不到。 spec 里 EXE 的 icon=['logo.ico'] 只影响 exe 文件本身的图标,不影响运行时任务栏图标。 另外 PyQt6 没有 QApplication.setAppUserModelID(会 AttributeError),设置 Windows 任务栏 AppUserModelID 需用 ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(见 main())。

标准工作流(每次改代码后都要做)

每次修改代码后,必须重新打包并上传到 GitHub,否则仓库里的 exe 与源码不一致。 完整发布流程如下(按顺序执行):

  1. 清理不需要的文件:删除本次改动产生的临时/无用文件(如调试脚本、临时图片、备份文件等), 保持仓库整洁。注意 dist/PDF阅读翻译器.exe 和 *.spec 是被 git 跟踪的,不要误删。
  2. 更新文档:若功能有增删改,同步更新 README.md(面向用户的功能/使用说明)和 AGENTS.md(面向 AI 助手/开发者的工程约定与坑)。README 保持中英双语。
  3. 重新打包:pyinstaller --noconfirm "PDF阅读翻译器.spec"
  4. 确认体积:检查 dist/PDF阅读翻译器.exe 小于 100MB(GitHub 硬限制,超过会拒绝推送)
  5. 提交并推送:git add 源码 + spec + exe + 两个 md,然后 git commit + git push

若打包后 exe 超过 100MB,说明又引入了被排除的依赖,先排查再推送。

已知代码约定 / 坑

提交约定