领导甩来百页PDF,让每页截成图塞PPT?还搁那一页页点截图?快拉倒吧!咱敲代码的手,可不是当人肉截图机的!今天直接甩个 Python 脚本,拖个文件/文件夹,几秒钟全给你转成图,JPG/PNG随便挑,清晰度自己调,全程本地跑不泄密,以后这破活再也别想耗我一分钟!回复 Py脚本 获取完整可跑代码
产品手册.pdf (188页)产品手册/├── 第1页.jpg├── 第2页.jpg├── 第3页.jpg└── ... 一直到188页import osimport sysfrom pdf2image import convert_from_path# 直接拖PDF文件/文件夹过来,不用手输路径,省得打错path = input('把PDF文件/文件夹拖进来:').strip().strip('"')# 路径不对直接歇菜,不跟你瞎耗if not os.path.exists(path):print('❌ 路径都找不到,搁这逗我呢?') input('按回车滚蛋...') sys.exit()# 自动识别单个PDF/文件夹里的PDF,全给你扒拉出来pdf_files = []if os.path.isfile(path) and path.lower().endswith('.pdf'): pdf_files = [path] base_dir = os.path.dirname(path)elif os.path.isdir(path):# 只挑PDF文件,其他杂七杂八的一概不理 pdf_files = [os.path.join(path, f) for f in os.listdir(path) if f.lower().endswith('.pdf')] base_dir = pathelse:print('❌ 只认PDF文件/装PDF的文件夹,别瞎拖!') input('按回车滚蛋...') sys.exit()# 没找着PDF直接撂挑子,白忙活谁干if not pdf_files:print('❌ 文件夹里连根PDF毛都没有,玩个锤子?') input('按回车滚蛋...') sys.exit()print(f'找着 {len(pdf_files)} 个PDF,开干!')# 选图片格式,按需来,别纠结print('\n图片格式选一个:')print('1. JPG(体积小,日常插PPT、发消息够用)')print('2. PNG(无损高清,就是文件稍大,打印用合适)')fmt_choice = input('默认选1,直接回车就行:').strip() or '1'img_format = 'jpg'if fmt_choice == '1'else'png'# 调清晰度,DPI越大越清,文件也越大,别瞎拉满dpi = input('输入DPI(默认200,打印选300+):').strip()dpi = int(dpi) if dpi else 200# 替换成你自己的poppler路径(国内下载解压后的bin目录)POPPLER_PATH = r'C:\poppler\Library\bin'# 挨个处理PDF,一个都不落for pdf_idx, pdf_path in enumerate(pdf_files, 1):# 取PDF名字,建个同名文件夹存图片,省得乱 pdf_name = os.path.splitext(os.path.basename(pdf_path))[0] out_dir = os.path.join(base_dir, pdf_name) os.makedirs(out_dir, exist_ok=True)print(f'正在干:{os.path.basename(pdf_path)} ({pdf_idx}/{len(pdf_files)})') try:# 核心操作:把PDF转成图片列表,指定poppler路径避免报错 images = convert_from_path(pdf_path, dpi=dpi, poppler_path=POPPLER_PATH) total = len(images)# 逐页保存,标清页码,一眼能瞅见for i, img in enumerate(images, 1): img_path = os.path.join(out_dir, f'第{i}页.{img_format}')# 修复JPG格式报错:PIL保存JPG需用JPEG标识 save_format = 'JPEG'if img_format == 'jpg'else img_format.upper() img.save(img_path, save_format)# 同一行刷新进度,不刷屏,看着清爽print(f' ✓ 第{i}页搞定', end='\r')# 换行会清掉上一行的进度,单独打完成提示print(f' ✓ 完事!共{total}页,全存这了:{out_dir}') except Exception as e:# 哪步出问题直接说,不藏着掖着print(f' ✗ 这玩意栽了,原因:{e}')# 全部干完,直接给结果,不磨叽print(f'\n✅ 所有活全搞定!图片全在各自PDF的同名文件夹里,直接拿去用!')input('按回车收工...')咱不是要背代码,关键处得知道咋回事,改起来才不慌:
1. 核心依赖行:from pdf2image import convert_from_path
这行是灵魂!本质是调用poppler工具,把PDF拆成图片,不用管底层咋跑,咱只管拿来用,少了这行啥都白搭。
2. 自动识别PDF行:pdf_files = [os.path.join(path, f) for f in os.listdir(path) if f.lower().endswith('.pdf')]
遍历文件夹里所有文件,只挑后缀是.pdf的,不管大写小写,其他杂文件一概过滤,省得手动挑。
3. 自动建文件夹行:os.makedirs(out_dir, exist_ok=True)
按PDF文件名字建文件夹,exist_ok=True意思是文件夹已经存在也不报错,不用你手动点“新建文件夹”,避免重复操作。
4. 核心转换行:images = convert_from_path(pdf_path, dpi=dpi)
把PDF转成图片列表,dpi是清晰度参数,传多少就按多少清晰度转,这行决定图片清楚不清楚。
5. 逐页保存行:img.save(img_path, img_format.upper())
把每一页图片存到指定路径,upper()是把jpg/png转成JPG/PNG,适配图片保存的格式,少了这步可能存不了。
6. 进度刷新行:print(f' ✓ 第{i}页搞定', end='\r')
end='\r'让打印内容在同一行刷新,不会满屏都是 “第1页搞定”“第2页搞定”,看着清爽,查进度一眼就见。
这脚本就靠俩东西,少一个都跑不起来,一分钟搞定:
打开命令行(CMD),直接敲:
pip install pdf2imagebin文件夹加到系统环境变量 PATH,不会加就搜「Windows 添加环境变量」,跟着点就行;brew install poppler(先装 Homebrew);sudo apt-get install poppler-utils。嫌配环境变量麻烦?直接写死poppler路径:
- images = convert_from_path(pdf_path, dpi=dpi, poppler_path=r'C:\你自己的路径\poppler\bin')都是我踩过的坑,可直接绕开,省得瞎折腾:
images = convert_from_path(pdf_path, dpi=dpi, fmt='jpg', output_folder=out_dir)直接存文件不占内存,多大 PDF 都扛得住;
改两行代码,适配更多需求:
images = convert_from_path(pdf_path, dpi=dpi, first_page=5, last_page=20),只转5-20页,省时间;找个10页左右的小PDF,复制(下载)脚本跑一遍,保证一次成。卡poppler安装就搜“系统版本+poppler安装”,新手都能搞定,代码跑一遍比看十遍都管用!
评论区吼一声,咱下期直接盘:
convert_from_path转换PDF、os.makedirs自动建文件夹、逐页保存+进度刷新这几步,理解了就能灵活改;回复“Py脚本”直接拿完整代码,双击即可跑,别再瞎写磨洋工!