pdfeverything
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@pdfeverythingMerge these documents into a single PDF"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
✨ 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) | |
🪟 Windows 10/11 (64-bit) |
🪟 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].rectfor 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 andpage-undoalways answered "nothing to undo". Commands now edit in place when-ois 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 sharecore.utils.parse_page_ranges, and truncated specs like1-are refused instead of silently meaning1.📐 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) andtests/qa_reader_defects.py(37 reader regressions, one per defect above). Full set: **93 core + 70 GUI + 38 reader + 85 reader-comprehensive + 37 reader-defects170 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 |
📊 PPT / Excel → PDF | Convert |
📝 PDF → Word | Convert PDF to editable |
📊 PDF → PowerPoint | Convert PDF pages to |
📈 PDF → Excel | Extract PDF tables to |
📄 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 |
| |
🖼️ Images |
|
📝 Word |
|
📊 PowerPoint |
|
📈 Excel |
|
📃 Text & Code |
|
🖥️ 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 | double-click |
⌨️ CLI |
|
|
🔌 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 |
| Merge several PDFs into one, in the order you list them |
| Split a PDF into single pages (or by custom ranges) |
| Metadata: page count, size, author, title, encryption status |
| Bookmark / table-of-contents tree with target pages |
| Find text in a PDF — every match with page, position and context |
| Extract all text from a PDF to a .txt file |
| Extract every embedded image to a folder |
| Render each page to a PNG (adjustable DPI) |
| Combine images (PNG/JPG/GIF/…) into one PDF |
| Convert a PDF to Word (.docx), keeping text and tables |
| Convert a PDF to PowerPoint (.pptx), one slide per page |
| Extract PDF tables into Excel sheets (.xlsx) |
| Shrink a PDF (lossless / medium / max) |
| Add a text watermark with real opacity and angle |
| Insert or append pages from another PDF |
| Impose 2/4/6/8/9/16 pages per sheet for printing |
| Edit document properties (title, author, subject, keywords) |
| Stamp page numbers / headers / footers with a |
| Set an open password (AES-256) |
| Remove the password from a PDF |
| Rotate pages 90/180/270° |
| 🔥 The killer feature: merge mixed file types into one PDF |
| Delete pages by 1-based number or range |
| Rotate specific pages |
| Reorder pages by moving them before a target position |
| Extract pages into a new standalone PDF |
| Undo the last page edit (history persists per file) |
| Redo the last undone page edit |
| 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
.appand.exeare 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.pyBuild 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 installmacOS (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 37tests/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–5、1,3、3-1、1..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 | 双击 | 双击 |
⌨️ 命令行 |
|
|
🔌 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 会自动发现这些工具——无需手动教它:
工具 | 说明 |
| Merge multiple PDFs into one |
| Split PDF by pages or custom ranges |
| Metadata: pages, size, author, encryption status |
| Extract all text from a PDF |
| Extract embedded images |
| Convert PDF pages to PNG |
| Images → single PDF |
| PDF → Word (.docx) |
| PDF → PowerPoint (.pptx) |
| PDF tables → Excel (.xlsx) |
| Reduce file size (lossless / medium / max) |
| Add a text watermark (opacity + angle honoured) |
| Set an open password |
| Remove the password |
| Rotate pages 90/180/270° |
| 🔥 Mixed files → unified PDF |
| Delete pages by number |
| Rotate specific pages |
| Reorder pages |
| Extract pages into a new PDF |
| Undo the last page edit (persistent history) |
| Redo the last undone edit |
| 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 # 阅读器缺陷回归 37tests/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
This server cannot be deployed
Maintenance
Related MCP Connectors
Privacy-first PDF tools over MCP: merge, split, rotate, delete, compress, protect, inspect.
Free PDF tools for AI agents: merge, split, rotate, watermark, page numbers, metadata, flatten.
Image & PDF tools for AI agents: compress, convert, resize, PDF, AI vision, pipeline.
Document processing over MCP: merge, split and compress PDFs, run OCR, extract document text.
Related MCP Servers
- AlicenseBqualityAmaintenanceEmpowers AI agents to securely read and extract information (text, metadata, page count) from PDF files within project contexts using a flexible MCP tool.1690 npm935MIT

gurupdf-mcpofficial
AlicenseAqualityCmaintenanceConvert, 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.441 npm2MIT- AlicenseCqualityBmaintenanceEnables AI assistants to perform PDF operations like merge, split, compress, convert, encrypt, OCR, and summarize using natural language.987 npmMIT
- FlicenseNot gradedqualityAmaintenanceEnables 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-