Windows下NReco.PdfRenderer.PdfToImageConverter的ScaleTo参数异常
NReco.PdfToImageConverter Windows平台ScaleTo参数输出图像比例异常
问题表现
使用如下代码渲染经缩放处理的PDF转图像结果:
new PdfToImageConverter { ScaleTo = 2200 } .GenerateImage( "sample.pdf", 1, ImageFormat.Png, "sample.pdf.png");
不同运行环境下输出结果存在差异:
- Ubuntu环境:生成图像比例正确,符合预期
- Windows环境:输出为带有大面积白色填充的正方形图像,比例完全错误,异常效果如下:

问题最小复现样例程序:Test.NReco.ScaleTo
对照验证结果:Windows环境下直接使用poppler原生工具pdftoppm.exe执行以下命令时,可正常生成比例正确的缩放图像:
pdftoppm.exe -png -aa yes -aaVector yes -f 1 -l 1 -singlefile -scale-to 2200 sample.pdf sample.pdf
原生命令生成的正确效果如下:
问题根因
该问题是NReco.PdfToImageConverter Windows版本的封装逻辑bug:组件在Windows环境下调用内置poppler库时,没有按预期传入单个-scale-to参数(该参数会自动保持页面原生长宽比,将长边缩放到指定值),而是错误同时传入了-scale-to-x和-scale-to-y两个参数,且两个参数都赋值为ScaleTo设定的2200,最终强制输出2200*2200的正方形画布,超出原页面比例的区域自动填充白色,就出现了截图里的白边问题。Linux环境下组件的参数传递逻辑无该错误,因此输出比例正常。
规避方案
- 方案1:不使用
ScaleTo属性。先读取目标PDF页面的原始宽高,计算将长边缩放到2200像素对应的DPI数值,赋值给组件的Dpi属性完成缩放,即可避开该参数传递bug,输出比例正确的图像。 - 方案2:自行封装原生
pdftoppm.exe调用逻辑。直接拼接验证通过的命令行参数执行,输出结果和Linux环境下的表现完全一致,不会出现白边问题。
内容的提问来源于stack exchange,提问作者Sergey Voronkov
相关产品推荐
相关产品推荐

