利用ImageMagick把PDF转换为图片

参考资料

背景

我最近想从古画里截取一些素材,下载到的资料都是PDF格式的,于是有了把PDF转换图片的需求。

ImageMagick是公认的高效图片转换工具,在Linux上有缺省安装,也有Windows版和Mac版可用。

下载安装

ImageMagick官网地址,建议下载Q16-HDRI的static版本:

ImageMagick实际是调用ghostscript来处理PDF,因此还需要下载安装ghostscript(Linux一般缺省安装):

执行命令

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架构和最佳实践:

缓存参数的配置方式是编辑安装目录下的文件“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分割工具很好使: