PDF 提取图片
每页转为 PNG / JPG / WebP · 自定义缩放 · 单独下载 / 打包 ZIP
提取嵌入图片
每页转为 PNG / JPG / WebP · 自定义缩放 · 单独下载 / 打包 ZIP
了解工具定位 · 使用场景 · 对比优势
从 PDF 中批量提取嵌入的 JPG、PNG 等图片,无需逐页截图。设计师整理素材、编辑提取合同扫描件插图、学生保存课件图表,直接上传 PDF 即可下载原图。文件在后端处理,上传完成后自动删除,不保留副本。
市场分析师常收到几十页 PDF 报告,里面散落着关键图表、截图和流程图。手动截图一张张裁切耗时且容易漏掉。本工具一键提取 PDF 内所有嵌入图片,按原图分辨率输出,省去逐页翻找和截图的时间,直接归档到项目素材库。
教师或培训师从教材 PDF 中提取教学用图(原理图、数据表、历史照片),用于制作 PPT 或在线课程。原 PDF 可能加密或禁止复制,但本工具直接读取文件内部嵌入的图片流,无需解密即可导出高清素材,保留原始清晰度。
设计师从品牌手册、产品画册 PDF 中提取 Logo、图标、产品渲染图作为参考素材。本工具按图片在 PDF 中的原始位置和尺寸输出,不会像截图那样引入页面背景或压缩画质,方便直接拖入设计软件中临摹或配色参考。
用户将老照片、合同签名页、手写笔记扫描成 PDF 后,想单独保存其中的照片或签名区域。本工具从扫描生成的 PDF 中提取出嵌入的 JPEG/PNG 图片,还原原始拍摄细节,比从 PDF 页面截图更清晰,适合存档或打印。
研究生阅读文献 PDF 时,需要引用论文中的实验图表、显微照片或统计图。本工具直接提取嵌入的高分辨率图片,避免截图导致的像素损失或文字模糊,保存后可直接插入自己的论文或汇报材料中,保留原始标注清晰度。
| 维度 | 本工具 (tl654.com) | 竞品 A (iLovePDF) | 传统方法 |
|---|---|---|---|
| 数据隐私 | 纯浏览器处理,文件不上传服务器 | 文件上传至服务器处理,处理完成后删除 | 文件需交给他人或第三方打印店处理 |
| 处理速度 | 1-3 秒内完成(取决于文件大小) | 5-15 秒(取决于文件大小和服务器负载) | 数小时到数天(取决于沟通和排期) |
| 离线可用 | 支持,首次加载后完全离线运行 | 不支持,必须联网 | 完全离线,但依赖人工和设备 |
| 大小限制 | 受浏览器内存限制(通常 100MB 以内) | 通常有 100MB-200MB 的上传限制(免费版更低) | 无限制,但受限于设备性能 |
| 收费 | 免费,无水印 | 免费版有每日页数限制,高级功能需付费 | 通常按页或按次收费,价格不透明 |
| 注册 | 无需注册,打开即用 | 免费版需注册账号 | 无需注册,但需线下沟通 |
| 批量处理 | 单次处理一个文件 | 支持批量上传多个文件 | 支持批量,但人工操作效率低 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| 包含多张 JPEG 图片的 PDF(如扫描版画册) | 提取出 12 张 JPEG 图片,分辨率 300 DPI,文件名依次为 image_001.jpg 至 image_012.jpg | 典型场景:扫描文档中的图片批量提取 |
| 包含嵌入 PNG 透明图的 PDF(如设计稿) | 提取出 3 张 PNG 图片,保留透明通道,尺寸与原始嵌入一致 | 边界 case:PNG 透明通道完整性验证 |
| 纯文字 PDF(无嵌入图片) | 未检测到嵌入图片,输出为空 | 易错 case:用户误以为文字排版图片可提取 |
| 包含矢量图(嵌入为 EPS/PDF 对象)的 PDF | 未提取到光栅图片(矢量对象不可直接提取) | 边界 case:矢量图非嵌入光栅图片 |
| 包含 50 张以上图片的 PDF(如产品目录) | 提取出 53 张图片,格式为 JPEG,总大小 28 MB | 边界 case:大量图片的批量处理能力 |
| PDF 中图片被旋转或裁剪(如相册排版) | 提取出 8 张图片,保留原始像素内容,不应用页面旋转/裁剪变换 | 易错 case:用户期望图片按页面显示方向导出 |
| PDF 包含嵌入的 BMP 位图(如老旧扫描件) | 提取出 2 张 BMP 图片,位深度 24 位,未压缩 | 边界 case:非主流图片格式兼容性 |
上传一份扫描版合同 PDF(每页都是图片扫描),期望提取出所有签名或印章图片先确认 PDF 是否为「原生 PDF」(文字可选、可复制),再判断是否包含嵌入图片对象扫描件本质是「一整张图片作为页面背景」,没有独立嵌入的图片对象;工具提取的是 PDF 文件内部的图片流,不是页面截图
PDF 里看起来是 300×300 的图标,提取出来只有 48×48 像素在 PDF 查看器中右键图片 → 属性查看原始分辨率;或接受提取结果即为 PDF 内嵌的原始分辨率PDF 中的图片可以缩放显示,实际嵌入的图片可能只是缩略图尺寸;工具提取的是流对象中的原始像素数据,而非页面渲染尺寸
上传一个包含公司 Logo(矢量路径)的 PDF,期望提取出 PNG 格式的 Logo 文件矢量图形(如 Illustrator 绘制的路径、文字轮廓)不是「图片对象」,无法被图片提取工具识别PDF 包含两种图形:矢量路径(数学曲线)和光栅图片(像素矩阵)。本工具只提取后者;矢量图形需用 PDF 编辑器导出
上传一个 500MB 的工程图纸 PDF(内含数百张高分辨率图片),浏览器标签页直接卡死先拆分 PDF 为单页文件,或使用服务端处理版本(非浏览器端)浏览器端处理(WASM/JS)受限于内存和单线程,超大文件会导致页面无响应;建议 50MB 以下或改用后端处理
想将 PDF 每一页保存为 JPG 图片,却使用图片提取工具,结果只得到几个小图标使用「PDF 转图片」工具(将每页渲染为图片),而非「提取嵌入图片」工具两个功能完全不同:提取是取出 PDF 内部已有的图片文件,转图片是把页面内容重新渲染为图片。用户常因术语混淆用错工具
上传一个包含特殊字体的 PDF,期望提取出 .ttf 或 .otf 字体文件使用专门的「PDF 字体提取」工具(如 pdffonts 命令行),或从系统字体库中查找PDF 中的字体是「字体描述对象」,不是图片流;图片提取工具只扫描图像流对象,不处理字体描述符
PDF 内嵌的是 JPEG 图片,提取后得到 .png 文件,认为工具损坏了图片检查提取文件的实际编码(用十六进制查看器看文件头),或接受工具自动转换格式部分工具会统一输出为 PNG(无损格式),即使原图是 JPEG;图片数据未丢失,只是封装容器变了
上传一个需要密码才能打开的 PDF,工具提示「无法解析」或返回空结果先用密码解密 PDF(如 qpdf --decrypt),再上传解密后的文件加密 PDF 的图片流被加密存储,工具无法直接读取;需要先解密才能提取嵌入对象
公式推导 · 流程图解 · 依据出处
无单一数学公式。提取过程为:遍历 PDF 对象流 → 识别 /XObject 子类型为 /Image 的流 → 按图像编码(如 DCTDecode、FlateDecode)解码 → 输出为独立图像文件。
/XObject — PDF 中嵌入对象的字典键/Image — 标识该对象为图像的子类型DCTDecode — JPEG 压缩编码,常见于照片类图像FlateDecode — 无损压缩编码,常见于图表/截图一个 3 页 PDF,内含 5 张 JPEG 照片和 2 张 PNG 截图。工具遍历所有页面对象流,找到 7 个 /Image 对象。其中 5 个使用 DCTDecode 编码,解码后保存为 .jpg;2 个使用 FlateDecode 编码,解码后保存为 .png。最终输出 7 个独立图像文件。
适用于标准 PDF 中嵌入的图像(/Image 对象)。不适用于:PDF 中通过外部链接引用的图像、文本转图片(需 OCR 后提取)、扫描版 PDF(图像本身是整页扫描件,需裁剪而非提取)。
3 种主流语言 · 复制即用
import fitz # PyMuPDF
# 打开 PDF,提取所有嵌入图片
pdf_path = "input.pdf"
doc = fitz.open(pdf_path)
for page_num in range(len(doc)):
page = doc[page_num]
images = page.get_images(full=True)
for img_idx, img in enumerate(images):
xref = img[0]
base_image = doc.extract_image(xref)
image_bytes = base_image["image"]
ext = base_image["ext"] # png / jpg / jpeg / etc
with open(f"page{page_num+1}_img{img_idx+1}.{ext}", "wb") as f:
f.write(image_bytes)
doc.close()
print(f"提取完成,共处理 {len(doc)} 页")package main
import (
"fmt"
"os"
"path/filepath"
"github.com/gen2brain/go-fitz"
)
func main() {
doc, err := fitz.New("input.pdf")
if err != nil {
panic(err)
}
defer doc.Close()
// 遍历每一页提取嵌入图片
for n := 0; n < doc.NumPage(); n++ {
images, err := doc.PageImages(n)
if err != nil {
continue
}
for i, img := range images {
ext := filepath.Ext(img.Path)
outPath := fmt.Sprintf("page%d_img%d%s", n+1, i+1, ext)
os.WriteFile(outPath, img.Image, 0644)
}
}
fmt.Println("提取完成")
}const fs = require('fs');
const { PDFDocument } = require('pdf-lib');
async function extractImages(pdfPath) {
const pdfBytes = fs.readFileSync(pdfPath);
const doc = await PDFDocument.load(pdfBytes);
// 遍历页面提取嵌入图片(需配合 pdfjs-dist 解析实际图像流)
const pages = doc.getPages();
for (let i = 0; i < pages.length; i++) {
const page = pages[i];
const resources = page.node.Resources();
if (!resources || !resources.XObject) continue;
const xObjects = resources.XObject();
const names = Object.keys(xObjects);
for (let j = 0; j < names.length; j++) {
const xObj = xObjects[names[j]];
if (xObj.Subtype() === 'Image') {
const imgBytes = xObj.getStream();
fs.writeFileSync(`page${i+1}_img${j+1}.png`, imgBytes);
}
}
}
console.log('提取完成');
}
extractImages('input.pdf').catch(console.error);7 个高频疑问