本帖最后由 cxs808 于 2026-7-10 10:29 编辑
=============================
2026.07.09中午更新
发这个帖子的时候,我完全没想到会有这么多朋友喜欢。
7月5日发表,7月7日帖子冲到了热度第一,40多页几百条回复,大多都是在说“好用”“帮大忙了”。
说实话,每一条我都认真看了,心里挺暖的。
也有很多朋友提出了非常棒的建议。
140楼 涛之雨说:拆分后,点击下载,会弹出多个下载窗口
建议打包zip下载,连续下载会被浏览器拦截
我觉得有道理,于是把拆分功能的下载方式改成了打包下载,点一下保存按钮就行,干净利落。
有人说,输入页码范围的时候,有时候会不小心切成全角逗号,能不能自动识别?
我加了一个小功能,输入“1,3,4”的时候,全角逗号会自动变成半角逗号“1,3,4”,不用手动切换输入法了。
389楼 飘缈孤鸿影说:可以加上压缩体积的功能吗
150楼 lizwan说:不错,加进去PDF压缩功能就更好了
152楼 gracezp说:感谢分享,下载过来试一试,建议把pdf减肥的功能也加上
298楼 树下彩虹025说:非常感谢,办公电脑不能安装软件,wps会员也不能用,有了网页版本的更方便。提个要求不知道能否实现:PDF文件压缩,带图片或者word转的pdf文件都很大,但是邮箱有容量限制只能发50mb的附件(因为发客户的又不能拆多个压缩包);就是把原来pdf的dpi改小,原来是300dpi,现在改成90dpi,只要电脑能看就行,不用打印。希望楼主帮忙加入这个功能,谢谢!
我增加了一个“PDF压缩”的模块,可以自由设置压缩率。
下载时弹出的对话框里有文件大小,可以作为参考。
PDF 压缩核心代码压缩原理:使用 pdf.js 将每页渲染为 Canvas,再用较低质量重新编码为 JPEG 图片,最后通过 pdf-lib 重新打包。[JavaScript] 纯文本查看 复制代码 // 1. 用 pdf.js 加载原文件
const pdfDoc = await pdfjsLib.getDocument({ data: arrayBuffer }).promise;
const totalPages = pdfDoc.numPages;
// 2. 创建新 PDF
const newPdf = await PDFLib.PDFDocument.create();
// 3. 逐页渲染 → 压缩 → 嵌入
for (let i = 1; i <= totalPages; i++) {
const page = await pdfDoc.getPage(i);
const viewport = page.getViewport({ scale: 1.5 }); // 控制分辨率
const canvas = document.createElement('canvas');
canvas.width = viewport.width;
canvas.height = viewport.height;
await page.render({ canvasContext: canvas.getContext('2d'), viewport }).promise;
// JPEG 压缩,quality 越低体积越小
const blob = await new Promise(res => canvas.toBlob(res, 'image/jpeg', 0.7));
const imgBytes = await blob.arrayBuffer();
const img = await newPdf.embedJpg(imgBytes);
const newPage = newPdf.addPage([viewport.width, viewport.height]);
newPage.drawImage(img, { x: 0, y: 0, width: viewport.width, height: viewport.height });
}
// 4. 保存输出
const compressedBytes = await newPdf.save();
252楼 hybcrp说:合并pdf文件每个文件都显示页数了,能不能在下面增加显示一共多少个文件,一共多少页的功能,谢谢
我在“常规合并”模块里添加了这个功能。
41楼 ming_2794说:感谢分享好工具,拆分PDF:能不能添加一个按书签拆分的功能呢
我添加了“按书签拆分”这个模块。这个比较费劲,耽误了很久。
拆书原理:通过 pdf.js 读取 PDF 书签(大纲)树,计算每个章节的页码范围,再用 pdf-lib 提取对应页面。关键点在于书签页码需要通过 getPageIndex 转换为实际页码。
[JavaScript] 纯文本查看 复制代码 // 1. 读取书签结构(递归解析嵌套大纲)
async function flattenOutline(items, pdfDoc, level = 0) {
const result = [];
if (!items?.length) return result;
for (const item of items) {
let pageNum = null;
if (item.dest?.length) {
// 将内部索引转换为真实页码
const realIndex = await pdfDoc.getPageIndex({
num: item.dest[0].num,
gen: item.dest[0].gen || 0
});
pageNum = realIndex + 1;
}
result.push({
title: item.title,
pageNum,
level,
checked: true,
children: await flattenOutline(item.items, pdfDoc, level + 1)
});
}
return result;
}
// 2. 计算章节页码范围
function getPageRange(node, allNodes) {
const startPage = node.pageNum;
// 找到下一个同级或更高级别书签的页码作为结束边界
const endNode = allNodes.find(n =>
n.pageNum > startPage && n.level <= node.level
);
return {
start: startPage,
end: endNode ? endNode.pageNum - 1 : totalPages
};
}
// 3. 提取页面并生成新 PDF
const newPdf = await PDFLib.PDFDocument.create();
const range = getPageRange(selectedBookmark, allBookmarks);
const indices = [];
for (let p = range.start; p <= range.end; p++) indices.push(p - 1);
const pages = await newPdf.copyPages(srcPdf, indices);
pages.forEach(p => newPdf.addPage(p));
const bytes = await newPdf.save();
43楼 skzhaixing说:为什么要分三个页面 都加在一个页面不行么
112楼 xpin说:9个功能有3个独立文件,能否合并为1个独立执行文件?
我就把另外2个的功能都迁移过来了。
159楼akang说,最想要增加个pdf漂白功能,这方面夸克做的真的太好了,自己拍的那些合同一漂白干干净净清清楚楚还省打印机墨粉。
考虑到这个功能特别耗费浏览器的资源,暂时没有想到好的解决方案,这次没有添加,后续慢慢来。
8.最重要的,冥界3大法王点评我了。
还差OCR和AI翻译就牛逼到尽头了,哈哈。 发表于 2026-7-8 20:42
妈呀,能被大法王翻牌子,真是受宠若惊啊。
这2个功能先记下来,后续再添加,近期准备休息一段时间。
136楼 15881说:感觉回到了10年前那会儿互联网很友好的分享精神和创作精神
所以这个工具箱能长成现在这个样子,不是靠我一个人闭门造车,而是靠大家的反馈一点一点打磨出来的。在此,谢谢每一位认真使用、认真提建议的朋友。
你们的想法,我一个一个记了下来,慢慢往上加。这才有了现在这个合集。
宠粉,我是认真的。
现在这个版本算是V3.0了,共有11个模块,分别是常规合并、交替合并、常规拆分、按书签拆分、拆分对开页、旋转、删除、PDF转图片、图片转PDF、页面重排、PDF压缩。
大家直接下载最新版就行。
可以下载附件,没有币的也可以到我的Github下载:https://github.com/wallechfox/offline-pdf-tools
离线PDF工具箱V3-11项功能-单文件版.rar
(737.1 KB, 下载次数: 526)
=====================================================
以下是原贴
有天晚上快十二点了,手机一亮,一个朋友发来消息:“兄弟,睡了没?问你个事儿,有没有能合并PDF的软件?”
我说有啊,网上搜一下很多。
他回:“我搜了,那个要开会员,我就月底合一次报销发票,为这事儿充个会员,太亏了。”
我说那用在线工具也行,免费的不少。
他犹豫了一下,发来一句:“有些文件上有身份证号和银行卡号,上传到网上……不太放心。”
这句话把我点醒了。 是啊,谁的电脑里没几个带隐私的PDF?合同、身份证扫描件、工资单、财务报表。
为了合并几页文件,就要把它们上传到一个自己完全不了解的服务器上,确实让人心里打鼓。
我就想,能不能做一个东西,三个要求:不用安装、不用联网、什么电脑都能打开,就把合并、拆分、旋转、删除这几个小事儿办了?
后来我用一个叫pdf-lib的开源库,把这些功能全写进了一个HTML文件里。
对,就是一个网页文件,双击就能在浏览器里打开。
体积很小,界面干净,没有任何广告。
最关键的是,你的文件从头到尾都在自己电脑上,不联网,不上传。不信你拔了网线试试,照样跑得飞起。
第一个版本做完,我自己用了几天,觉得还行,就发了出来。
没想到好多朋友留言说好用,还有不少人提了新的想法。
江苏一位网友说,想要交替拆分的功能,于是我就增加了按奇偶页拆分的选项。
后来一位山东的网友提出需要按奇偶页合并,我实在想不出具体应用场景,就没有加到原工具箱里,而是单独做了一个页面来实现。
还有好几位问:PDF能转图片吗?一堆图片能合成PDF吗?能不能像整理手机相册一样,把PDF页面拖来拖去自由排版?
我一个一个记了下来,慢慢往上加。
到现在,这个工具箱一共有9个功能了
。每一个,都是因为有人真的需要。
今天我把它们拢到一块儿,全套工具一共9项功能,分成了3个网页文件。
其中合并、拆分、旋转、删除、PDF转图片、图片转PDF、页面重排、页面重排这7项功能全部放在一个网页文件里,拆分书籍对开页和交替合并这2项功能分别是一个单独的网页文件。
以后你自己或者身边朋友遇到这些事儿,知道有这么个小工具就行。
1. 合并PDF:30秒,不用求人
第一个功能,就是给我那个深夜求助的朋友做的。操作特别简单:把要合并的PDF文件全拖进来,按住每个文件前面的小图标上下拖动,就能调顺序。
谁在前谁在后,你说了算。点一下按钮,合并好的文件就下载了。
月底报销,一堆电子发票、申请单、支付截图,领导让整理成一个PDF归档。以前要么找IT帮忙,要么咬牙开会员。现在全选文件拖进去,排好顺序,一键完事儿,全程30秒。
2. 拆分PDF:想留哪页留哪页,四种拆法随便选
有个做销售的朋友跟我说,上游厂商发来的产品手册几百页,客户就想要其中五六页看看。
他以前把整个文件发给客户,人家下载半天,打开翻半天,体验特别差。 现在简单了,把文件拖进来,输入“3-8”,几秒钟就能把那几页抽出来,单独存成一个PDF。
文件小,传输快,客户打开就是他想看的内容。
除了这种按页码提取,我还加了另外三种拆法:按固定页数自动切分、全部炸成单页、按奇偶页分开。奇偶拆分是江苏那位网友提的,双面打印的扫描件,先按奇偶拆开,再单独处理,特别顺手。
3. 旋转页面:脖子终于不疼了
你一定遇到过这种PDF:打开一看,内容是横着的,甚至倒过来的。
还有的文件正文是竖版,中间夹了几页横排的表格,歪着脑袋看半天。
把文件拖进来,输入要旋转的页码,不填就默认全部。点一下向左或向右90°,下载。规规矩矩的竖版文件就回来了。
4. 删除页面:发出去之前,抢救一下
一个同事跟我说过一件尴尬事。他做了一份方案发给客户,发完才发现里面夹了一页内部批注意见和两页空白页。
撤回已经来不及了,对方正在看。
这个功能就是救这种急的。把PDF拖进来,输入要删的页码,比如“2,4,6-8”,点一下按钮,这些页面就被彻底移除,生成一个干干净净的新文件。不用回原文档重新导出,几秒钟抢救完毕。
5. PDF转图片:比截图清晰多了
有朋友问:领导发了个产品手册PDF,让我把其中几页插到Word方案里当配图。截图吧,清晰度不够;导出吧,又不知道用什么工具。
把PDF拖进来,每一页都会生成高清预览图。
你可以选JPG还是PNG,调画质,还能设置分辨率倍率,最高能到360DPI,打印都够了。鼠标停在某一张上,点右上角的下载按钮就能存下来,也可以一键打包下载全部。 小提醒:如果PDF页数特别多、文件特别大,预览可能会有点慢。
建议先用拆分功能把需要的那几页提取出来,再转图片,这样更快。
6. 图片转PDF:手机拍的合同,终于有个正经样子了
用手机拍了一堆合同页、证件照、收据,想拼成一个PDF发给对方。
以前要么一张张往Word里插,要么找扫描App还得看广告。
现在直接把图片拖进来,JPG、PNG、WebP、BMP都支持。
所有图片在网格里排列,你可以拖拽调顺序,勾选删掉不要的。
点“导出为PDF”,一份A4纵向的文档就生成了,每张图片自动缩放居中,干干净净。还加了两个快捷键:Ctrl+A全选,Delete删除选中图片,处理几十张图的时候效率拉满。
7. 页面重排:像整理相册一样
这是我自己特别喜欢的一个功能。入职的时候,HR让把毕业证、学位证、成绩单、四六级证书,按指定顺序合成一个PDF交上去。
以前我得一个个打开看,记住顺序,再找工具合并。脑子一乱就排错,又重新来。
现在把所有这些PDF一口气拖进来,所有页面像相册一样平铺开,缩略图清清楚楚。手指拖一拖就能调顺序,不想要的勾选删除,还能一键加空白页。调满意了,点导出,一个排得整整齐齐的新PDF就出来了。
8.对开页切分:你拥有一把精准的裁纸刀
这个功能是一个广东网友提出来的,书籍拍照是两个面一起拍的,想沿着中线给分割。
上传PDF后,可切换预览每页,为每页独立选择左右拆分、上下拆分或不切割模式。
通过拖拽预览画布上的红色分割线,实时调整裁剪比例,并借助标尺与浮动数值精确定位。
对于每一页,你可以精确的选择横切还是竖切,也支持一键将当前比例模式应用到全部页面,最终输出“原文件名_分割.pdf”。
切割后的页面如下图所示:
9.交替合并:不知道有什么用
交替规则是“文件1第1页→文件2第1页→文件3第1页…再回到文件1第2页”,循环直到所有页面用完;如果某个文件页数不够就自动跳过,继续从其他文件中取页,直到全部取完。
PS:我也不知道这个功能有什么用,既然有人提出了,我就只管写代码。
这9个功能加起来,基本覆盖了日常办公里遇到的绝大多数PDF麻烦。
我不敢说它有多强大、多专业,但有一点我能保证:干净、安全、免费、离线。
这是我从一开始就定下来的原则,以后也不会变。
这个工具箱是一个单网页文件,不需要安装任何软件,双击就能在浏览器里打开。
Windows、Mac、Linux、安卓手机、苹果手机,甚至单位的老电脑、国产系统,只要能运行浏览器,它就能用。
离线PDF工具箱-单文件版.rar
(1.39 MB, 下载次数: 3370)
|