参考资料
https://stackoverflow.com/questions/653380/converting-a-pdf-to-png/15484727#15484727
https://stackoverflow.com/questions/6605006/convert-pdf-to-image-with-high-resolution
https://blog.csdn.net/geekcome/article/details/6385074
背景
我最近想从古画里截取一些素材,下载到的资料都是PDF格式的,于是有了把PDF转换图片的需求。
ImageMagick是公认的高效图片转换工具,在Linux上有缺省安装,也有Windows版和Mac版可用。
下载安装
ImageMagick官网地址,建议下载Q16-HDRI的static版本:
ImageMagick实际是调用ghostscript来处理PDF,因此还需要下载安装ghostscript(Linux一般缺省安装):
https://ghostscript.com/download/gsdnld.html
执行命令
ImageMagick安装完毕以后,在命令窗口中执行以下命令,可以把PDF转换为多个图片文件:
magick convert pdf文件名 图片名前缀.图片类型后缀
问题1:转换的图片质量不高
要转换为高质量的图片,需要使用参数,如下示例:
magick convert -quality 100 -density 300 -units PixelsPerInch D:\芥子园画谱\芥子园画谱.pdf D:\芥子园画谱.png
表示不压缩(100%质量)、像素密度300。这样的参数输出的图片质量已经非常高了。
问题2:系统盘空间被耗尽
比如,我的PDF有360页,ImageMagick在Windows上运行时,直接吃掉了C盘剩余的所有39G空间、把系统拖得非常迟钝、然后中断运行、只输出了320个图片文件。
原因是ImageMagick多线程处理、并且把缓存写到硬盘上。以下网页介绍了ImageMagick架构和最佳实践:
http://www.imagemagick.org/script/architecture.php#cache
缓存参数的配置方式是编辑安装目录下的文件“policy.xml”,设置“temporary-path”为一个足够大的硬盘目录,而不是用缺省的系统硬盘的临时目录:
<policymap>
<policy domain="resource" name="temporary-path" value="D:\tmp"/>
<policy domain="resource" name="memory" value="4GiB"/>
<!-- <policy domain="resource" name="map" value="4GiB"/> -->
<!-- <policy domain="resource" name="width" value="10MP"/> -->
<!-- <policy domain="resource" name="height" value="10MP"/> -->
<!-- <policy domain="resource" name="area" value="1GB"/> -->
<!-- <policy domain="resource" name="disk" value="16EB"/> -->
<policy domain="resource" name="file" value="20"/>
<policy domain="resource" name="thread" value="4"/>
<!-- <policy domain="resource" name="throttle" value="0"/> -->
<!-- <policy domain="resource" name="time" value="3600"/> -->
<!-- <policy domain="system" name="precision" value="6"/> -->
<!-- <policy domain="coder" rights="none" pattern="MVG" /> -->
<!-- <policy domain="delegate" rights="none" pattern="HTTPS" /> -->
<!-- <policy domain="path" rights="none" pattern="@*" /> -->
<policy domain="cache" name="shared-secret" value="passphrase" stealth="true"/>
</policymap>
如果没有足够大的硬盘,则可以用工具把PDF文件分割成若干小文件再转换。以下免费开源的PDF分割工具很好使: