如何获取PDF文件的DPI?ImageMagick/GhostScript/PHP实现咨询
如何获取PDF文件的DPI值(ImageMagick、GhostScript、PHP方案)
我来帮你搞定获取PDF DPI的问题!你遇到的Imagick返回相同结果的情况其实很常见——因为PDF本质是矢量格式,默认情况下Imagick会用固定的渲染分辨率(通常是72DPI)读取页面,而不是直接提取嵌入图像的真实DPI。下面给你几个可行的方案,覆盖你提到的工具和需求:
一、解决Imagick返回相同分辨率的问题(PHP代码)
如果你的PDF是扫描件(页面由单张图像构成),可以通过获取页面物理尺寸和渲染后的像素数来计算真实DPI,而不是直接用getImageResolution()(它返回的是渲染时的默认分辨率)。
$imagick = new Imagick(); // 关键:先设置足够高的渲染分辨率,避免压缩图像影响计算 $imagick->setResolution(600, 600); // 读取PDF第一页([0]代表第一页,多页可循环修改索引) $imagick->readImage('your.pdf[0]'); // 获取PDF页面的原始尺寸(单位:点,1点=1/72英寸) $pageWidthPoints = $imagick->getImageProperty('pdf:PageMediaWidth'); $pageHeightPoints = $imagick->getImageProperty('pdf:PageMediaHeight'); // 转换为英寸 $pageWidthInches = $pageWidthPoints / 72; $pageHeightInches = $pageHeightPoints / 72; // 获取渲染后的图像像素尺寸 $renderedWidth = $imagick->getImageWidth(); $renderedHeight = $imagick->getImageHeight(); // 计算真实DPI:像素数 ÷ 英寸数 $dpiX = round($renderedWidth / $pageWidthInches); $dpiY = round($renderedHeight / $pageHeightInches); echo "PDF页面真实DPI:{$dpiX}×{$dpiY}";
如果PDF包含多个嵌入图像,你可以遍历页面中的图像资源提取每个图像的DPI:
$imagick = new Imagick(); $imagick->readImage('your.pdf[0]'); $imageIterator = $imagick->getImageIterator(); foreach ($imageIterator as $image) { $resolution = $image->getImageResolution(); echo "嵌入图像DPI:{$resolution['x']}×{$resolution['y']}\n"; }
二、用ImageMagick命令行直接提取DPI
命令行方式比PHP Imagick更直接,能精准提取嵌入图像的真实分辨率:
查看详细分辨率信息
identify -verbose your.pdf | grep -A2 -B2 "Resolution"
这个命令会输出每个嵌入图像的分辨率、尺寸等信息,你能直接看到类似Resolution: 72x72或Resolution: 300x300的结果。
只提取DPI数值
如果只需要纯数值结果,可以用:
identify -verbose your.pdf | grep "Resolution:" | awk '{print $2}'
三、用GhostScript提取DPI
GhostScript可以深入分析PDF的页面和图像属性,适合处理复杂PDF:
获取页面尺寸并计算DPI
# 先获取页面的边界框(单位:点) gs -q -dNOPAUSE -dBATCH -sDEVICE=bbox your.pdf 2>&1 | grep "%%BoundingBox" # 假设输出为 %%BoundingBox: 0 0 612 792,对应8.5×11英寸(612/72=8.5,792/72=11) # 再获取渲染后的像素尺寸,计算DPI:像素数 ÷ 英寸数
直接提取图像分辨率
gs -q -dNOPAUSE -dBATCH -sDEVICE=jpeg -dJPEGQ=100 -sOutputFile=/dev/null your.pdf 2>&1 | grep "Resolution"
四、用pdfimages命令提取DPI(解决你的疑问)
你提到用pdfimages -list your.pdf能得到信息列表,其实输出里的x-ppi和y-ppi字段就是图像的DPI值,用awk就能快速提取:
# 跳过表头,提取所有嵌入图像的DPI pdfimages -list your.pdf | awk 'NR>1 {print "图像DPI:"$7"×"$8}'
这里NR>1是跳过第一行的表头,$7对应x-ppi,$8对应y-ppi。
内容的提问来源于stack exchange,提问作者Swagat Pritam Sahoo
相关产品推荐
相关产品推荐

