Skip to content

fix(parser): 用 pypdfium2(BSD) 替换 pymupdf(AGPL) 渲染 PDF,消除 AGPL 传染风险 - #897

Merged
xerrors merged 1 commit into
xerrors:mainfrom
Alex-Fleet:fix/865-pymupdf-pypdfium2
Aug 7, 2026
Merged

fix(parser): 用 pypdfium2(BSD) 替换 pymupdf(AGPL) 渲染 PDF,消除 AGPL 传染风险#897
xerrors merged 1 commit into
xerrors:mainfrom
Alex-Fleet:fix/865-pymupdf-pypdfium2

Conversation

@Alex-Fleet

Copy link
Copy Markdown
Contributor

变更描述

将 PDF 渲染/解析从 pymupdf(AGPL-3.0) 替换为 pypdfium2(BSD-3-Clause + Apache-2.0),消除 AGPL 网络服务传染风险。

涉及 4 处源码 + 1 处测试 + 依赖

  • pdf_utils.py 预检:pypdfium2 打开加密 PDF 抛 PdfiumError(消息含 password),据此映射 encrypted_pdf 错误码
  • rapid_ocr.pypage.render(scale=zoom).to_pil() 替换 pixmap 渲染
  • deepseek_ocr.py:dpi→scale 换算(200dpi = 200/72),PIL 输出 PNG
  • utils/__init__.pyget_textpage().get_text_bounded() 提取文本
  • test_parser_facade.py:pypdfium2 只读不能造 PDF,_build_pdf 改用 pypdf(已在 lock 中)构造最小文本 PDF
  • pyproject:pymupdf>=1.25.5pypdfium2>=5.0.0,同步 uv.lock

变更类型

  • Bug 修复
  • 新功能
  • 文档更新
  • 其他

测试

  • 单元测试:test_parser_facade.py → 19 passed, 1 skipped
  • 全量 pytest -m unit test/unit → 177 passed(仅 1 个既有无关失败)
  • 实测链路:pypdf 造 PDF → pypdfium2 提取文本/渲染 RGB/加密抛错 全部通过
  • 已在 Docker 环境测试(docker 不可用)

说明

关联 issue:#865

Fixes #865

- pdf_utils 预检:pypdfium2 打开加密 PDF 抛 PdfiumError(消息含 password),
  据此映射 encrypted_pdf 错误码
- rapid_ocr/deepseek_ocr:渲染缩放换算(72dpi 基准),输出 PIL 图像/PNG
- is_text_pdf:用 get_textpage().get_text_bounded() 提取文本
- 测试 _build_pdf 改用 pypdf 构造最小文本 PDF(pypdfium2 只读不能写)
- pyproject:pymupdf>=1.25.5 -> pypdfium2>=5.0.0,同步 uv.lock

Fixes xerrors#865
@xerrors
xerrors merged commit 7627088 into xerrors:main Aug 7, 2026
1 check failed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[合规] 依赖 AGPL-3.0 的 PyMuPDF,MIT 项目存在网络服务传染风险

2 participants