Skip to main content
Glama
Lezheng2333

pdfeverything

by Lezheng2333

✨ Why PDFeverything?

You've been there: a Word report here, a PDF scan there, some photos of the whiteboard, an Excel chart… and now someone wants "one combined PDF please, by 5pm". 😤

PDFeverything is built for exactly this moment.

Drag everything in — any combination of PDFs, Word documents, PowerPoint decks, Excel spreadsheets, PNGs, JPEGs, text files — and it merges them into one unified PDF, in the order you decide, with progress you can watch.

Platform

Download

🍎 macOS (Apple Silicon)

PDFeverything_macOS.zip

🪟 Windows 10/11 (64-bit)

PDFeverything_Setup_v1.9.0.exe

🔗 Latest Release →

🪟 The Windows download is an installer — bilingual wizard, licence page, Start Menu entry, optional desktop shortcut and a standard uninstaller. No Python required.

Related MCP server: gurupdf-mcp

🆕 What's New in v1.9.0

A QA-led hardening round: 19 defects fixed, hot paths made several times faster.

Every item below came out of an adversarial test pass (malformed input, boundary values, hostile page ranges, cross-channel consistency, memory accounting) plus an independent audit of the reader. Each fix has a regression test that failed before it.

  • 🧠 The reader's memory ceiling is real now. The 400 MB pixmap cache stopped evicting the moment it met a 100%-zoom page — the exact entries a freshly opened document is full of — so it grew without limit (measured 638 MB against a 400 MB cap). Eviction is now two-tier: disposable zoomed renders first, then off-screen bases, never the page you are looking at. It also charged the device pixel ratio twice, over-counting 4× on Retina and making the cap behave like 100 MB.

  • 🖱️ Grid clicks hit the page you clicked. Grid cells were hit-tested with label-local mouse coordinates against a container-space grid, so every thumbnail resolved to page 1 — "click page 5, press Delete" deleted page 1. The left edge of any thumbnail produced the phantom index -1, which could duplicate the last page during a drag-sort.

  • 🛡️ Drag-sort no longer aborts the app. Reordering rebuilt the document and left the reader holding a closed handle; the next line raised inside a Qt slot, which terminates the process and lost unsaved edits with no prompt.

  • Zoom and resize are ~10× faster on long documents. Layout read doc[i].rect for every page on every scroll-stop, zoom tick and resize — 7.5 ms of a 9.5 ms pass at 1000 pages, i.e. most of a 16.7 ms frame budget per pinch tick. Page geometry is now cached: 9.5 ms → 0.94 ms per layout, 11.9 ms → 1.55 ms per pinch tick. A 1000-page PDF still opens in 30 ms using 10 MB.

  • 🪶 Edits stay lazy. Deleting a page re-rendered the entire document at 100% on the GUI thread (189 MB for 100 pages, ~1.9 GB at 1000). Only the visible rows are materialised now — the windowed renderer finally holds for edits too.

  • ↩️ Undo history actually works from the CLI. The journal was keyed on (path, size, mtime), so a command's own output never matched its input and page-undo always answered "nothing to undo". Commands now edit in place when -o is omitted, and the journal identity is recorded so it survives the rewrite. Journal snapshots are also byte-budgeted and stale ones are swept — it used to keep 50 full copies of the document in RAM and on disk forever.

  • 🔐 Password-protected PDFs explain themselves. Every operation used to leak a library internal ("File has not been decrypted", "document closed or encrypted", "PasswordError"). All 16 entry points now return one actionable message.

  • 🧩 One page-range grammar for all three channels. The MCP server had its own splitter that rejected what the CLI accepted (1–5, 1,3, 3-1, 1..5) and crashed on others. GUI, CLI and MCP now share core.utils.parse_page_ranges, and truncated specs like 1- are refused instead of silently meaning 1.

  • 📐 Text→PDF wrapping measures instead of guessing. A fixed 6.5 pt/char estimate left Latin text 85 pt short of the margin and pushed CJK 54 pt past the page edge. Chunks are now measured with the real font.

  • 🧹 CLI stops lying. An unknown command silently opened the GUI with exit code 0 (a failed scripted call looked successful); it now prints a suggestion and exits 2.

  • 🎯 Per-document state resets on open. Search hits, highlights and edit mode used to survive a file switch: a 100-page document's results stayed in the sidebar over a 3-page one, the page label could read "61 / 3", and old hit rectangles were baked into the new document's pages.

  • 🖼️ Fit-mode renders follow a resize. The fit cache key ignored the viewport, so after resizing, the label kept the pre-resize pixmap (424×600 inside a 809×1145 frame) and never filled the window again.

  • 🧪 A hostile-file pass. 0-page, 0-byte, truncated, fake-header and password-protected files are now opened and edited without a crash; a failed open reports what went wrong instead of leaving a blank dead-end.

  • 🧰 Plus: reading position is saved on ⌘Q (not only on ✕), a force-terminated worker releases the UI, the tooltip uses one timer instead of one per hover, JPG export honours the filename you chose, and a stray print() that corrupted the MCP JSON-RPC stream is gone.

  • 🧪 New test gates: tests/qa_adversarial.py (170 probes: robustness, accuracy, cross-channel consistency, performance and temp-file hygiene) and tests/qa_reader_defects.py (37 reader regressions, one per defect above). Full set: **93 core + 70 GUI + 38 reader + 85 reader-comprehensive + 37 reader-defects

    • 170 adversarial = 493 checks**.


🎯 The Killer Feature: Mixed-File Merge

📄 report.docx   (2 pages)
📊 chart.xlsx    (1 page)
🖼️ photo.jpg    (1 page)
📄 appendix.pdf  (5 pages)

         🪄  one click  🪄
              ↓
    ┌─────────────────────┐
    │   unified.pdf       │
    │   9 pages, in order │
    └─────────────────────┘

Every file goes through its own converter (AppleScript → Office on macOS, or pure-Python fallback), then everything gets stitched together. If one file fails, the rest still go through — you get a summary of what worked and what didn't.

📖 Built-in PDF Reader

A high-performance PDF reader with vector-grade rendering — rivaling Acrobat and WPS.

Feature

Detail

🎨 Vector-grade quality

Exact zoom×dpr rendering, MuPDF native 8-bit sub-pixel anti-aliasing

🖥️ Full HiDPI/Retina

1:1 native pixel mapping, crisp text at any zoom level

📜 Scroll & Grid modes

Continuous vertical scroll or 3-column thumbnail grid

Two-pass zoom

Pass 1 (<5ms) instant pixel scale + Pass 2 (40ms) sharp re-render

🤏 Trackpad pinch

Native pinch-to-zoom with phase detection

💾 LRU cache

400MB memory limit, immortal 100% base, zoom-level cache reuse

🔍 Smart navigation

Bisect page tracking, async visible-range refresh on scroll stop

🔧 Everything It Can Do

Operation

What it does

📖 PDF Reader

Scroll & Grid modes, vector-grade rendering, trackpad pinch-to-zoom

🔀 Mixed Merge

PDF + Word + PPT + Excel + images + text → one PDF

🔗 PDF Merge

Combine multiple PDFs in any order

✂️ PDF Split

Split by page, by chunks of N pages, or by custom ranges

🖼️ Images → PDF

Turn a batch of images into a single PDF

📝 Word → PDF

Convert .docx / .doc files to PDF

📊 PPT / Excel → PDF

Convert .pptx and .xlsx files

📝 PDF → Word

Convert PDF to editable .docx

📊 PDF → PowerPoint

Convert PDF pages to .pptx slides

📈 PDF → Excel

Extract PDF tables to .xlsx

📄 PDF → Images

Export each PDF page as a PNG

📤 Extract Text

Pull out all text from a PDF

🖼️ Extract Images

Rip embedded images from a PDF

🗜️ Compress

Shrink PDF file size (lossless / medium / aggressive)

💧 Watermark

Stamp a text or PDF overlay on every page

🔒 Encrypt

Set an open-password on a PDF

🔓 Decrypt

Remove password protection

🔄 Rotate

Rotate pages 90° / 180° / 270°

ℹ️ Info

Inspect page count, metadata, encryption status

📥 Supported Inputs

Category

Extensions

📄 PDF

.pdf

🖼️ Images

.png .jpg .jpeg .gif .bmp .tiff .webp

📝 Word

.docx .doc .rtf

📊 PowerPoint

.pptx .ppt

📈 Excel

.xlsx .xls .csv

📃 Text & Code

.txt .md .json .xml .html .py .yml

🖥️ The GUI

┌──────────────────────────────────────────────┐
│  📄 doc.pdf        [🔼] [🔽] [✖]            │
│  📊 data.xlsx      [🔼] [🔽] [✖]            │
│  🖼️ photo.jpg      [🔼] [🔽] [✖]            │
│  📝 report.docx    [🔼] [🔽] [✖]            │
│                                              │
│  ── drag & drop files here ──               │
│                                              │
│  [🔀 Merge All →]       [✂️ Split...]        │
│  [🗜️ Compress...]       [💧 Watermark...]    │
│  [🔒 Encrypt...]        [🔄 Rotate...]       │
│                                              │
│  ████████████░░░░░░  78%                     │
│  Converting: report.docx (3/5)...            │
└──────────────────────────────────────────────┘
  • 🖱️ Drag & drop files from Finder / Explorer

  • 🔄 Reorder with arrow buttons or by dragging inside the list

  • Multi-threaded — never freezes, always shows progress

  • 🧠 Smart buttons — the UI adapts to what's in your file list

  • 🌐 Bilingual UI — switch between Chinese and English (Settings > Language)

🤖 AI Agent Integration (MCP Server)

PDFeverything comes with a built-in Model Context Protocol (MCP) server. Any AI agent (Claude Desktop, Claude Code, Cursor, etc.) can discover all 29 PDF tools and call them directly — no Python, no install, just the app file.

How it works

The same .exe / .app binary supports three modes:

Mode

macOS

Windows

🖥️ GUI

double-click .app

double-click .exe

⌨️ CLI

/path/to/PDFeverything.app/Contents/MacOS/PDFeverything merge -i a.pdf -o out.pdf

PDFeverything.exe merge -i a.pdf b.pdf -o out.pdf

🔌 MCP

/path/to/PDFeverything.app/Contents/MacOS/PDFeverything --mcp

PDFeverything.exe --mcp

Setup — Claude Desktop

Add to ~/.claude/claude_desktop_config.json:

{
  "mcpServers": {
    "pdfeverything": {
      "command": "/Applications/PDFeverything.app/Contents/MacOS/PDFeverything",
      "args": ["--mcp"]
    }
  }
}

Windows:

{
  "mcpServers": {
    "pdfeverything": {
      "command": "C:\\Program Files\\PDFeverything\\PDFeverything.exe",
      "args": ["--mcp"]
    }
  }
}

Setup — Claude Code

Add to .claude/settings.json in your project:

{
  "mcpServers": {
    "pdfeverything": {
      "type": "stdio",
      "command": "/Applications/PDFeverything.app/Contents/MacOS/PDFeverything",
      "args": ["--mcp"]
    }
  }
}

What the AI sees (29 tools)

Once connected, the agent automatically discovers these tools — no manual instruction needed:

Tool

Description

pdf_merge

Merge several PDFs into one, in the order you list them

pdf_split

Split a PDF into single pages (or by custom ranges)

pdf_info

Metadata: page count, size, author, title, encryption status

pdf_outline

Bookmark / table-of-contents tree with target pages

pdf_search

Find text in a PDF — every match with page, position and context

pdf_extract_text

Extract all text from a PDF to a .txt file

pdf_extract_images

Extract every embedded image to a folder

pdf_to_images

Render each page to a PNG (adjustable DPI)

images_to_pdf

Combine images (PNG/JPG/GIF/…) into one PDF

pdf_to_word

Convert a PDF to Word (.docx), keeping text and tables

pdf_to_ppt

Convert a PDF to PowerPoint (.pptx), one slide per page

pdf_to_excel

Extract PDF tables into Excel sheets (.xlsx)

pdf_compress

Shrink a PDF (lossless / medium / max)

pdf_watermark

Add a text watermark with real opacity and angle

pdf_insert_pages

Insert or append pages from another PDF

pdf_nup

Impose 2/4/6/8/9/16 pages per sheet for printing

pdf_set_metadata

Edit document properties (title, author, subject, keywords)

pdf_add_page_numbers

Stamp page numbers / headers / footers with a {n}/{total} template

pdf_encrypt

Set an open password (AES-256)

pdf_decrypt

Remove the password from a PDF

pdf_rotate

Rotate pages 90/180/270°

pdf_mixed_merge

🔥 The killer feature: merge mixed file types into one PDF

pdf_delete_pages

Delete pages by 1-based number or range

pdf_rotate_pages

Rotate specific pages

pdf_move_pages

Reorder pages by moving them before a target position

pdf_extract_pages

Extract pages into a new standalone PDF

pdf_undo

Undo the last page edit (history persists per file)

pdf_redo

Redo the last undone page edit

pdf_history

Show the recorded editing history for a file

Direct CLI mode (no MCP needed)

AI agents can also call the binary directly:

# macOS
/Applications/PDFeverything.app/Contents/MacOS/PDFeverything merge -i a.pdf b.pdf -o out.pdf
/Applications/PDFeverything.app/Contents/MacOS/PDFeverything info -i doc.pdf
/Applications/PDFeverything.app/Contents/MacOS/PDFeverything -h

# Windows
PDFeverything.exe merge -i a.pdf b.pdf -o out.pdf
PDFeverything.exe info -i doc.pdf
PDFeverything.exe -h

💡 The .app and .exe are the SAME single binary. Give it CLI args → headless mode. Give it --mcp → MCP server. No args → GUI. One file, three personalities.

🚀 Quick Start (for Developers)

# 1. Install dependencies
pip install PyQt6 PyMuPDF pypdf pikepdf pillow python-docx python-pptx openpyxl

# 2. Launch GUI
python main.py

# 3. Or use the CLI
python pdf_tool.py merge -i a.pdf b.pdf -o merged.pdf
python pdf_tool.py info -i document.pdf

# 4. Or start the MCP server
python mcp/server.py

Build from Source

Windows (installer + portable exe, needs Inno Setup 6):

python build_windows.py
# → PDFeverything_Setup_v1.9.0.exe   installer (copied to the project root)
# → dist/PDFeverything.exe           portable payload, no install

macOS (app bundle):

pyinstaller PDFeverything.spec --noconfirm --clean
# → dist/PDFeverything.app

🧪 Testing

Three gates run on every release, plus two adversarial suites added in v1.9.0:

.venv/bin/python tests/test_core.py                            # core / CLI / MCP / i18n   93
QT_QPA_PLATFORM=offscreen .venv/bin/python tests/test_gui.py    # workers / batch / dialogs 70
QT_QPA_PLATFORM=offscreen .venv/bin/python tests/qa_reader.py   # reader QA                 38
QT_QPA_PLATFORM=offscreen .venv/bin/python tests/test_reader.py # reader comprehensive      85

# adversarial suites — these attack the software, they do not just re-check it
.venv/bin/python tests/qa_adversarial.py                        # robustness / accuracy   170
QT_QPA_PLATFORM=offscreen .venv/bin/python tests/qa_reader_defects.py  # reader defects    37

tests/qa_adversarial.py covers malformed and hostile input (0-byte, truncated, fake-header, encrypted, 0-page PDFs), page-range boundary values, cross-channel consistency between GUI/CLI/MCP, pixel-level accuracy oracles, memory and file-descriptor ceilings, and temp-file hygiene. Every probe prints the concrete evidence when it fails.

tests/qa_reader_defects.py holds one regression per reader defect fixed in v1.9.0; each of them failed before its fix.

Total: 493 checks.

🧱 Tech Stack

Layer

Tech

🖼️ GUI

PyQt6 — native look on both macOS & Windows

🧠 PDF Engine

PyMuPDF + pypdf + pikepdf

📝 Office Converters

AppleScript (macOS) / COM (Windows) / python-docx + python-pptx + openpyxl (fallback)

📦 Packaging

PyInstaller (onefile on Windows, app bundle on macOS)

📄 License

MIT — do whatever you want with it. LICENSE


🎯 核心功能:混合文件合并

📄 报告.docx     (2 页)
📊 图表.xlsx     (1 页)
🖼️ 照片.jpg     (1 页)
📄 附录.pdf      (5 页)

         🪄  一键合并  🪄
              ↓
    ┌─────────────────────┐
    │   统一输出.pdf       │
    │   9 页,顺序不变     │
    └─────────────────────┘

把不同类型的文件拖进来,每个文件经过专用转换器处理,然后按顺序合并。某个文件转换失败了也不影响其他的——最后会给你一份汇总报告。

📖 内置 PDF 阅读器

高性能 PDF 阅读器,矢量级渲染画质——媲美 Acrobat 和 WPS。

特性

详情

🎨 矢量级画质

精确 zoom×dpr 渲染,MuPDF 原生 8 位子像素抗锯齿

🖥️ 全 HiDPI/Retina

1:1 原生物理像素映射,任意缩放级别文字锐利

📜 连续 / 网格双模式

连续垂直滚动或 3 列缩略图网格

两阶段缩放

Pass 1 (<5ms) 瞬时像素拉伸 + Pass 2 (40ms) 高清重绘

🤏 触控板捏合

原生手势检测,跟手缩放

💾 LRU 缓存

400MB 内存上限,100% 基础永生,缩放级别缓存复用

🔍 智能导航

二分页码追踪,滚动停止时异步刷新可见区域

🔧 全部功能

操作

说明

📖 PDF 阅读器

连续/网格双模式,矢量级渲染画质,触控板捏合缩放

🔀 混合合并

PDF + Word + PPT + Excel + 图片 + 文本 → 一个 PDF

🔗 PDF 合并

多个 PDF 按任意顺序合并

✂️ PDF 拆分

按页码、每 N 页或自定义范围拆分

🖼️ 图片 → PDF

多张图片一键合成为 PDF

📝 Word → PDF

转换 .docx / .doc 文件

📊 PPT / Excel → PDF

转换 .pptx / .xlsx 文件

📝 PDF → Word

将 PDF 转换为可编辑的 .docx

📊 PDF → PowerPoint

PDF 每页转为 .pptx 幻灯片

📈 PDF → Excel

提取 PDF 表格为 .xlsx

📄 PDF → 图片

每页导出为 PNG

📤 提取文字

提取 PDF 中所有文字

🖼️ 提取图片

提取 PDF 中嵌入的图片

🗜️ 压缩

缩小 PDF 文件体积

💧 水印

添加文字或 PDF 叠加水印

🔒 加密 / 解密

设置或移除 PDF 打开密码

🔄 旋转

旋转页面 90° / 180° / 270°

ℹ️ 信息

查看页数、元数据、加密状态

🆕 v1.9.0 新功能

以 QA 为主导的加固迭代:修复 19 个缺陷,热点路径提速近 10 倍。

下面每一条都来自对抗性测试(畸形输入、边界值、恶意页码范围、三通道一致性、 内存计量)以及一次独立的阅读器审计。每个修复都配有"修复前必然失败"的回归测试。

  • 🧠 阅读器的内存上限真正生效了 — 原先淘汰循环一遇到 100% 缩放的页面就 break, 而刚打开的文档里全是这种页面,于是缓存无上限增长(实测 638 MB 对 400 MB 上限)。 现在分两级淘汰:先丢可再生的缩放/缩略图渲染,再丢屏幕外的 base,绝不丢你正在看的那一页。 同时修正了重复计算 devicePixelRatio 的问题(Retina 上 4 倍高估,使 400 MB 实际只有 100 MB)。

  • 🖱️ 网格视图点哪页选哪页 — 网格单元用标签局部坐标去做容器坐标的命中测试, 导致每个缩略图都解析成第 1 页:点第 5 页再按删除,删掉的是第 1 页。缩略图左边缘还会产生 幽灵索引 -1,拖拽排序时可能复制最后一页。

  • 🛡️ 拖拽排序不再让程序崩溃 — 重排会重建文档,阅读器却仍持有已关闭的句柄, 下一行在 Qt 槽函数里抛异常 → 进程直接 abort,未保存的修改无提示丢失。

  • 长文档缩放/缩放窗口快约 10 倍 — 布局在每次滚动停止、缩放、改变窗口时都要为 每一页读 doc[i].rect(1000 页时占 9.5ms 中的 7.5ms,等于一次捏合缩放吃掉大半个帧预算)。 页码几何现已缓存:布局 9.5ms → 0.94ms捏合一次 11.9ms → 1.55ms。 1000 页 PDF 打开仍是 30ms、占用 10MB

  • 🪶 编辑后依然惰性渲染 — 删除一页曾在 GUI 线程上把整本文档按 100% 全部重渲 (100 页 189MB,1000 页约 1.9GB)。现在只渲染可见行。

  • ↩️ CLI 的撤销历史真的能用了 — 日志键基于 (路径, 大小, mtime), 导致命令自己的输出永远匹配不上输入,page-undo 总是回答"没有可撤销的操作"。 现在省略 -o 即就地修改,且日志身份被持久记录,改写后依然能找回历史。 日志快照同时按字节预算裁剪,陈旧日志会被清理(原先会在内存和磁盘各留 50 份完整副本)。

  • 🔐 加密 PDF 给出可操作的提示 — 原先 16 个入口各自泄漏底层库的内部错误 ("File has not been decrypted"、"document closed or encrypted"、"PasswordError")。

  • 🧩 三通道统一页码语法 — MCP 曾有一套自己的解析器,CLI 能识别的 1–51,33-11..5 它会报错,另一些则直接崩溃。现在 GUI/CLI/MCP 共用 core.utils.parse_page_ranges,且 1- 这类残缺写法会被明确拒绝而不是悄悄当成 1

  • 📐 文本转 PDF 按实际宽度折行 — 原先按 6.5pt/字符估算:拉丁文比右边距短 85pt, 中文则超出页面 54pt。现在用真实字体测量。

  • 🧹 CLI 不再"假装成功" — 未知命令原先会静默打开 GUI 并返回 0(脚本调用失败看起来像成功), 现在会给出相近命令建议并以退出码 2 结束。

  • 🎯 切换文件时重置每文档状态 — 搜索结果、高亮、编辑模式原先会跨文件残留: 100 页文档的结果留在 3 页文档的侧栏里,页码可能显示 "61 / 3", 旧文档的命中矩形还会被画进新文档的位图。

  • 🖼️ 适应窗口模式跟随窗口尺寸 — fit 缓存键没有包含视口尺寸,改变窗口后 标签仍拿着改变前的位图(424×600 塞在 809×1145 的框里),永远不会铺满。

  • 🧪 恶意文件专项测试 — 0 页、0 字节、截断、伪造文件头、加密 PDF 现在都能 正常打开/编辑而不崩溃;打开失败会说明原因而不是留下一片空白。

  • 🧰 其他:⌘Q 退出也会记住阅读位置(原先只有点 ✕ 才记)、强制终止的 worker 会释放界面、 工具提示改为单个复用定时器、JPG 导出遵循你选的文件名、 以及一处会污染 MCP JSON-RPC 流的 print() 已移除。

  • 🧪 新增测试门禁tests/qa_adversarial.py(170 项:鲁棒性/准确性/三通道一致性/ 性能/临时文件卫生)与 tests/qa_reader_defects.py(37 项阅读器回归,每个缺陷一项)。 全套件:93 核心 + 70 GUI + 38 阅读器 + 85 阅读器综合 + 37 阅读器缺陷 + 170 对抗 = 493 项

🖥️ 界面预览

┌──────────────────────────────────────────────┐
│  📄 doc.pdf        [🔼] [🔽] [✖]            │
│  📊 data.xlsx      [🔼] [🔽] [✖]            │
│  🖼️ photo.jpg      [🔼] [🔽] [✖]            │
│  📝 report.docx    [🔼] [🔽] [✖]            │
│                                              │
│  ── 拖放文件到此处 ──                        │
│                                              │
│  [🔀 合并为统一 PDF]   [✂️ 拆分...]          │
│  [🗜️ 压缩...]        [💧 水印...]          │
│  [🔒 加密...]        [🔄 旋转...]           │
│                                              │
│  ████████████░░░░░░  78%                     │
│  转换中: 报告.docx (3/5)...                  │
└──────────────────────────────────────────────┘
  • 🖱️ 从资源管理器/Finder 拖放文件

  • 🔄 用按钮或拖动调整顺序

  • 多线程处理 — 界面永不卡顿,实时进度条

  • 🧠 智能按钮 — 根据文件列表内容自动变化

🤖 AI Agent 集成(MCP 服务器)

PDFeverything 内置了 Model Context Protocol (MCP) 服务器。任何 AI Agent(Claude Desktop、Claude Code、Cursor 等)都能自动发现全部 29 个 PDF 工具并直接调用——无需安装 Python、无需额外依赖,只要有这个 app 文件就行

同一个文件,三种模式

模式

macOS

Windows

🖥️ GUI

双击 .app

双击 .exe

⌨️ 命令行

/Applications/PDFeverything.app/Contents/MacOS/PDFeverything merge -i a.pdf -o out.pdf

PDFeverything.exe merge -i a.pdf b.pdf -o out.pdf

🔌 MCP

/Applications/PDFeverything.app/Contents/MacOS/PDFeverything --mcp

PDFeverything.exe --mcp

配置 Claude Desktop

~/.claude/claude_desktop_config.json 中添加:

{
  "mcpServers": {
    "pdfeverything": {
      "command": "/Applications/PDFeverything.app/Contents/MacOS/PDFeverything",
      "args": ["--mcp"]
    }
  }
}

Windows:

{
  "mcpServers": {
    "pdfeverything": {
      "command": "C:\\Program Files\\PDFeverything\\PDFeverything.exe",
      "args": ["--mcp"]
    }
  }
}

配置 Claude Code

在项目下的 .claude/settings.json 中添加:

{
  "mcpServers": {
    "pdfeverything": {
      "type": "stdio",
      "command": "/Applications/PDFeverything.app/Contents/MacOS/PDFeverything",
      "args": ["--mcp"]
    }
  }
}

AI 能看到的 29 个工具

连接后 Agent 会自动发现这些工具——无需手动教它:

工具

说明

pdf_merge

Merge multiple PDFs into one

pdf_split

Split PDF by pages or custom ranges

pdf_info

Metadata: pages, size, author, encryption status

pdf_extract_text

Extract all text from a PDF

pdf_extract_images

Extract embedded images

pdf_to_images

Convert PDF pages to PNG

images_to_pdf

Images → single PDF

pdf_to_word

PDF → Word (.docx)

pdf_to_ppt

PDF → PowerPoint (.pptx)

pdf_to_excel

PDF tables → Excel (.xlsx)

pdf_compress

Reduce file size (lossless / medium / max)

pdf_watermark

Add a text watermark (opacity + angle honoured)

pdf_encrypt

Set an open password

pdf_decrypt

Remove the password

pdf_rotate

Rotate pages 90/180/270°

pdf_mixed_merge

🔥 Mixed files → unified PDF

pdf_delete_pages

Delete pages by number

pdf_rotate_pages

Rotate specific pages

pdf_move_pages

Reorder pages

pdf_extract_pages

Extract pages into a new PDF

pdf_undo

Undo the last page edit (persistent history)

pdf_redo

Redo the last undone edit

pdf_history

Show the editing history of a file

直接 CLI 调用(无需 MCP)

AI Agent 也可以直接调用二进制:

# macOS
/Applications/PDFeverything.app/Contents/MacOS/PDFeverything merge -i a.pdf b.pdf -o out.pdf
/Applications/PDFeverything.app/Contents/MacOS/PDFeverything info -i doc.pdf
/Applications/PDFeverything.app/Contents/MacOS/PDFeverything -h

# Windows
PDFeverything.exe merge -i a.pdf b.pdf -o out.pdf
PDFeverything.exe info -i doc.pdf
PDFeverything.exe -h

💡 .app.exe 就是同一个二进制文件。 给参数 → 命令行模式。给 --mcp → MCP 服务器。不给参数 → GUI。一个文件,三种用法。

🚀 开发者快速开始

pip install PyQt6 PyMuPDF pypdf pikepdf pillow python-docx python-pptx openpyxl
python main.py            # 启动 GUI
python pdf_tool.py info -i document.pdf   # CLI 模式

📦 从源码构建

Windows(安装包 + 便携版 exe,需要 Inno Setup 6):

python build_windows.py
# → PDFeverything_Setup_v1.9.0.exe   安装包(同时复制到项目根目录)
# → dist/PDFeverything.exe           便携版载荷,免安装

macOS(App Bundle):

pyinstaller PDFeverything.spec --noconfirm --clean
# → dist/PDFeverything.app

🧪 测试

发布前跑三个门禁套件,v1.9.0 起再加两个对抗性套件:

.venv/bin/python tests/test_core.py                            # 核心 / CLI / MCP / i18n   93
QT_QPA_PLATFORM=offscreen .venv/bin/python tests/test_gui.py    # Worker / 批量 / 对话框   70
QT_QPA_PLATFORM=offscreen .venv/bin/python tests/qa_reader.py   # 阅读器 QA                38
QT_QPA_PLATFORM=offscreen .venv/bin/python tests/test_reader.py # 阅读器综合测试            85

# 对抗性套件 —— 它们主动攻击软件,而不只是复检既有行为
.venv/bin/python tests/qa_adversarial.py                        # 鲁棒性 / 准确性         170
QT_QPA_PLATFORM=offscreen .venv/bin/python tests/qa_reader_defects.py  # 阅读器缺陷回归    37

tests/qa_adversarial.py 覆盖畸形与恶意输入(0 字节、截断、伪造文件头、加密、0 页 PDF)、 页码范围边界值、GUI/CLI/MCP 三通道一致性、像素级准确性判据、 内存与文件描述符上限、临时文件卫生。每一条失败时都会打印具体证据。

tests/qa_reader_defects.py 中每个 v1.9.0 修复的阅读器缺陷都对应一项回归, 它们在修复前必然失败。

合计 493 项。

🧱 技术栈

技术

🖼️ 界面

PyQt6 — macOS / Windows 原生体验

🧠 PDF 引擎

PyMuPDF + pypdf + pikepdf

📝 Office 转换

AppleScript (macOS) / COM (Windows) / python-docx + python-pptx + openpyxl (备选)

🔌 AI 集成

MCP (Model Context Protocol) — 29 个工具自动发现

📦 打包

PyInstaller (Windows onefile / macOS app bundle)

📄 许可证

MIT — 随便用。 LICENSE

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Convert, compress, merge, split and OCR PDFs plus 100+ file formats (Word, Excel, images, ebooks, video) right inside your AI agent. Exposes 126 GuruPDF tools over MCP — works with Claude, Cursor, VS Code, Windsurf, or any MCP client.
    4
    41 npm
    2
    MIT
  • A
    license
    C
    quality
    B
    maintenance
    Enables AI assistants to perform PDF operations like merge, split, compress, convert, encrypt, OCR, and summarize using natural language.
    98
    7 npm
    MIT
  • F
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents to perform comprehensive PDF operations locally, including compression, text extraction, PII redaction, page organization, splitting, merging, watermarking, creation, and form filling, all without cloud uploads.
    11 npm
    -