好友
阅读权限20
听众
最后登录1970-1-1
|
本帖最后由 cxs808 于 2026-7-12 22:07 编辑
=============================
2026.07.12晚上更新
大家的每一页的评论我都看了,并把其中的意见建议整理了出来,对这个工具箱进行了全面升级,现在共有15个功能模块了。
可以说,这个工具箱能走到今天,离不开大家的群策群力,是众多打工人实际需求的汇总,是大家共同智慧的结晶。
向大家报告一下新增加的内容。
---------------------------------------
2026-7-6 21:51_130楼ailmail说:
挺好的,就差一个加密 pdf
注:此功能已实现。增加了一个新的模块“pdf解密”。
PDF加密包括2种,打开密码(User Password,也就是没这个密码就无法看到文件内容)和权限密码(Owner Password,也就是可以看到内容,但是无法打印)。
本程序可去除 PDF 文件的权限密码(Owner Password),解除打印、编辑、复制等限制。
如果文件有打开密码(User Password),需要您输入正确密码后才能解密。
---------------------------------------
2026-7-10 09:40_594楼dbfans说:
能否新增 PDF 属性编辑功能,支持修改导出文件的标题、作者、主题及关键词?目前导出的 PDF 无法编辑以上信息,导出来的PDF信息是全部是空白的。
注:此功能已实现。
常规拆分、 按书签拆分、 拆分对开页这3种方式拆分出来的文件,都带的有原来pdf的元数据。
合并功能生成的pdf不会带原来文件的元数据,因为2个文件不同的元数据会冲突。
同时,常规拆分中的按页码范围拆分,下载的文件改为pdf,不再压缩,因为这时下载的只有一个文件。
---------------------------------------
海南网友在公众号里留言:
3.0已非常好!能否扫描件一键合并?正面顺序(文件A页码1,3,5,7),反面顺序(文件B页码2,4,6,8)。正面顺序(文件A码1,3,5,7),反面逆序(文件B页码8,6,4,2),能否做到html版本里?
一体机扫描时,有些纸张或文件较旧容易卡纸,不能自动双面过纸扫描,只能单面过纸扫描1,3,5,7,扫描完,反面逆序直接就放一体机里扫描,不用重新调多页纸的顺序。
注:此功能已实现。增加了一个新的模块“页面倒序”。
▪ 将 PDF 的所有页面顺序完全反转:第1页变最后一页,最后一页变第1页。
▪ 保持原始文件质量,文字型 PDF 不会转为图片,体积不变。
▪ 保留原文件的标题、作者等元数据信息。
[JavaScript] 纯文本查看 复制代码 // 获取所有页面索引并反转
const pageIndices = srcPdf.getPageIndices();
pageIndices.reverse();
// 按反转后的顺序复制页面到新文档
const newPdf = await PDFLib.PDFDocument.create();
const pages = await newPdf.copyPages(srcPdf, pageIndices);
pages.forEach(p => newPdf.addPage(p));
// 保留元数据
const title = srcPdf.getTitle();
const author = srcPdf.getAuthor();
// ... 其他元数据读取
if (title) newPdf.setTitle(title);
if (author) newPdf.setAuthor(author);
// ... 写入其他元数据
const bytes = await newPdf.save();
---------------------------------------
2026-7-10 17:43_647楼95Dylan说:
感谢分享,非常好用。但图片转PDF有个小问题,把多个图片选中之后,呈现出来的顺序是混乱的,而且不能手动调换顺序,只能一张一张的添加图片才能让页码正确。
注:已修正。
现在图片转PDF模块中,图片可以拖动改变顺序了。
另外,新增批量拖拽,勾选多张后,拖拽其中一张即可同时移动所有选中图片
---------------------------------------
2026-7-8 15:38_347楼jxwfz740724说:
话说能加个去除和加页眉页脚功能吗?
2026-7-10 08:58_577楼黎明_说:
pdf添加页码
2026-7-10 09:27_588楼没头脑与不高兴说:
很强,能不能添加一个加页码的功能,谢谢
2026-7-10 15:05_632楼没头脑与不高兴说:
谢谢楼主,希望来一个增加页码的功能,能自动编好序号
注:此功能已实现。增加了一个新的模块“添加页码”。
页码样式:提供 1/10、Page 1 of 10、— 1 —、1 四种预设格式,支持 {num} 和 {total} 占位符
字体选择:支持 Times Roman、Helvetica、Courier 三种 PDF 内置字体
字号可调:8-24pt,默认 14pt(对应 Word 四号字),支持加粗
位置灵活:水平支持左/中/右三种对齐方式,可分别设置距底部和距左右边距(mm)
奇偶页对称:勾选后,偶数页的左右位置自动互换,适合双面打印
实时预览:右侧预览窗口可逐页查看效果,所见即所得
保留元数据:生成的 PDF 保留原文件的标题、作者等元数据信息
[JavaScript] 纯文本查看 复制代码 // 嵌入内置字体(不需要 fontkit)
const font = PDFLib.StandardFonts.Helvetica;
const embeddedFont = await newPdf.embedFont(font);
// 逐页绘制页码
for (let i = 0; i < total; i++) {
const page = newPdf.getPage(i);
const { width, height } = page.getSize();
const text = getStyleText(i + 1, total); // 例如 "1/10"
const textWidth = embeddedFont.widthOfTextAtSize(text, fontSize);
// 计算位置(居中为例)
const x = (width - textWidth) / 2;
const y = mmToPt(marginMm); // mm 转 pt
page.drawText(text, {
x, y, size: fontSize, font: embeddedFont,
color: { type: 'RGB', red: 0, green: 0, blue: 0 }
});
}
---------------------------------------
2026-7-8 12:31_325楼qyercc说:
NB,已评分,希望LZ后续能加个“批量水印”小工具,这样更实用了,谢谢!(其实是自己想要哈哈哈哈哈哈哈)
2026-7-9 15:49_453楼ibeyond0212说:
是否可以pdf加水印然后导出图片格式最后再把图片合并成pdf这样保证水印无法去除,是否可以集成在软件你们,谢谢
2026-7-9 19:29_521楼wojaiyh说:
呼叫大佬 可以盖章就好了(包括骑缝章)~!!!
2026-7-10 14:40_627楼lijiaqing说:
想要对PDF文件名加系统时间年月日时分秒,然后在将文件名作为文字水印内容,在PDF文件顶上正中间,红色字体恰当字号显示,重点来了,能直接拖拽就实现的方式快速完成最好
2026-7-10 08:58_577楼黎明_说:
dalao想求几个功能
可以添加文件名作为水印
pdf添加页码
合并后列出合并前文件所在的页码这样子?
2026-7-11 09:21_654楼suiyueanya说:
楼主好,能增加水印功能吗?
注:此功能已实现。增加了一个新的模块“添加水印”。
可添加文字或图片水印,支持自定义样式和实时预览。
文字水印:支持中文/英文任意文字内容,字号 8-120pt,颜色可选预设色块或自定义取色
图片水印:支持上传 PNG/JPG 图片
两种水印的缩放比例 10%-100%,透明度 5%-100%,旋转角度 0-360°,可选择居中或平铺
[JavaScript] 纯文本查看 复制代码 // 文字水印:Canvas 渲染 → embedPng → drawImage
async function renderTextToImage(text, fontSizePt, fontName, hexColor, opacity, rotateDeg) {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
// ... 设置字体、颜色、透明度
ctx.translate(canvas.width/2, canvas.height/2);
ctx.rotate(rotateDeg * Math.PI / 180);
ctx.fillText(text, 0, 0);
// 导出 PNG
const blob = await new Promise(r => canvas.toBlob(r, 'image/png'));
return await blob.arrayBuffer();
}
// 嵌入 PDF 并绘制到每页
const pngBytes = await renderTextToImage(text, fontSize, fontName, color, opacity, rotateDeg);
const textImage = await newPdf.embedPng(pngBytes);
for (let i = 0; i < total; i++) {
const page = newPdf.getPage(i);
const { width, height } = page.getSize();
// 居中绘制
page.drawImage(textImage, {
x: width/2 - imgW/2, y: height/2 - imgH/2,
width: imgW, height: imgH
});
}
------------------------------------------
在此,再次谢谢每一位认真使用、认真提建议的朋友。
宠粉,我是认真的。
现在这个版本升级到V4.0了,共有15个模块,分别是常规合并、交替合并、常规拆分、按书签拆分、拆分对开页、旋转、删除、PDF转图片、图片转PDF、页面重排、页面倒序、添加页码、添加水印、PDF压缩、PDF解密。
大家直接下载最新版就行。
下载地址:https://github.com/wallechfox/offline-pdf-tools
离线PDF工具箱V4-15项功能-单文件版.rar
(661.51 KB, 下载次数: 122)
=============================
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, 下载次数: 617)
=====================================================
以下是原贴
有天晚上快十二点了,手机一亮,一个朋友发来消息:“兄弟,睡了没?问你个事儿,有没有能合并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, 下载次数: 3447)
|
免费评分
-
查看全部评分
本帖被以下淘专辑推荐:
- · 收藏帖子|主题: 1315, 订阅: 43
- · 实用|主题: 542, 订阅: 29
- · 实用工具|主题: 81, 订阅: 20
- · 用到时方恨少|主题: 136, 订阅: 16
- · 实用工具软件|主题: 110, 订阅: 15
- · 我的工具箱|主题: 128, 订阅: 12
|