PDF 转图片怎么保证清晰:DPI 选择、命令行批量与常见坑

一、结论先给

PDF 转图片的清晰度,只由一件事决定:DPI(每英寸像素数)。

72  DPI  → 屏幕看,图小,够用(微信/网页)
150 DPI  → 常规文档、PPT 插图,清晰度与体积的平衡点
300 DPI  → 打印、OCR 识别、合同存档
600 DPI  → 印刷级,体积爆炸,除非印厂要求否则别用

A4(210×297mm)在不同 DPI 下的实际输出:

DPI 像素尺寸 单页 PNG(估算) 单页 JPG q90(估算) 适用场景
72 595 × 842 150-400 KB 60-120 KB 网页预览、微信发图
150 1240 × 1754 600 KB-1.5 MB 200-500 KB PPT 插图、常规存档
300 2480 × 3508 2-5 MB 700 KB-1.5 MB 打印、OCR、合同
600 4960 × 7016 8-20 MB 3-6 MB 印刷

体积是估算值,纯文字页远小于此,扫描图片页会明显大于此。

三条路线的选择:

路线 工具 适合谁 清晰度上限
浏览器本地 PDF 转图片 不想装软件、文件敏感 由你选的 DPI 决定
命令行 pdftoppm / magick 批量、自动化、服务器 同上,最快
提取原图 pdfimages 扫描版 PDF 最高(不重采样,原样导出)

最关键的一句话:如果 PDF 本身就是扫描件(每页是一张图),用 pdfimages 把嵌入的原图抽出来,才是无损的;用 pdftoppm 渲染等于对图再采样一次,必然掉质量。

二、先判断:你的 PDF 是"文字版"还是"扫描版"

这决定了后面所有操作,30 秒就能判断:

# 列出 PDF 里嵌的所有图片(扫描件每页至少一张大图)
pdfimages -list input.pdf

输出解读:

page   num  type   width height color comp bpc  enc interp  object ID
   1     0 image    2480  3508  rgb     3   8  jpeg   no        12  0
  • 出现接近页面尺寸的大图(2000px 以上)→ 扫描版,走提取路线
  • 只有小 logo、无大图 → 文字版,走渲染路线
  • 什么都没有 → 纯矢量文字,只能渲染

另一个快速判断:用阅读器打开,能选中文字就是文字版,选不中就是扫描版。

三、路线 A:命令行渲染(文字版 PDF)

3.1 pdftoppm(推荐,poppler-utils)

pdftoppm 是这类任务里最稳的一个:快、参数直观、不引入 Ghostscript 的复杂依赖。

# 装(Debian/Ubuntu)
sudo apt install poppler-utils
# macOS
brew install poppler
# RHEL/CentOS
sudo yum install poppler-utils

常用参数:

# 全部页转 PNG,300 DPI,输出 out-1.png out-2.png ...
pdftoppm -r 300 -png input.pdf out

# 转 JPG(体积小很多,注意不透明)
pdftoppm -r 300 -jpeg input.pdf out

# 只转第 3 到 5 页
pdftoppm -r 300 -png -f 3 -l 5 input.pdf out

# 只转第 1 页(做封面用)
pdftoppm -r 150 -png -f 1 -l 1 input.pdf cover

# 文件名补零,避免 1、10、2 的排序混乱
pdftoppm -r 300 -png input.pdf page      # 输出 page-01.png ...(自动补零)

# 去白边(转完四周多余留白)
pdftoppm -r 300 -png -cropbox input.pdf out

# 遇到加密 PDF
pdftoppm -r 300 -png -upw "打开密码" input.pdf out
pdftoppm -r 300 -png -opw "权限密码" input.pdf out

几个实用细节:

  • 输出文件名的数字位数会自动对齐(10 页以上补零),不用担心排序。
  • -jpeg 默认质量 75,加 -jpegopt quality=90 可提质量。
  • 想控制输出尺寸反过来算 DPI:DPI = 目标宽度 ÷ 页面宽度(英寸)。A4 宽 8.27 英寸,想要 1240px 宽就用 150 DPI。

3.2 ImageMagick(需要精细控制时)

# 单页/多页,-density 必须在输入文件之前(顺序错了就是 72 DPI 再放大,糊)
magick -density 300 input.pdf -quality 90 out.png      # v7
convert -density 300 input.pdf -quality 90 out.png     # v6

# 只处理第一页
magick -density 300 input.pdf[0] -quality 90 page1.jpg

# 批量压缩转出的图
magick -density 300 input.pdf -resize 1240x1754 -quality 85 out.jpg

⚠️ ImageMagick 最常见的坑:-density 放在文件名后面等于没生效。另外 v6 的 convert 默认走 Ghostscript 委托,服务器没装 gs 会报 FailedToExecuteCommand。用 pdftoppm 更省事。

3.3 批量脚本(几十个 PDF)

#!/usr/bin/env bash
# 把当前目录下所有 PDF 按 300 DPI 转 PNG,每个 PDF 一个子目录
set -euo pipefail
DPI=${1:-300}
for f in *.pdf; do
  out="img/${f%.pdf}"
  mkdir -p "$out"
  pdftoppm -r "$DPI" -png "$f" "$out/page"
  echo "done: $f -> $out ($(ls "$out" | wc -l) 页)"
done

跑之前先估一下磁盘:pdfinfo input.pdf | grep Pages 拿到页数,按前面表格估算单页体积,用 磁盘容量计算 换算一下,别把服务器根分区写满——这是批量转图最常见的事故。

四、路线 B:提取原图(扫描版 PDF)

4.1 pdfimages:无损抽图

# 抽出所有嵌入图片(保持原始编码)
pdfimages -png input.pdf out      # 强制转 PNG
pdfimages -j   input.pdf out      # JPEG 编码的图保持 jpg
pdfimages -tiff input.pdf out     # 保持 TIFF

不加参数时 pdfimages 会按原编码导出(jpg 还是 jpg,CCITT 压缩的还是 tiff),这是最无损的做法:

pdfimages input.pdf out
ls -la out-*.jpg out-*.pbm 2>/dev/null

注意编码陷阱:扫描件常用 CCITT G4(黑白传真压缩)或 JPX(JPEG2000)。这两种 pdfimages 导出后格式很怪(.pbm/.jp2),需要再转一次:

# CCITT G4 导出的黑白图转 PNG
magick out-000.pbm out-000.png

# 批量
for f in out-*.pbm; do magick "$f" "${f%.pbm}.png"; done

4.2 为什么提取比渲染好

pdftoppm 渲染 pdfimages 提取
扫描件质量 重采样,可能掉细节 原始像素,无损
体积 可能比原图更大 与原图一致
速度 慢(要完整渲染) 快(直接拷贝数据流)
旋转/裁剪框 会应用 不应用(可能方向不对)

所以:扫描件先试提取,方向不对再用 pdftoppm 渲染。

五、六个高频坑与解法

5.1 透明背景变黑

PDF 里有透明区域,转 JPG 时没有 alpha 通道,透明变黑。

# 方案 1:转 PNG(保留透明)
pdftoppm -r 300 -png input.pdf out

# 方案 2:转 JPG 时铺白底
magick -density 300 input.pdf -background white -alpha remove -quality 90 out.jpg

5.2 文字变乱码/空白(字体没嵌入)

PDF 引用了系统里没有的字体,渲染器找不到就用默认字体替代或直接留白。

# 看 PDF 用了哪些字体、有没有嵌入
pdffonts input.pdf

输出里 emb 列是 no 的就是没嵌入。解法:

# 装常见字体包
sudo apt install fonts-wqy-zenhei fonts-wqy-microhei fonts-arphic-uming

# 刷新字体缓存
fc-cache -fv

# 看系统有没有对应字体
fc-list | grep -i "simsun\|wqy"

5.3 加密 PDF 转不了

Syntax Error: Incorrect password

先解密(只对你有权处理的文档):

qpdf --decrypt --password='打开密码' input.pdf decrypted.pdf

5.4 CMYK 印刷稿颜色发闷

印刷用 PDF 是 CMYK 色彩空间,转 RGB 屏幕图会偏暗、饱和度低。

# 转的时候指定色彩空间
magick -density 300 -colorspace sRGB input.pdf out.png

5.5 转出来的图方向是躺着的

PDF 的 /Rotate 属性有些工具不认。

# pdftoppm 会自动处理;ImageMagick 需要手动转
magick out.png -rotate 90 out-fixed.png

5.6 页数多、跑一半卡死

PDF 太大(几百 MB 扫描件)时,一次性渲染容易 OOM。分页处理:

total=$(pdfinfo input.pdf | awk '/^Pages/{print $2}')
for ((i=1; i<=total; i+=20)); do
  end=$((i+19))
  pdftoppm -r 300 -png -f "$i" -l "$end" input.pdf "part-$i"
done

六、场景速查:我到底该用多少 DPI

场景 DPI 格式 说明
微信/QQ 发图 96-150 JPG 超过 150 会被微信二次压缩,白给
网页/博客插图 96-150 JPG/WebP 配合 图片压缩 再瘦一次
PPT 插图 150-200 PNG 投影仪放大看,150 是底线
打印(黑白文档) 300 PNG 300 是打印行业的默认门槛
打印(照片/画册) 300-600 PNG/TIFF 600 只在印厂明确要求时用
OCR 识别输入 300-400 PNG 低于 300 识别率明显下降
合同/票据存档 200-300 JPG 要长期存,兼顾体积
AI 识图输入 150-200 PNG 超过 200 多数模型会自动降采样

七、不想装软件怎么办

命令行是最快的,但不是每个人都要为了转个 PDF 去装 poppler。浏览器里也能做,而且文件不出本机——对合同、身份证、病历这类敏感文件反而更合适。

👉 PDF 转图片工具:选 DPI、选格式,浏览器本地渲染,不上传服务器。转完要发微信可以再用 图片格式转换 转一次 WebP,体积能再降一半。

八、几条纪律

  1. 扫描件先 pdfimages -list,有大图就走提取,别上来就渲染。
  2. DPI 按用途选,不要无脑 300——300 DPI 的 A4 单页 PNG 动辄 3 MB,微信一发就糊,纯属浪费。
  3. ImageMagick 的 -density 必须在输入文件名之前。
  4. 批量前先算磁盘:页数 × 单页体积,留 30% 余量。
  5. 透明需求用 PNG,转成 JPG 就丢了 alpha 通道,不可逆。
  6. 字体乱码先 pdffonts 确认是不是没嵌入,别急着换工具。
  7. 加密文件先解密,且只处理你自己有权处理的文档。

九、延伸阅读

👉 相关在线工具:PDF 转图片 · 图片格式转换 · 图片压缩 · 磁盘容量计算,免登录、浏览器内处理。

还有 65 个免费在线工具

纯前端实现,不用注册,数据不上传服务器。

浏览全部工具