PDF 图片提取

把 PDF 里内嵌的图片逐张取出来,按页预览、单张下载或勾选打包,不用先把整页渲染成图片再裁。

文件只在浏览器里读取和解析,不会上传。页数会在提取时读出来,所以这里先只显示文件大小。

选择 PDF 后开始提取图片

无损,保留透明通道,适合截图、图标和带透明的图;体积比原图大。小图过滤只影响下面的预览和打包范围,提取本身已经做完了;零表示不过滤。

改了导出格式要重新点一次「提取图片」才会按新格式生成,体积一栏也会跟着变。

使用说明

提取图片和把页面转成图片是两件不同的事。这一页取出的是 PDF 里作为对象存着的位图,一页里有几张就给几张,尺寸是图片自己的像素尺寸,可能远大于页面显示的那块区域,也可能因为被裁切过而看不出原本的样子。要是页面上的画面是由矢量图形、文字描边、透明度叠加拼出来的,本页一张图都提不到,那种情况要用PDF 转图片把整页渲染成一张图。

技术上这里走的是 pdf.js 的算子通道:先把每一页的内容解析成绘制指令,挑出所有画图片的指令,再把对应的图片对象取出来画到画布上重新编码。之所以要专门处理异步,是因为图片解码是后台线程里的异步活,算子表返回时数据往往还没送过来,直接按名字取会撞上「对象尚未解析完成」的异常。工具优先用带回调的取法,对象已经就绪时会立刻回调,没就绪就等它好,同时给每张图设了超时,避免个别坏对象把整份任务卡死。

去重按「像素尺寸加内容采样」判断:把每张图缩到很小的固定尺寸再抽样做哈希,尺寸相同但内容不同的图不会被误合并,同一张图被多页引用时只导出一份,并在页码里列全出现位置。已知的边界情况是同一张图被旋转九十度或镜像绘制,采样结果不同会被当成两张图,宁可多给一份也不误删。另外,页面上看到的半透明效果来自单独的遮罩对象,本页给出的是不含这层效果的原始像素,视觉上会比 PDF 里看到的更实。

导出的图片经过了重新编码,不是文件里原本那串数据。原图若是 JPEG,解码再编码会损失一点画质,体积也常常变大,想尽量保真就选 PNG;原图带透明通道时选 JPEG 会把透明区域压成黑色,这种图要用 PNG。扫描件每页通常只有一张整页位图,提出来就是一张大图,要文字得靠 OCR,本页不做识别。

提取到图片之后常用的下一步:图片太大要压就用图片压缩,要统一改尺寸用图片改尺寸,要换格式用图片格式转换,要把几十张图并回一份文件用图片转 PDF。想先看看文件里的其它信息,比如作者和生成程序,可以用PDF 元数据修改;要处理表单域用PDF 表单填写。

常见问题

提取出来的图片为什么和 PDF 里看到的画面不一样?

因为工具取出的是文件里存的图片对象本身,不是页面渲染出来的画面。页面上看到的图往往被裁切过、被透明度遮罩处理过、被叠了背景色,甚至同一块区域叠了好几张图拼出来,这些信息都不在图片对象里。所以取出来的可能是更大的完整图,也可能少了页面上的半透明效果,这是正常的。

为什么同一张图只给一份,但它说出现在好几页?

PDF 允许一页内容被多页引用,公司 logo、水印底图、页眉装饰图基本都是这样。工具按像素尺寸加内容采样做去重,同一份图只导出一次,并在页码里列全它出现的位置。去重前的绘制次数也会在统计里给出,两个数字对不上就是复用的部分。

导出的图片比原 PDF 里的还大,正常吗?

正常。文件里那份数据可能是 JPEG,本页要先把它解码成像素再重新编码,JPEG 那种「压过一次」的优势就丢了,重新编码往往会更大。带透明通道的图更明显,因为 PNG 的无损压缩对照片类内容效率不高。想控制体积就选 JPEG 导出,代价是透明区域会被压成黑色。

扫描件提取出来只有一张大图,没有文字的图片吗?

扫描件每一页通常就是一张整页位图,一个字一个字的图片本来就不存在。想从扫描件里拿文字要用 OCR,本站没有做识别,只能先导出图片再交给别的工具处理。反过来,如果 PDF 里的文字是可选中的真文字,那些字形是由字体渲染的,不在本页的提取范围内。

提示跳过了若干蒙版对象,那些是什么?

图像蒙版(image mask)是只有黑白两态的形状遮罩,用法类似刻字模板:内容在别处画,蒙版决定哪些像素露出来。单独把它导出没有阅读意义,所以本页直接跳过并在统计里报数。如果一份文件全是蒙版拼出来的图形,本页可能一张图都提不出来,这种情况更适合用 PDF 转图片把整页渲染出来。

超大尺寸的图导出后为什么变小了?

浏览器的画布有尺寸上限,pdf.js 在把图片交给页面之前会先把超过上限的图按比例缩小,本页拿到的已经是缩小后的像素。常见阈值在几千像素量级,取决于浏览器和内存。需要原始分辨率的话,用命令行工具 pdfimages 更合适,它不经过画布。

加密的 PDF 能提取图片吗?

带打开口令的不行,解析器读不出内容会直接报错,先去口令再来。只带权限口令(能打开但不能复制或打印)的文件通常能提取,因为工具走的是渲染用的解码通道,不受复制限制的约束,但这类限制本身也拦不住截图,所以别把它当成保护手段。

打包下载的 zip 里为什么有重名的图片?

文件名按「第几页-第几张」拼,页码不同就不会重名;同一页里如果有多张尺寸内容都不同的图,序号也不一样。真正会出现重名的是同一张图被拆到不同页时导出,或者你分几次导出后自己合在一起。zip 打包时会自动给重名文件加序号,不会互相覆盖。