我在浏览器里做了个文件处理的小工具,100+功能,文件不走服务器

0 阅读8分钟

我在浏览器里做了个压图拆 PDF 的小工具,文件不走服务器

一张 1.9 MB 的图,我把它拖进浏览器里一个叫 FileCut 的页面,点一下开始压缩,出来那个文件是 1.4 MB,界面上给我写了一行字,减小了 25.7%,这站是我自己搭的,不用注册,所有功能永久免费请添加图片描述
我这次摆出来的东西都是我自己环境上跑出来的,先给对表用,Windows 11,Node v24.12.0,站点 1.0.0,压缩用的是浏览器里的 browser-image-compression,抠图那个引擎是 @imgly/background-removal,
这两个库的版本我没往这儿抄,仓库 package.json 里对着看就行。

为什么不写后端

做这个的由头不太体面,我手上有些东西是真的不敢往别人的服务器上扔,合同,身份证的扫描件,还没发出去的设计稿,随手一传就不知道落到哪儿去了
我在仓库的 README 里写过一句英文,原话是 Every “free online converter” uploads your file to someone’s server.,中文是我照着翻的,
说那些打着免费旗号的在线转换工具,其实是把你的文件传到某人的机器上去了,

话说完我就得自己做一个能站得住的,光写一句我们重视隐私没用,那是政策不是事实,
所以我干脆不写后端,没有上传这一步就不存在要信我的地方,也不用你信我。

代价也真在那儿摆着,有服务器才能限次数,才能做批量,才能把用量做成一张能谈价的表,这些我全放弃了
它赚的就是你不用信我这一件事,压缩这一步用的是浏览器里的一个压缩库,跑在 Worker 线程上,主线程不动,所以页面不会卡住,进度条还能走。

能干什么

压图这件事真的就是这么个事,你发朋友圈嫌原图太大,或者要塞进一个有附件上限的邮件里,手机拍完直接拖进去点一下就行了,真的不用注册也不用留你邮箱,
我这一张走的还是默认那一档,目标大小那个框我都没填,出来就是 1.4 MB,真的就这么一个事。

拆页我也跑了,同一个文件,一个 99.9 KB 的三页 PDF,页码范围填 1 到 3,出来真的就是 60.7 KB 的一个 PDF,我不填范围点全部拆分呢,它给你的是一个 98.9 KB 的压缩包,
里面三个单页 36.8,38.9,22.9 KB,文件名是 sample_p1,p2,p3,就是那种你合同里有一页要单独发给谁,不用再重新导出,那一个文件你直接就能发出去的情况。

页码范围那一格页面上有提示,逐字是「用英文逗号分隔,支持区间」,格式写的是 1-3,5,7-10,我自己只填过 1 到 3,那个样张就三页,页更多的文件我没试,不敢跟你说一定顺,你要用就从一个你真有把握的文件开始。

还有一个是转 Word,同一个 PDF 你把它交给 PDF 转 Word 那一页,出来一个 6.6 KB 的 docx,Word 打得开,字也是真的能改,这三件事走的是同一批入口,不用注册也不用留邮箱,我到现在也没在网络面板里看见把文件发出去的那一步,这个是真的没有。

你丢进去的东西你拿走的东西
photo.png,1.9 MB,质量档 70%1.4 MB 的新图,界面写减小了 25.7%,本地复跑一次写 25.8%
sample.pdf,99.9 KB,3 页,全部拆分三个单页 36.8,38.9,22.9 KB,外加 98.9 KB 的压缩包
同一个 PDF,页码范围填 1 到 3sample_p1-3.pdf,60.7 KB
同一个 PDF 走 PDF 转 Wordsample.docx,6.6 KB

同一张图两次跑出来的百分比在小数点后一位是不一致的,25.7 和 25.8,这个我也没去查原因,就照实写在这儿,两个数都留着。
那一格目标大小我从头到尾没填过,你如果想压到某个数以下就自己去填,填了会出什么结果我没测,不敢在这儿替你编,
你手上那张要是截图,默认那一档出来就挺干净,照片的话也一样,都是拖进去点一下的事。

请添加图片描述

网络面板我一路开着,里面只有页面自己那几条请求,没有一条是把我那个文件的内容发出去的,
把面板切到离线再点一次压缩,它照样给我压出 1.4 MB,这是我这台机器上看见的,别的我不吹。
线上那一次我留了整页截图,跟本地跑的是同一个结果,1.9 MB 到 1.4 MB。

请添加图片描述

本地跑一遍

仓库里现成的命令一共四条,README 第 76 到 79 行写着,
npm run dev 起开发,npm run build 只出单页应用壳,
npm run build:prerender 出生产包和 131 个静态路由,npm run metrics 重新生成那份数字文件,
我这次实际执行的是起预览那一条,构建那步没重跑,仓库里 dist 已经在了,装依赖那步也早就装完了。

第一条就是把环境对上,版本对不上的话后面从 CDN 拉引擎的行为会有差别。

node -v
npm -v

第二条把已经构建好的站点起在本地,起来以后浏览器打开 4173 端口那个地址,就是那个页面,你带自己的文件进来跟线上是一模一样的操作。

npm run preview

第三条是造一个坏文件,用来复现我下面说的那个吭一声就没了,这条我核过,出来的文件正好 37 B。

printf '%PDF-1.4\nthis is not a real pdf body\n' > broken.pdf

第四条是拿这个坏文件去点拆分,页码范围填 1-3,4-6,点开始拆分,我这边会弹一个浏览器原生的弹窗,第一行是「PDF拆分失败」,
后面跟一句英文,Cannot read properties of undefined (reading ‘Pages’),你点掉它以后页面上就什么都没有了,不落错误条,下载按钮也不出来,还有一条 404 的资源加载,
我另外拿一个一点内容都没有的空文件试过,弹的是「PDF拆分失败」加一句 No PDF header found,报的是没有 PDF 头,不是文件是空的。
这两回我都是重新跑了一遍,把弹窗那行字抄下来才敢写在这儿,第一次我只看了截图,那种原生弹窗截图里拍不到它,
我就以为它一句报错都没给,这一条是我重新跑了一遍,盯住那个弹窗才弄清楚的。

给谁用

要处理合同和扫描件的人,一份合同你只想发其中谈过的那几页出去,重新导出一次整个文件等于把没必要的东西也发出去了,
这一类是你自己会算这个账的人,公司电脑装了管控软件装不了新工具的人,浏览器能打开就能用,装一个软件进去得先报备,
这一类是你连安装包都要等审批的情况,一张图老是发不出去嫌太大的人,手机拍完直接拖进去点一下,回来一个能发出去的文件,不用先把照片传到谁的机器上。

不适合的我也得说清楚,你手上有一批文件要批量转,一天几百个那种,别用这个,浏览器一次真的吃不下这么大的活,我也没打算让它装作能吃下,我这一页一次只放得下一个文件,
批量那件事要么你去我仓库自己下载我这个项目,要么你来找我,我给你批量做

现在还不行

坏文件进去它吭一声就没了,37 B 的假 PDF 和一个一点内容都没有的空文件都一样,点完开始拆分它只弹一个浏览器原生的弹窗,第一行「PDF拆分失败」,后面跟一句英文报错,你点掉它页面上就查无此地了,TM 不落错误条,下载按钮也不出来,真的是挺难看的,这个我还没修,你要是有唯一一个的原件,它报完这一声也就报完了,放进去之前先在自己电脑上把那个 PDF 打开看一眼。

抠图那条我也没跑成,1.9 MB 的图点进去等了半天没结果,所以我没敢把它写进上面那三件事,你手上只有抠图这一个需求的话,现在别在这儿等。

引擎是从公共 CDN 拉的,页面先加载完再断网你还能压图,断着网从地址栏直接打开它就开不出来,
我实测冷启动断网那一次连页面都加载不出来,同一站点的 PDF 转 Word 离线点下去也不出结果,
这两条行为不一样是因为压缩库打在包里,转换引擎要从外面拉,
这个我确实还没解决,眼下最稳的就是拿小样试,别拿唯一的原件试,试坏了真的没人赔你。

试用

东西在这儿,FileCut 图片压缩页,地址:filecut.pages.dev github仓库:Person-HE/filecut: 112 file tools that run entirely in your browser — PDF, Word, Excel, image, video, QR. Zero uploads, zero accounts, zero backend.点开就是这个工具,真的不用注册
传你自己的图试一次就行,
本地要跑就把上面四条命令按顺序执行,第四条那个弹窗你会看见的。
下一个要补的就是错误提示,报一次就蒸发这件事真的是比少一个功能难受。