
做设计这几年我最怕听到的一句话就是“你把这个PDF转成图片发我”。客户不懂什么叫矢量、什么叫页面渲染他只知道自己微信里收到的压缩包打开全是 .pdf手机预览又卡又糊。你手头有PS或者只有一台装好了PS的电脑想批量把PDF变成JPG/PNG其实不用额外找转换器——PS自己就能干而且能干得比绝大多数在线转换网站靠谱。这篇我打算把“用PS批量将PDF转图片”这件事讲透不是简单告诉你点哪个菜单而是从为什么选PS、参数怎么填、脚本怎么写到实际踩过的坑一次性讲清楚。内容分成两部分临时救急的手动方案和适合大批量处理的脚本方案。无论你是刚入门的新手还是天天跟PDF打交道的设计/排版人员都能从里面找到能直接抄走的操作路径。1. 为什么用PS转PDF而不是去找在线转换器1.1 PS打开PDF的逻辑PS本质上不是PDF编辑器它打开PDF时做的是“渲染”而不是“编辑”。PDF里的矢量线条、嵌入图片、字体字形会被PS内部的解析引擎重新计算成一张位图也就是我们最终看到的像素画面。这就解释了两件事。第一PDF页数越多、元素越复杂打开就越慢因为每一页都在重新做栅格化计算第二打开时弹出的那个对话框里分辨率、颜色模式、抗锯齿这些选项不是摆设它们直接决定渲染出来的图片质量。很多人直接拖一个PDF进PS结果图片发虚、边缘有锯齿就是因为没有正确设置这些参数。1.2 几种批量方案的实际对比你可能好奇PS不是有“图像处理器”功能吗它不是能批量处理图片吗为什么还要折腾脚本我实际试下来的结论是图像处理器对PDF的支持非常弱因为它主要面向照片格式、相机原始文件、PSD这些位图文件PDF并不在它的理想处理清单里。你想用图像处理器直接指认一个全是PDF的文件夹它往往无法自动解析出页面。再看其他方案对比会更清楚方案成本批量能力可控性实际体验在线转换网站免费或会员数量常受限分辨率、压缩不可控要上传下载隐私有隐患Adobe Acrobat付费订阅强强专门工具但不少人没有PS手动一页页打开已有PS即免费差强适合临时几张多了会崩溃PS自带“图像处理器”免费一般中对PDF支持差不推荐PS脚本批量处理免费强强本文推荐方案一劳永逸所以我的结论很简单临时转三五张手动打开足够要转几十上百页老老实实写一段脚本让PS自己跑。脚本方案既不用额外装软件又能精确控制分辨率和输出格式最契合标题里“免费、批量”这两个关键词。2. 转之前先定好三个参数后面能少走弯路2.1 分辨率72、150还是300分辨率是PDF转图片最关键的一个参数它决定了图片的尺寸和清晰度。屏幕显示用的图片比如公众号配图、朋友圈长图72dpi就够了需要插到Word或PPT里再排版150dpi比较均衡如果要做印刷、打印或者给客户做样稿300dpi是最低要求。一个简单的换算逻辑最终像素尺寸 物理尺寸英寸× 分辨率。比如A4纸宽度是8.27英寸用300dpi转换得到约2480像素宽如果改成72dpi只有约595像素宽放到电脑全屏看就会模糊。实操中我不建议什么文件都直接上300dpi。我遇到过有人把一本画册PDF全部300dpi转JPG结果文件动辄二三十MB微信根本发不出去。转换前先问自己用途再填分辨率。2.2 颜色模式RGB还是CMYKPDF文件打开时PS会让你选择打开模式常见的是RGB和CMYK。网络传播的图片比如发微信、上传电商平台、做PPT插图用RGB如果图片最终要送印刷厂保留CMYK更稳妥。这里有一个高频坑源PDF本身就是CMYK的印刷稿你用RGB模式打开再导出JPG肉眼看上去会比原稿整体“发灰、发暗”。原因不是PS坏了而是RGB和CMYK的色彩空间不同转换时会出现偏差。反过来也一样一个原本为屏幕设计的PDF强行用CMYK打开再导出颜色也会变脏。所以最稳妥的办法是先确认PDF的用途。不确认的话默认用RGB打开即可如果发现导出的颜色明显不对再换CMYK重开一次对比。2.3 输出格式JPG和PNG怎么选JPG和PNG的取舍本质是“体积与细节”的选择。JPG是有损压缩文件小、兼容性好绝大多数平台都能直接上传适合照片、成品展示图PNG是无损压缩支持透明通道适合带logo、印章、界面截图这些需要保留锐利边缘的图。我的习惯是内容型页面转JPG质量参数选10以上需要透明背景或者画面里有大量小字号文字转PNG宁可文件大一点也不要让文字边缘出现一圈压缩噪点。如果你完全不确定可以先出一页对比一下文件体积再决定批量时要哪个格式。3. 临时救急版手动打开PDF并快速导出3.1 打开PDF时的选项填写如果手里只有一两个PDF每个也就几页手动打开反而是最直接的办法。操作路径是打开PS点击“文件”菜单选择“打开”。在文件选择窗口里找到目标PDF双击。弹出“导入PDF”对话框在这里设置参数。对话框里有几个选项需要留意。“选择页面”可以选择全部页面也可以指定范围比如只转第3到第8页。“缩览图大小”只是预览显示不影响输出质量。右侧的“分辨率”要手动填我见过很多次有人默认用72dpi转出来一放大就糊。还有“模式”下拉框按上一节说的选RGB或CMYK“抗锯齿”建议勾上否则文字和矢量图形的边缘会出现明显的像素锯齿。设置好后点击“确定”PS会按页生成一个多图层文档每一页自动落在独立图层上。3.2 快速导出成JPG或PNG打开完成后可以逐层检查一下有没有明显问题然后导出。新版PS的“文件 导出”菜单里直接有“快速导出为PNG”选项想存JPG就在旁边点“导出为”按钮在导出面板里把格式改成JPG。旧版本没有这两个选项可以用“存储为Web所用格式”替代快捷键是CtrlAltShiftS。需要提醒的是多页PDF被打开后是同一个文档里的多个图层快速导出时默认只会导出可见层所以要么逐个图层操作要么先把不需要的图层隐藏。对于页数很少的PDF手动一个个隐藏导出还好说一旦超过十页这种操作就会让人烦躁。这也是我后面写脚本的直接原因——人肉做重复劳动不如让电脑来。4. 批量核心方案一段脚本解决全部PDF4.1 脚本的运行方式与安装位置PS支持扩展脚本我下面提供的这段脚本基于ExtendScript是PS内置的脚本语言兼容性很好。不需要安装插件不需要额外环境只要把代码保存成一个.jsx文件然后在PS里运行即可。有两种运行方式。第一种是临时的打开PS点击“文件 脚本 浏览”在弹出的文件窗口里选中脚本文件PS就会立即执行。第二种是一劳永逸的把.jsx文件放到PS安装目录下的“Presets/Scripts”文件夹里重启PS后“文件 脚本”菜单底部会出现该脚本的名字点击就能运行不用每次翻文件目录。脚本本身只做一件事遍历你指定文件夹里所有PDF把每一页分别导出为独立的JPG或PNG图片。我还会在代码里加入弹窗让你选择输入文件夹、输出文件夹、分辨率和输出格式这样不同场景下不需要频繁改代码。4.2 完整脚本与参数说明下面是完整代码我加了中文注释方便你按需修改#target photoshop function batchPdfToImage() { // 1. 选择存放PDF的文件夹 var inFolder Folder.selectDialog(请选择包含PDF文件的文件夹); if (!inFolder) return; // 2. 选择图片输出文件夹 var outFolder Folder.selectDialog(请选择输出图片的文件夹); if (!outFolder) return; // 3. 输入分辨率默认300 var resStr prompt(输出分辨率建议72 / 150 / 300, 300); if (!resStr) return; var resolution parseInt(resStr, 10); if (isNaN(resolution) || resolution 10) resolution 150; // 4. 输入输出格式jpg或png var format prompt(输出格式jpg 或 png, jpg); if (!format) return; format format.toLowerCase(); if (format ! jpg format ! png) format jpg; // 5. 搜索文件夹中的所有PDF var pdfFiles inFolder.getFiles(*.pdf); if (pdfFiles.length 0) { alert(该文件夹下没有找到PDF文件。); return; } // 6. 逐个PDF转换 var totalCount 0; for (var i 0; i pdfFiles.length; i) { totalCount convertOnePdf(pdfFiles[i], outFolder, resolution, format); } alert(全部处理完成共处理 pdfFiles.length 个PDF文件输出图片 totalCount 张。); } function convertOnePdf(pdfFile, outFolder, resolution, format) { // 获取PDF页数 var pdfInfo PDFFileInfo.getPDFFileInfo(pdfFile.fsName); var pageCount pdfInfo.numberOfPages; var baseName pdfFile.name.replace(/\.pdf$/i, ); var exported 0; // 逐页打开、导出、关闭 for (var p 1; p pageCount; p) { try { var openOpts new PDFOpenOptions(); openOpts.antiAlias true; openOpts.mode OpenDocumentMode.RGB; openOpts.resolution resolution; openOpts.pdfPages PDFRangeType.SELECTED; openOpts.pRange p.toString(); openOpts.usePageBBox true; var doc app.open(pdfFile, openOpts, DocumentMode.RGB); var outFile new File(outFolder.fsName / baseName _ p . format); if (format jpg) { var jpgOpt new JPEGSaveOptions(); jpgOpt.quality 10; // 质量1-1210以上细节较好 jpgOpt.embedColorProfile true; doc.saveAs(outFile, jpgOpt, true, Extension.LOWERCASE); } else { var pngOpt new PNGSaveOptions(); pngOpt.compression 6; // 压缩级别0-9越大文件越小 doc.saveAs(outFile, pngOpt, true, Extension.LOWERCASE); } doc.close(SaveOptions.DONOTSAVECHANGES); exported; } catch (e) { // 单页失败不中断整个任务继续处理下一页 } } return exported; } batchPdfToImage();代码逻辑并不复杂核心就三步读取PDF页数 → 用PDFOpenOptions逐页打开 → 按指定格式保存。saveAs后面第三个参数true表示“另存为副本”这样不会改动原始PDF也避免PS追问“是否保存对原文件的修改”。想改分辨率改运行弹窗里的数字想默认输出PNG把弹窗默认值改成png即可。如果不想每次弹窗直接把代码里的prompt替换成固定数值也行比如var resolution 300;。4.3 第一次跑脚本前的测试建议脚本虽简单但我不建议一上来就跑几百页的大文件夹。更稳妥的顺序是先建一个测试文件夹里面放一两份PDF每份三五页跑一遍确认输出图片的命名、分辨率、颜色都符合预期再正式处理全部文件。另外要知道脚本是逐页打开PDF再导出的页数多的时候会比较慢比如一本80页的PDF在一般配置的电脑上可能需要几分钟。中途不要手动操作PS不然可能与脚本互相干扰。如果实在等不及可以把脚本里“逐页打开”的逻辑改成“一次打开全部页面再按图层导出”速度会快一些但代码复杂度上升出错也难排查。我平时宁可选稳妥的逐页方案多等一会儿总比半路卡死强。5. 踩坑实录这几个问题我全遇到过5.1 颜色偏暗、发灰怎么办这是最常被问的问题脚本跑完打开JPG一看整体颜色比源PDF暗了一个档次。出现这个现象大多数情况是颜色模式选择问题。PDF原始文件如果是CMYK印刷色你用RGB模式打开PS会做一次色彩转换转换后的RGB数值和屏幕上看到的PDF预览效果往往有差异。解决方法是打开PDF时把OpenDocumentMode.RGB改成OpenDocumentMode.CMYK或者干脆在PDFOpenOptions里不指定mode让PS用PDF内置的色彩配置。这个改动用我上面的脚本只需要改一行然后重新跑一遍对比。如果对比后发现个别文件依然偏色更实际的办法是找源文件的制作方要一份RGB版本PDF别在转换环节死磕色彩管理那样耗时且不一定完美。5.2 脚本报错或没有任何反应脚本运行没反应常见原因有几种。第一代码里PDFFileInfo.getPDFFileInfo(pdfFile.fsName)在少数PS版本上可能不稳定。如果脚本卡在这一步可以把获取页数的逻辑删掉改用PDFRangeType.ALL一次打开所有页面再按图层导出。但要注意这样打开的多图层文档在导出时要做图层遍历复杂度会上升新手不建议自己改。第二杀毒软件或PS的安全策略阻止了脚本执行。可以检查PS的“首选项 脚本”里是否允许脚本访问文件。第三某些PDF本身加了密码或权限限制PS无法解析页数和内容。这种只能先解除密码限制再用脚本处理。5.3 中文路径和文件名的坑路径里有中文或者PDF文件名带特殊字符比如“”“#”“%”脚本偶尔会找不到文件或者输出乱码。我的建议是跑脚本之前先把待处理PDF复制到一个纯英文路径下比如D:\pdf_convert文件名也尽量改成纯数字或拼音。这不是代码缺陷而是不同版本PS对本地语言路径的兼容性不一致。与其折腾环境不如从源头上避开。如果你确实需要保留中文名也可以尝试在脚本里对文件名做encodeURI处理但实际效果因系统而异不是百分百可靠。5.4 是否需要担心字体丢失和排版变化如果你原PDF是纯文本PDF也就是里面有真正的文字而不是图片那么PS打开时会先把这些文字栅格化。栅格化过程中字体渲染依赖系统里是否安装了对应字体。字体缺失时PS会用默认字体替代可能导致文字间距、换行位置和原PDF有细微差别。这类问题在长文档里尤其明显。规避办法有两个一是确保系统里安装了PDF中用到的字体二是在转换前先用PDF阅读器预览一遍确认某些页面有没有明显排版变形。如果只是临时预览用这点变形通常不影响观看但如果是正式交付就要仔细检查了。6. 进阶玩法把转换脚本变成日常工具6.1 固定到菜单一键调用脚本放到Presets/Scripts目录后每次打开PS都能直接在“文件 脚本”菜单底部看到脚本名。后续使用时只需要把PDF统一丢进同一个文件夹运行脚本然后去输出文件夹里收图整个过程一分钟以内。如果你经常处理不同项目还可以把脚本复制几份分别修改默认参数一份默认72dpi输出JPG用于快速预览一份默认300dpi输出PNG用于交付。命名区分清楚比如PDF转JPG_预览版.jsx、PDF转PNG_印刷版.jsx省去每次弹窗填参数的麻烦。6.2 在此基础上做的几个变体脚本的学习价值不只是转PDF其实这段代码的基础框架可以套用到很多场景。比如把第4步的格式判断改成“JPG 导出后自动加白边”就能在处理扫描件时统一版心尺寸把打开PDF的逻辑换成打开PSD在循环里给每个文档加同一组水印文字就能批量给设计稿加版权的把每次只导出单页的逻辑改成把多页拼到同一个新文档里还能实现“把多页PDF转成长图”的效果适合做微信长图或手机阅读的上下滑动页面。我自己最常用的是两个变体一个把画册PDF转成72dpi的JPG长图方便在群里快速沟通排版效果另一个用300dpi转PNG专门给切片后的界面图做透明背景导出。这些需求看起来不同核心其实都是“批量 循环 文档处理”理解了脚本里那几步后续怎么改都顺手。最后再分享一个小技巧脚本跑完别急着关PS先随机抽两三页输出结果放大看一下边缘质量尤其是包含二维码、小字号文字、表格线的页面。PDF转图片这件事参数设对了能省一堆事但最怕的就是肉眼可见的细节翻车多看一眼比自己返工一整天强太多。