You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:35:56