PDF 转图看起来是个简单格式转换,但用户最常问的”1×/2×/3× 选哪个""怎么不糊""字体乱码”,根源都在没区分 PDF 内容是矢量还是扫描——这两类的渲染逻辑完全不同。
矢量 PDF vs 扫描 PDF:根本区别
矢量 PDF(Word / WPS / LaTeX 导出)
内容:文字、矢量图形、矢量图表
存储:数学描述("在坐标 (100, 200) 用思源黑体 14pt 画'你好'")
缩放:无限放大不糊
转图:DPI 越高输出越清晰
文件大:通常很小(几百 KB / 100 页)
扫描 PDF(拍照 / 扫描仪生成)
内容:本质是一张张图片包装在 PDF 里
存储:像素数据(JPEG/JBIG2 编码的位图)
缩放:放大就糊
转图:DPI 高于原扫描 DPI 没用
文件大:单页几百 KB 到几 MB
判断方法:
- PDF 阅读器放大 400% —— 矢量清晰、扫描糊
- 鼠标能选中文字 —— 矢量可以、扫描不行(除非 OCR 过)
- 体积比例 —— 矢量小、扫描大
DPI 倍率的真实含义
工具上的 1× / 2× / 3× 选项:
| 选项 | DPI | 输出 A4 像素 | 用途 |
|---|---|---|---|
| 1× | 72 | 595 × 842 | 屏幕预览 |
| 2× | 144 | 1190 × 1684 | 高清屏(Retina) |
| 3× | 216 | 1785 × 2526 | 网页发布、社交媒体 |
| 4× | 288 | 2380 × 3368 | 接近 300 DPI 印刷 |
| 300 DPI | 300 | 2480 × 3508 | 标准印刷 |
| 600 DPI | 600 | 4960 × 7016 | 高质量印刷 / 归档 |
关键认知:
- 倍率 = 缩放系数,不是”清晰度等级”
- 矢量 PDF:3× 比 1× 真的更清晰(文字边缘更细腻)
- 扫描 PDF:3× 比 1× 只是更大,不更清晰——原扫描 200 DPI,再转成 600 DPI 的图只是把每个像素放大成 9 个相同的像素
判断需要的 DPI:
打印场景:目标尺寸(英寸) × 300 DPI = 需要的像素
例:要打印 6×8 英寸 → 1800 × 2400 像素
屏幕场景:目标显示尺寸(CSS 像素) × 设备像素比
例:要显示 600px 宽 → 600px (普通屏) 或 1800px (3x Retina)
社交媒体:1080-2160 长边像素够用
主流转换工具对比
| 工具 | 平台 | 速度 | 矢量质量 | 扫描质量 | 字体处理 | 备注 |
|---|---|---|---|---|---|---|
| pdftoppm(poppler) | 跨平台 CLI | 中 | 优 | 优 | 系统字体 | 最常用,开源 |
| mutool(MuPDF) | 跨平台 CLI | 快(2-5×) | 优 | 优 | 系统字体 | 性能最好 |
ImageMagick convert | 跨平台 CLI | 慢 | 中(依赖 ghostscript) | 优 | 通过 gs | 灵活但慢 |
| Adobe Acrobat | 桌面付费 | 中 | 优 | 优 | 自带字体库 | 字体替代最准 |
| macOS Preview | Mac 内置 | 慢 | 中 | 中 | 系统字体 | 简单场景够用 |
| PyPDF2 / pdf2image | Python | 中 | 优(依赖 poppler) | 优 | 系统字体 | 脚本场景 |
| pdf.js | 浏览器 JS | 慢 | 中 | 中 | Web 字体 | 隐私好(本地处理) |
命令行示例:
# pdftoppm - 转 PNG 200 DPI
pdftoppm -png -r 200 input.pdf output_prefix
# 输出:output_prefix-1.png, output_prefix-2.png, ...
# pdftoppm - 只转第 5-10 页 + 高质量 JPG
pdftoppm -jpeg -jpegopt quality=90 -r 300 -f 5 -l 10 input.pdf out
# 输出:out-005.jpg ... out-010.jpg
# mutool - 高速渲染
mutool draw -o page-%03d.png -r 200 input.pdf
# ImageMagick - 灵活但慢
convert -density 200 -quality 90 input.pdf output-%03d.jpg
文件命名:避免 page-10 跑到 page-2 前面
字母序排序的陷阱:
未补零:
page-1.png
page-10.png ← 10 跑到 2 前
page-11.png
page-2.png
page-3.png
补零:
page-001.png
page-002.png
page-003.png
...
page-010.png ✓ 顺序正确
page-011.png
位数选择:
- < 100 页 → 3 位(001-099)
- < 1000 页 → 4 位(0001-0999)
- 不确定 → 都用 4 位
工具默认补零行为:
| 工具 | 默认 | 调整方法 |
|---|---|---|
| pdftoppm | 自动补零(按总页数) | 无需设置 |
| mutool | %d 不补零 | 用 %03d 显式补零 |
| ImageMagick | %d 不补零 | 用 %03d |
| Adobe Acrobat | 补零 | ”另存为图像” 时设置 |
字体问题:豆腐块、乱码
症状:转出的图里某些字(特别是中文)显示成 □□□ 或被替换成奇怪字体。
原因:
PDF 创建时
↓
作者用了字体 X
↓
导出 PDF 时
├─ 嵌入字体 X → 任何环境都正确显示
└─ 不嵌入字体 X → 依赖渲染环境有 X
↓
无 X → 替代字体渲染(可能错位 / 缺字)
最常见场景:
- Word 文档用了”宋体”导出 PDF 没嵌入
- 在 Windows 转图正常(系统有宋体)
- 在 Linux 服务器转图变豆腐(无宋体)
- 在 Mac 转图变成”宋体-简”(系统替代品,可能不完全一致)
修复:
| 方案 | 难度 | 效果 |
|---|---|---|
| 创建 PDF 时勾”嵌入字体” | 低 | 根本解决 |
| 转换环境装中文字体 | 中 | Linux: apt install fonts-noto-cjk |
| 用 Adobe Acrobat 转换 | 低 | 自带字体库 |
| 把 PDF 在 Word 重新打开再导出 | 中 | 可能丢格式 |
| 用浏览器打印 PDF 为新 PDF | 低 | 浏览器会嵌入字体 |
预防:交付 PDF 给第三方前用 Acrobat 检查”属性 → 字体”——所有字体都应该标”已嵌入”或”已嵌入子集”。
色彩配置:CMYK / Adobe RGB 转 sRGB
症状:转出图颜色偏淡 / 偏色 / 与原 PDF 不一致。
根因:
- 印刷 PDF 通常 CMYK 色彩空间
- 屏幕显示是 sRGB
- 转换时需要色彩空间映射
对照:
| 源色彩空间 | 转 sRGB 后 | 视觉影响 |
|---|---|---|
| CMYK | 多数色相能保留 | 黑色可能偏灰 |
| Adobe RGB | 鲜艳色被压缩 | 蓝绿色饱和度降低 |
| Display P3 | 鲜艳色被压缩 | 鲜红 / 翠绿明显变淡 |
| sRGB | 一致 | 无影响 |
专业流程:转换工具显式指定 ICC profile,保证色彩管理正确。
家用流程:默认 sRGB 输出即可——日常文档对色彩准确性要求不高。
OCR:从图回到文字
何时需要:
- 扫描件 PDF 想编辑 / 复制文字
- 转图后想索引 / 搜索内容
- 老资料数字化
何时不需要:
- 矢量 PDF 直接
pdftotext file.pdf提取文字——100% 准确,不要先转图再 OCR - 已经能选中文字的 PDF 直接复制
OCR 工具链对比(中英文场景):
| 工具 | 准确率 | 速度 | 成本 | 备注 |
|---|---|---|---|---|
| Tesseract 5 | 中 | 中 | 免费 | 开源,配中英文模型 |
| PaddleOCR | 高(中文) | 中 | 免费 | 百度,中文场景最好的开源 |
| Google Cloud Vision | 高 | 快 | 0.0015/页 | 商业,API 简单 |
| Azure Computer Vision | 高 | 快 | 类似 | 微软 |
| Adobe Acrobat OCR | 高 | 慢 | 付费 | 桌面集成好 |
| ABBYY FineReader | 极高 | 慢 | 付费贵 | 专业归档场景 |
OCR 准确率优化:
- 输入图 DPI 至少 200,推荐 300
- 转灰度 + 二值化(去黄底)
- deskew 矫正倾斜(多数 OCR 工具自带)
- 选对应语言模型(中文必须 chi_sim,不要默认 eng)
- 后处理用拼写检查 / 词典校正常见错字
实战决策树
我有一个 PDF 要转图,怎么办?
├─ 先判断:矢量 还是 扫描?
│ ├─ 鼠标能选文字 → 矢量
│ ├─ 放大 400% 不糊 → 矢量
│ └─ 否则 → 扫描
│
├─ 用途是?
│ ├─ 屏幕预览 → 1× (72 DPI)
│ ├─ 网页发布 → 2× (144 DPI)
│ ├─ 印刷 / 高清打印 → 3× 或 300 DPI
│ └─ 长期归档 → 600 DPI
│
├─ 输出格式?
│ ├─ 文字 / UI / 图表为主 → PNG
│ ├─ 照片 / 扫描件 → JPG (质量 85-90%)
│ └─ 透明背景 / 二次编辑 → PNG
│
├─ 工具选择?
│ ├─ 单次少量 → 在线工具 / Acrobat
│ ├─ 大批量 → mutool / pdftoppm 命令行
│ └─ 嵌入业务流程 → pdf2image (Python) / pdf.js (浏览器)
│
└─ 字体可能有问题?
├─ Acrobat 检查字体嵌入状态
└─ 转换环境装齐字体(Linux 装 fonts-noto-cjk)
常见问题速答
Q:转出来的图带白边 / 多了一圈空白?
A:PDF 页面 = 内容区 + 页边距。如果原 PDF 有大白边(A4 上下空 2cm),转图会保留。需要去白边:用 ImageMagick -trim 或专门的 crop 工具。
Q:能不能只导出 PDF 里的图片,不要文字 / 背景?
A:用 pdfimages -all input.pdf out_prefix 提取所有嵌入的图——这是图片资源,不是渲染图。区别:渲染图 = 看到的样子;提取图 = PDF 内嵌的原始图片资源(不含渲染叠加的文字)。
Q:转图后想再合并回 PDF? A:那是循环操作。如果只是想”修改 PDF 内容”,建议直接在 PDF 里编辑(Adobe Acrobat / Foxit),或转 Word 再编辑——转图再合并会丢失矢量性变成扫描件 PDF。
Q:PDF 加密能转图吗?
A:要密码。先用 PDF 解密工具去除密码(合法使用前提),再转图。pdftoppm 的 -upw / -opw 选项可以传密码。
PDF 转图的核心是先理解你的 PDF 是什么——矢量还是扫描、是否含敏感字体、目标输出尺寸是多少。参数选择都是这些前提的下游。