
BentoPDF 团队发布开源 PDF 压缩引擎 Hyper Compress
来源标题:Show HN: Hyper Compress: The Best Open Source PDF Compression Engine
BentoPDF 团队推出开源 PDF 压缩引擎 Hyper Compress,承诺压缩后文件绝不增大,若无法节省空间则原样返回原文件。该引擎提供无损模式,可在不重新编码图片的情况下压缩,并保留可搜索文本与文档结构。它同时提供 CLI、Node SDK、C 库、自托管服务和浏览器端 WebAssembly 版本。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
最好的开源 PDF 压缩引擎。
Hyper Compress 是一个高保真、保留内容的 PDF 压缩引擎,旨在让 PDF 变小,同时不会对文档做出不必要的改动。
Hyper Compress 由 BentoPDF 团队构建。同一引擎提供 CLI、Node SDK、C 库、自托管服务,以及完全在浏览器中运行的 WebAssembly 构建。
可在 hyper.bentopdf.com 试用。完整文档位于 hyper.bentopdf.com/docs。
PDF 压缩存在三大问题:压缩后文件反而变大、为了减小体积而牺牲文档内容,以及生成损坏且不符合规范的 PDF。
Hyper Compress 正是围绕解决这三个问题而构建的。
单调压缩。Hyper 绝不会返回更大的文件。如果压缩不能节省空间,则原样返回原始 PDF。
保留内容的压缩。Hyper 包含真正的无损模式,压缩时不重新编码图像、不损失质量。如需更激进的压缩,它会保留可搜索文本和文档结构,仅做出所选压缩级别所要求的改动,同时生成符合规范的 PDF。
为可靠性而构建。Hyper 会验证其输出,并校验可能影响视觉保真度的转换。当某项改动无法忠实还原页面时,该改动会被回滚。在整个基准测试中,Hyper 的损坏率为 0.39%,是所有被测引擎中最低的。
一个引擎,处处可用。同一压缩引擎驱动 CLI、Node SDK、C API、自托管服务和 WebAssembly 构建。
Hyper Compress 使用来自四个公开语料库的 2,104 份真实世界 PDF,对 Ghostscript、MuPDF 和 qpdf 进行了基准测试,总计 27,352 次引擎运行。
视觉保真度使用 Poppler 测量,特意选择它作为独立渲染器,而非被测引擎共用的渲染器。
完整方法论、逐文件结果和完整文档列表见 comparison.md。
在中位最差页面 SSIM 下的中位体积缩减:
语料库选择在任何文件获取之前,使用固定种子预先注册。每份文档的 SHA-256 哈希和来源 URL 均已记录,因此基准测试可以独立复现。
你也可以针对自己的文档运行测试框架:
每个 release 都附带有适用于 macOS、Linux 和 Windows 的预构建二进制文件。
下载适用于你平台的归档文件,用 SHA256SUMS 校验,并解压到 cli/prebuilt/。
docker run -d -p 8080:8080 ghcr.io/alam00000/bentopdf-hyper-compress:latest
如需自行构建引擎,请参阅 BUILDING.md。
CLI hyper input.pdf # 写出 input-compressed.pdf hyper input.pdf output.pdf # medium 预设(默认) hyper input.pdf output.pdf --preset high # 最小输出 hyper scan.pdf out.pdf --target-size 2MB # 指定目标大小 hyper locked.pdf out.pdf --password hunter2 # 加密输入 hyper in.pdf out.pdf --set grayscale=true # 覆盖某个选项 hyper --help # 所有标志,附示例
--target-size 会搜索能装入目标大小的最高图像质量,必要时会降至质量 5 和 36 dpi。如果目标可达,你将得到能装入目标大小的最佳观感文件;如果不可达,你将得到引擎能生成的最小文件,并附带一条警告说明该文件有多小。
import { compress } from 'hyper-compress'; const r = await compress({ sourcePath: 'input.pdf', savePath: 'output.pdf', preset: 'medium', }); console.log(r.originalSize, '->', r.compressedSize);
结果包含原始大小和压缩后大小、文档是否已签名、其声明的 PDF/A 级别,以及是否达到请求的目标大小。
decrypt_failed、engine_error、timeout、cancelled。
解析在带超时的 worker 子进程中运行。如果恶意或畸形输入导致 worker 失败,它会与你的主进程隔离。
Docker 镜像包含位于 http://localhost:8080 的 Web 界面和一个 HTTP API。
你的文件在你自己的服务器上处理。
curl -o out.pdf --data-binary @in.pdf
'http://localhost:8080/api/compress?preset=high'
完整 API、配置选项和部署说明见 SELF-HOSTING.md。
web/ 目录包含完整的浏览器构建。
引擎被编译为 WebAssembly 并在浏览器本地运行。文件不会被上传,该构建默认完全离线(air gapped)。
同一 WebAssembly 构建以 hyper-compress-wasm 的名称发布在 npm 上,是一个基于缓冲区的 SDK,适用于原生包未覆盖的平台:
import { compress } from 'hyper-compress-wasm'; const result = await compress(pdfBytes, { preset: 'medium' });
node wasm/verify.mjs some.pdf
这会验证 WebAssembly 输出与原生构建逐字节一致。
共享库仅导出这些符号,且 ABI 仅在主版本内做增量扩展。
预设 图像质量 最大 DPI 适用场景 low 80 200 存档副本和最小可见变化 medium 50 150 默认;适合分享和电子邮件 high 20 72 最小输出和屏幕阅读 lossless 不适用 无 不重新编码图像;像素级一致
这些预设背后的每个选项也都可以单独使用。
你可以创建自定义配置,使用图像质量和分辨率、灰度转换、颜色缩减、字体子集化和去嵌入、元数据和注释剥离、PDF 2.0 Brotli 流,以及针对纯图像文档的页面栅格化。
取决于文档和所选选项,引擎可以:
引擎会综合应用上述多种技术,以实现尽可能最佳的压缩。
npm ci make check
原生引擎基于固定版本的 PDFium 检出构建。初始引导需要数 GB 空间。
完整说明、补丁清单和平台特定注意事项见 BUILDING.md。
make check # 类型检查、lint、单元和集成测试 make regress # 回归失败集,所有预设 make bench CORPUS=path/to/dir # 来自 comparison.md 的基准测试框架 make fuzz # libFuzzer 测试框架
make regress 是 bug 修复的关卡。
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。