爱意满满的作品展示区。
Sy007

[分享] 做了个纯本地的 PDF 工具站,合并压缩都在浏览器里跑

  •  
  •   Sy007 · Oct 29 · 674 views

    起因是每次要给客户发合同,都得先找个在线工具压一下体积,压完就开始担心这份文件在别人服务器上留多久。干脆自己写了一个,把能在本地做完的全部放本地。

    • 合并 / 拆分 / 压缩 / PDF ↔ 图片:pdf-lib + pdfjs-dist ,浏览器里完成,不上传
    • Word 互转 / 加解密:这两个必须服务端(排版引擎和加密库跑不了 WASM 版本),处理完即时删除

    技术栈 FastAPI + React 。SSR 只用来注入 head 和正文(为了 SEO ),工具逻辑全在前端。

    几个实际踩到的坑:

    1. pdf-lib 的 copyPages 会丢 AcroForm 表单域 —— 字段定义在文档级的 /AcroForm 里,不在页面上,复制过来的是死框
    2. pdfjs 的 worker 必须同源 —— 指向 CDN 会被浏览器拒绝,静默退化成主线程解析,大文件直接假死
    3. 「压缩」本质是重采样图片 —— 纯文字 PDF 的体积在嵌入字体上,怎么调质量参数都压不动
    4. iOS Safari 没有 showSaveFilePicker —— 而且 blob URL 不及时 revoke 会把内存吃光,Safari 会通过杀你的标签页来回收

    完整的 7 条踩坑记录(带代码)写在这儿了: https://juejin.cn/post/7701924631909089280

    站点: https://pdf.iceai.cloud 无广告无水印,也不打算收费。有想加的工具可以说。

    Sy007
    Sy007
    OP
    4 days ago
    1
    补两条,都是站上有人问过的问题:

    一、压缩没效果基本都不是参数问题。Word 导出的文字 PDF ,体积全在嵌入字体里,里面根本没几张图,怎么调质量参数都只有个位数百分比;扫描件本质是一堆 JPEG ,降分辨率重编码,压掉 60%–85% 很正常。先分清是哪种,别在压缩上死磕。

    二、拆完打不开、或者合完页码乱序,多数是 /Annots 和 /AcroForm 没跟着复制,属于上面第 1 条坑的另一种形态。

    这类具体场景整理成了三十来篇,在 https://pdf.iceai.cloud/guides ,比首页详细很多。

    另外想收集一下真实卡点:你们平时被卡得最多的是「文件超 2MB 传不上去」,还是「拆完对方不让上传」?我按反馈排优先级。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2491 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 04:34 · PVG 12:34 · LAX 20:34 · JFK 23:34
    ♥ Do have faith in what you're doing.