PDF2Photo:不上传文件的 PDF 转高清 PNG / JPG 工具

客户要 JPG,我又希望日常转换尽量保留清晰度,于是做了一个简单的工具:PDF2Photo · PDF 转图片。打开网页、选一个 PDF、选择精度,转换后下载单张图片或 ZIP。不要求注册,也不把文件上传到我的服务器。

它现在托管在 Cloudflare Workers Static Assets 上,转换工作在访问者自己的浏览器里完成。不是把 PDF 交给云端后台处理,也不再依赖 CCS 或其他 VPS 保存文档。

现在可以做什么

  • 默认 PNG:保存渲染后的像素,不再做有损图像压缩。
  • 可切换 JPG:适合客户或其他软件要求 JPEG 的场景,提供 100%、95%、90% 质量参数。
  • 300、600、900 DPI:按使用场景选择渲染精度。
  • 选择页码:全部转换,或输入 1-3, 5 这样的范围。
  • 逐页预览与下载:查看每页的像素尺寸和文件大小,也可以一键打包 ZIP。
  • 中英文界面:默认中文,右下角卡牌可切换语言与主题。

自动主题按北京时间工作:06:00 至 18:00 为白天,其余时间为夜间;也可以手动选择,切换时有翻牌动画。对于需要打开密码的 PDF,页面提供输入已知密码的入口,而不是破解密码。

“PNG 无损”不等于“PDF 完整可逆”

这里必须说清楚:PNG 无损的是已经渲染出来的像素。PDF 里的矢量文字、路径和页面内容,需要先按照选定的精度变成像素图片。这个过程就是光栅化,并不能从图片还原原来的可编辑文字、链接或矢量结构。

因此,网站不会再把生成的 PNG 进行有损压缩或二次缩小,但不能承诺图片保留 PDF 的全部信息。原 PDF 仍应该留着。选择较低 DPI,放大图片时依然可能看到像素;提高 DPI 也不能凭空补回原扫描图片中不存在的细节。

JPG 即使选择 100% 也不是无损格式。这里的 100% 是传给浏览器 JPEG 编码器的最高质量参数,不是“逐像素还原”的保证。需要保留渲染像素时选 PNG,需要格式兼容时选 JPG。

技术方案:PDF.js → Canvas → 图片 → ZIP

前端用 Vite 构建,PDF 解析与页面渲染使用 Mozilla PDF.js,ZIP 打包使用 JSZip。文件通过浏览器 File API 读成二进制数据,然后交给 PDF.js;页面渲染到白底 Canvas,最后导出为 PNG 或 JPEG。

浏览器读取 PDF
    ↓
PDF.js 解析页面,按 DPI / 72 设置渲染比例
    ↓
Canvas 像素画布 → PNG / JPG
    ↓
单页下载,或 JSZip 在浏览器内打包

这是典型的浏览器端处理链路。PDF.js 官方示例说明了页面 viewport 与 Canvas 渲染方式。字体 CMap、标准字体和 WASM 资源也随网站一起部署,减少对其他资源域名的依赖。

当前 ZIP 采用 STORE 模式,只打包已经生成的图片字节,不重新编码图片。网站没有文件上传接口、账号系统或文档数据库。语言与主题偏好放在浏览器本地;Cloudflare 负责提供静态资源,正常网站访问记录不等于它收到了 PDF 正文。

这里的 DPI 是渲染精度,交付时应核对图片的实际像素尺寸,不要只看文件头里的物理打印分辨率标签。浏览器编码器写入的分辨率元数据未必与所选渲染 DPI 相同。

为什么高精度会慢,手机应该怎么选

转换速度主要由访问设备的 CPU、内存、浏览器和页面复杂程度决定,不是我的服务器有 10G 带宽就能让本地渲染无限加速。Cloudflare 加快的是网站程序和字体资源的加载;文档解析、图片编码和 ZIP 打包依然在本机完成。

同一页面从 300 提高到 600 DPI,像素数量约变成 4 倍;900 DPI 约是 300 DPI 的 9 倍。多页文档还需要保留输出图片,ZIP 打包也会增加内存占用。

所以我建议先用默认 300 DPI,确实需要细节再升到 600 或 900。手机处理长文档时先只转几页。程序逐页渲染并释放 Canvas,但对特别大的页面仍设有尺寸保护:遇到超限会提示降低 DPI,不悄悄缩小图片后继续冒充高精度输出。

这次重新验证的结果

本次使用 Mozilla 公开的单页 Hello World 示例 PDF,而不是个人文档,完成了线上复核:

  • 默认 300 DPI PNG 转换成功,下载文件为 834 × 834 像素。
  • 切换 600 DPI、100% 质量的 JPG 转换成功,下载文件为 1667 × 1667 像素。
  • ZIP 可正常打开,包内 PNG 和单页下载 PNG 的字节完全一致。
  • 中英文切换、白天/夜间主题切换正常;页码范围的 3 项单元测试通过。

这些结果证明了本次测试链路,不代表所有特殊字体、损坏文件或超大 PDF 都能处理。遇到问题应保留原文件,尝试减少页数、降低精度或换一个较新的浏览器。

这个项目的目标很简单:把一个常用的小需求做成不用注册、文件不出本机、随手打开就能用的工具。入口:pdf2photo.bismih520.com。

上一篇
下一篇