关于 pdf-merger
供需要从 AI 聊天合并文档或调整页面的用户使用的本地 PDF 工具。README 还列出拆分、盖章和文本提取等操作,文件无需上传。
主要功能
- 01合并与拆分 PDF
- 02提取、旋转和重排页面
- 03添加文字及企业信息印章
- 04统计页数并查看元数据
- 05提取 PDF 文本并查看操作记录
适用场景
- 01将多个 PDF 合并为一个文件
- 02把扫描件的选定页面与合同合并
- 03调整页面顺序,将封面移至首页
- 04为发票或合同添加印章
MCP 相关
向 MCP 客户端提供 PDF 工具、`pdf://recent` 资源和 `mark_invoice_paid` 提示词。文件操作在本机执行,PDF 保留在原位置。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://mcp.zovo.one/mcp/pdf-mergerclaude mcp add --transport http theluckystrike-pdf-merger https://mcp.zovo.one/mcp/pdf-merger{"mcpServers":{"theluckystrike-pdf-merger":{"type":"http","url":"https://mcp.zovo.one/mcp/pdf-merger"}}}在 Cursor 中打开{"servers":{"theluckystrike-pdf-merger":{"type":"http","url":"https://mcp.zovo.one/mcp/pdf-merger"}}}在 VS Code 中打开{"mcpServers":{"theluckystrike-pdf-merger":{"type":"http","url":"https://mcp.zovo.one/mcp/pdf-merger"}}}{"mcpServers":{"theluckystrike-pdf-merger":{"serverUrl":"https://mcp.zovo.one/mcp/pdf-merger"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
https://mcp.zovo.one/mcp/pdf-merger需要授权工具
15| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| path | string | 是 | 使用 pdf_upload 上传的 PDF 名称,或此服务此前生成的 PDF 名称 |
详细介绍
在 Claude 中合并、拆分 PDF 并填写 PDF 表单
只需说“在那张发票上盖上 PAID,并保存一份副本”或“从这份扫描件中提取第 2 到第 6 页,并与合同合并”,它就会在你的电脑上瞬间完成。这个 MCP 服务能处理那些小型 PDF 任务,否则你可能会把文件上传到某个网页:合并、按页码范围拆分、提取或重新排序页面、旋转横向扫描件、添加 PAID、DRAFT 或任意文本印章、在页脚添加公司名称和 VAT id、统计文件夹中所有文件的页数,以及将 PDF 文本读取为纯文本。不用上传、无需账号、无需原生依赖,也不用安装办公软件。
已收录于官方 MCP Registry(io.github.theluckystrike/pdf-merge-split-stamp-extract-pages)。
已列入 AI Product Index - 提供可用的远程端点 mcp.zovo.one/s/pdf,免费套餐,无需注册。

自由职业者业务中的 PDF 杂务,只需在聊天中完成,不必使用你不放心上传发票的浏览器标签页。
60 秒安装
@theluckystrike/mcp-pdf 的 npm 发布尚待完成。在此之前,可使用一键安装包 .mcpb,或克隆并构建;以下两种方式都已验证可用。
一键安装(.mcpb):从最新版本下载 pdf.mcpb,然后在 Claude Desktop 中双击:
https://github.com/theluckystrike/mcp-servers/releases/latest
(claude_desktop_config.json):
{
"mcpServers": {
"pdf": {
"command": "npx",
"args": ["-y", "@theluckystrike/mcp-pdf"]
}
}
}
Claude Code:
claude mcp add pdf -- npx -y @theluckystrike/mcp-pdf
(.cursor/mcp.json):
{
"mcpServers": {
"pdf": {
"command": "npx",
"args": ["-y", "@theluckystrike/mcp-pdf"]
}
}
}
上面的 npx 方式会在软件包发布后立即生效。在此之前,请使用上面的 .mcpb 安装包,或通过以下三个命令从源代码构建:
git clone https://github.com/theluckystrike/mcp-servers.git && cd mcp-servers
npm install
npm run build -w packages/mcp-license -w servers/pdf
然后,将客户端的 command 指向 node,并传入一个参数:servers/pdf/dist/index.js 的绝对路径。
若要使用 Pro 模式,请在同一个配置块中设置 MCP_LICENSE_KEY,或使用你的密钥调用一次 license_activate。
工具
| 工具 | 功能 |
|---|---|
pdf_info | 页数、每页的尺寸(以点和毫米为单位)、纸张名称(A4、Letter、自定义)、每页现有的旋转角度、元数据(标题、作者、制作程序、日期),以及文件是否已加密 |
pdf_count | 统计任意数量 PDF 文件的页数,并给出总页数。无法读取的文件会单独报告;其他文件仍会照常统计 |
pdf_merge | 按给定顺序合并 PDF。保留页面原有尺寸;如果合并后的文件包含多种尺寸,会对此作出说明 |
pdf_split | 每个范围生成一个新文件。"1-3,5,7-" 表示第 1-3 页、第 5 页,以及从第 7 页到最后一页。out_path_pattern 接受 {n}、{range} 和 {name} |
pdf_pages | 按你指定的顺序提取页面并生成一个新 PDF。"5,1,1" 会先放入第 5 页,再将第 1 页放入两次 |
pdf_rotate | 按 90 度的倍数旋转页面,并与页面现有旋转角度叠加,适用于旋转方向不正的扫描件 |
pdf_stamp | 在页面上添加文本:可使用 PAID 和 DRAFT 预设,也可自定义文本、颜色、位置、不透明度和大小。居中印章会沿 45 度对角线放置 |
pdf_watermark_business | 使用共享配置文件中的公司名称和 VAT id,在每页页脚添加信息;该配置文件由 mcp-invoice 和 mcp-docx 写入 |
pdf_text | 尽可能从页面内容流中提取文本。请参阅下方的注意事项 |
pdf_reorder | 按新顺序生成 PDF。顺序必须恰好列出每一页一次,以免意外遗漏页面 |
license_status | 显示免费或 Pro 模式 |
license_activate | 激活 Pro 密钥(离线验证) |
资源:pdf://recent 返回最近 25 次操作,按时间从新到旧排列,并附上输入内容、写入的文件及操作时间。
提示词:mark_invoice_paid 会串联 mcp-invoice 的 invoice_get 和 pdf_stamp PAID,并将盖章后的副本保存到原文件所在目录。
你可以这样说
| 你说 | 工具 |
|---|---|
| “将发票 INV-2026-0007 标记为已付款。” | mark_invoice_paid 提示词,然后是 pdf_stamp |
| “在我发送这份合同前,将 DRAFT 印在上面。” | pdf_stamp |
| “将这三份 PDF 合并成一个文件。” | pdf_merge |
| “拆分这份扫描件:第 1–3 页是发票,第 4 页起是收据。” | pdf_split |
| “从这份文件中提取第 2 到第 6 页,并另存为单独的文件。” | pdf_pages |
| “这份扫描件是横着的,把它转正。” | pdf_rotate |
| “这些文件总共有多少页?” | pdf_count |
| “这份 PDF 的第 1 页写了什么?” | pdf_text |
| “在页脚加上我的公司名称和 VAT 号码。” | pdf_watermark_business |
| “把封面页移到最前面。” | pdf_reorder |
示例
You: Stamp PAID on ~/invoices/INV-2026-0007.pdf and save a copy.
pdf_stamp {
path: "~/invoices/INV-2026-0007.pdf",
text: "PAID",
position: "center",
out_path: "~/invoices/INV-2026-0007-paid.pdf"
}
-> Stamped "PAID" on 1 page
-> ~/invoices/INV-2026-0007-paid.pdf, 0.9 MB
印章是绘制出来的文本,而不是扁平化的图像:可以选中并搜索,文本以预设绿色沿 45 度斜线绘制,原始文件则逐字节保持不变。
免费版与 Pro 版
| 免费版 | Pro 版 | |
|---|---|---|
pdf_info、pdf_count、pdf_text | 不限次数 | 不限次数 |
pdf_merge | 每次调用最多 5 个文件 | 文件数量不限 |
pdf_split、pdf_pages、pdf_rotate | 最多 30 页的文件 | 长度不限 |
pdf_stamp | 预设颜色的 PAID 和 DRAFT 预设印章 | 任意文本、颜色和大小 |
pdf_watermark_business | - | 在页脚添加您的公司名称和 VAT ID |
pdf_reorder | - | 支持 |
遇到套餐限制时,工具会返回说明,而不是报错;如果调用被拒绝,也不会写入任何内容。
Pro 版一次性付费 $19;也可支付 $39,一次性购买合集中的所有服务,终身使用。
pdf_text 尽力而为,具体含义如下
PDF 不存储文本,而是存储绘图操作符;你看到的文本是传递给字体的字节。本服务会使用 node:zlib 解压每一页的 FlateDecode 内容流,并读取四种显示文本的操作符——Tj、TJ、' 和 ",以及用于结束一行的定位操作符。这是此处编写的解析器,约有 200 行代码,不使用 pdfjs 或原生模块,并且存在三项实际限制;每次工具都会在自己的答复中说明:
- 扫描件没有文本。 纯图像页面不包含文本操作符,因此不会返回任何内容。这里没有 OCR,也不会添加 OCR;答复会说明该页面可能是扫描件,而不是只返回一个没有解释的空字符串。
- 自定义编码或 CID 编码返回的是字形索引,而不是字母。 子集嵌入字体和 CJK 字体会通过此解析器无法读取的表格,将字节映射为字形编号。如果输出中没有可读字符,答复会说明原因是字体。
- 读取顺序就是绘制顺序。 解析器不会检测分栏,也不会重建布局。通过
TJ数组中较大的负字距恢复单词间的空格,因此,如果 PDF 将每个单词分别定位,返回的文本可能会将单词连在一起。
由文字处理软件、开票工具和报告生成器创建的 PDF,以及使用标准字体或完全嵌入字体的 PDF,都能干净地读取。其他情况则会说明无法读取的原因。
遇到加密 PDF 时会拒绝处理,而不是猜测
pdf-lib 无法解密;如果忽略加密加载文件,生成的页面会是一堆垃圾,并被直接写入输出。因此,所有会写入文件的工具都会拒绝处理尾部包含 /Encrypt 字典的文件,并在消息中说明原因和解决方法:使用带密码的阅读器打开文件,然后导出或打印为新的 PDF,再使用该文件。pdf_info 仍会返回结果,并标记 encrypted: true,因为它的工作就是报告信息;pdf_count 则会将其报告为一个无法读取的文件,同时继续统计其余文件。
现有文件绝不会被覆盖,输入也绝不会被修改
每个工具都会写入新文件,并逐字节保留输入原样;这是有意为之,不提供原地修改模式。
如果 out_path 已存在,则会拒绝:
Error: /path/merged.pdf already exists and nothing was written.
Pass overwrite: true to replace it, or give a different out_path.
路径通过独占创建来预留,而不是通过检查是否存在来预留,因此两个进程同时写入相同的 out_path 时不会互相覆盖:一个成功,另一个被拒绝且不写入任何内容。pdf_split 会在写入前预留所有输出路径,因此第 3 个分段发生冲突时,不会留下只完成一半的第 1、2 个分段;预留也会被释放,因此磁盘上不会留下空文件。
如果你希望替换文件,请传入 overwrite: true。
overwrite: true 仍不允许将输出设为输入。把操作结果写回它自己的某个源文件会破坏该源文件:页面已经载入内存,随后会被写回其来源文件,这会把一个三页文件变成你提取出的那一页,之后每次读取该路径都会悄悄读到错误内容。因此,如果 out_path 解析后与同一次调用的任何输入相同(或与其共享 inode),操作会在开始前被拒绝:
Error: out_path /path/scan.pdf is also an input of this operation, so writing it would destroy the source.
Nothing was written. Write beside it instead - /path/scan-out.pdf - and, if the result really is meant to
take the original's place, rename it yourself once you have checked it.
限制
- 拒绝处理超过 100 MB 的输入:重写 PDF 需要占用相当于文件大小数倍的内存。
- 如果文件不是以
%PDF-开头,则会在读取任何内容前被拒绝。 - 旋转会以页面元数据的形式记录,角度必须是 90 度的倍数;这是该格式所支持的全部角度。不会重新绘制内容。
- 印章文字会使用内置 PDF 字体,该字体支持 WinAnsi 的 256 个码位。不支持的字符如果有明显的拉丁字母形式,会进行转写;例如,波兰语的
OPŁACONE印章会转写为OPLACONE,答案会说明这一点并显示实际绘制的内容。不支持的字符会被移除并计数,因此无法生成 CJK 印章。换行符会被视为词语分隔符,绝不会导致内容被删除。 font_size必须介于 1 到 1600 点之间。如果印章文字过长,即使使用此服务端采用的最小字号也无法容纳,仍会绘制,并在答案中说明超出边缘的距离,方便你缩短文字。pdf_text的单次答案上限为 200,000 个字符,并会指出应使用哪个pages参数从截断处继续。文件内容不会缺失;截断的是答案,而非读取结果。- 不支持页码、签名、涂黑或压缩。此服务端只执行页面级操作,并非 PDF 编辑器。它不会写入 PDF/A:
pdf_info会报告文件自身的pdfa_claim,每个写入文件的工具都会明确说明其输出不再符合该声明。 - 表单只读取,不填写:
pdf_text会打印 AcroForm 字段值,这些值存储在字段中,而非页面内容流中,因此不属于页面文本。 - 不支持 OCR。请参阅
pdf_text部分。
数据存储方式
只记录执行过的操作:${XDG_DATA_HOME:-~/.local/share}/mcp-servers/pdf/operations.json,以纯 JSON 格式保存最近 500 条操作。你的 PDF 会保留在原处。每次写入记录时都会在 .../pdf/.lock 上持有建议锁,因此同一数据目录中的两个客户端不会丢失记录;数据会先保存到临时文件,再重命名到目标位置。
如果记录不可读或不是有效的 JSON,绝不会将其视为空记录:文件会逐字节移至一旁,命名为 operations.json.corrupt-<timestamp>,并在旁边附上标记。你请求生成的 PDF 仍会写入;在处理记录之前,文件就已写入磁盘;答案会告知你历史记录未能更新。
业务页脚会读取整个工具套件共用的配置文件 ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/profile/business.json,该文件由 mcp-invoice 或 mcp-docx 中的 business_set 写入。不会编造任何信息:如果未存储名称,pdf_watermark_business 会拒绝操作并告知你应运行哪个工具。
隐私
所有数据都保留在本地。服务会在你的机器上读写文件,不会发起任何网络请求—— 不会用于许可验证(密钥会离线验证),不会用于获取字体,也不会用于遥测。你添加印章的 PDF 永远不会上传到任何地方,这正是这个项目存在的全部原因。
搭配使用
- mcp-invoice:给你发出的发票添加“已付款”印章:
mark_invoice_paid提示词会将invoice_get与pdf_stamp串联起来。 - mcp-docx:将提案写为
.docx,打印为 PDF,然后在此处添加印章、合并或拆分。 - mcp-resume:将简历、求职信和作品集合并为申请表接受的单个文件。
- office-suite:一个安装包中包含多个服务,只需配置一项。
故障排除
npx卡住或找不到软件包:此软件包仍在等待发布到 npm。在发布之前,请使用上方的.mcpb捆绑包或克隆并构建的方式。- “已加密,因此拒绝处理”:该文件受密码或权限保护。请在 PDF 阅读器中打开它,导出或打印为新的 PDF,然后对副本运行工具。此服务不会猜测或移除密码。
pdf_text未返回任何内容:页面是扫描件,或其字体使用了自定义编码。答案会说明是哪种情况。此处不提供 OCR。- 印章太小或太大:默认情况下,印章会调整大小以适应页面宽度。如需精确字号,请传入
font_size,并将opacity设为 0 到 1 之间的值。 - “文件已存在,未写入任何内容”:请传入
overwrite: true,或使用不同的out_path。 - Node 版本:需要 Node >= 18。使用
node -v检查。
采用 MIT 许可证。支持:[email protected]
由 theluckystrike 构建。
常见问题
有用于合并和拆分 PDF 的 MCP 服务吗?
有。mcp.zovo.one 上的 pdf 服务可以合并、拆分、旋转 PDF 并填写 PDF 表单,同时保留表单字段。拆分/提取页面/旋转操作对每个文件有 30 页的免费额度,提供托管的远程端点,无需安装。
Claude 能通过 MCP 服务填写 PDF 表单吗?
可以——连接 https://mcp.zovo.one/mcp/pdf,然后让 Claude 填写表单字段或合并多个 PDF。输出会保留表单,因此填写的字段仍可编辑。
将这些文档用作 MCP 服务
任何 MCP 客户端(Claude、Cursor、Windsurf、VS Code)都可以通过 GitMCP 直接读取此代码库的文档——无需安装:
- 文档 MCP URL:https://gitmcp.io/theluckystrike/mcp-pdf
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。