Windows批处理脚本:PDF分辨率自动检测逻辑的技术问询
自动检测扫描PDF分辨率的批处理优化方案
我看到你写了一段用findstr检测扫描PDF分辨率的批处理逻辑,用来配合Ghostscript处理文件——这个思路挺实用的,但可能存在一些潜在的问题,我来帮你梳理下并给出优化方案:
你的现有检测逻辑
for /f "delims=" %%a in ('findstr /C:"/Height 1650" %1') do set resdect=150 for /f "delims=" %%a in ('findstr /C:"/Height 3300" %1') do set resdect=300 for /f "delims=" %%a in ('findstr /C:"/Height 6600" %1') do set resdect=600 echo %resdect% DPI detected.
现有逻辑的潜在问题
- 格式依赖强:它完全依赖PDF文件中存在
/Height 1650这类固定格式的字符串,但有些扫描生成的PDF可能会用不同的格式存储尺寸(比如/Height1650、/Height[1650],或者把尺寸放在对象流里),这时候findstr就会匹配失败。 - 多页面冲突:如果PDF里有不同分辨率的页面,最后一个匹配到的高度会覆盖之前的结果,导致检测结果不准确。
- 无匹配时输出异常:如果没有找到任何匹配的高度值,
%resdect%会是空变量,最终会输出DPI detected.,显得不严谨。
优化后的解决方案
我推荐用Ghostscript本身来解析PDF尺寸,这比findstr可靠得多,因为Ghostscript是专业的PDF处理工具,能正确解析各种结构的PDF文件。同时加入默认值和档位修正,提升鲁棒性:
:: 初始化默认分辨率为300DPI(最常见的扫描分辨率) set "resdect=300" :: 用Ghostscript提取PDF第一页的MediaBox高度(A4页面的高度约为11.69英寸) for /f "tokens=2 delims= " %%a in ('gswin64c -dNODISPLAY -q -c "(%1) (r) file runpdfbegin pdfgetpage /MediaBox get 3 get quit"') do set "pageHeight=%%a" :: 根据高度计算并修正到常见分辨率档位 if defined pageHeight ( set /a "resdect=pageHeight/11.69" if %resdect% lss 225 set "resdect=150" if %resdect% geq 225 if %resdect% lss 450 set "resdect=300" if %resdect% geq 450 set "resdect=600" ) else ( :: 当Ghostscript解析失败时,回退到原findstr方案 for /f "delims=" %%a in ('findstr /C:"/Height 1650" %1') do set "resdect=150" for /f "delims=" %%a in ('findstr /C:"/Height 3300" %1') do set "resdect=300" for /f "delims=" %%a in ('findstr /C:"/Height 6600" %1') do set "resdect=600" ) echo %resdect% DPI detected.
优化点说明
- 更可靠的分辨率检测:用Ghostscript读取PDF的
MediaBox(页面实际尺寸),避免了findstr对字符串格式的依赖。 - 默认值兜底:初始化
resdect为300DPI,即使没有任何匹配,也能输出合理的默认值。 - 自适应档位修正:通过计算实际高度对应的分辨率,再映射到150/300/600这些常见档位,适配更多非标准尺寸的扫描件。
- 兼容回退:保留原
findstr逻辑作为备用,在Ghostscript无法解析的极端场景下仍能工作。
内容的提问来源于stack exchange,提问作者MattD
相关产品推荐
相关产品推荐

