Imagemagick并行转换

时间:2015-06-28 22:03:54

标签: imagemagick imagemagick-convert

我想将pdf的每个页面的屏幕截图转换为jpg。为此,我在命令行中使用ImageMagick的{​​{1}}命令。

我必须达到以下目的 -

  1. 获取pdf文件每个页面的屏幕截图。
  2. 将屏幕截图调整为3种不同的尺寸(小型,中级和预览)。
  3. 将不同尺寸存储在不同的文件夹中(小型,中级和预览)。
  4. 我正在使用以下命令,但是,它很慢。如何改善执行时间或平行执行命令。

    convert

    拆分命令以提高可读性

    convert -density 400 -quality 100 /input/test.pdf -resize 170x117> -scene 1 /small/test_%d_small.jpg & convert -density 400 -quality 100 /input/test.pdf -resize 230x160> -scene 1 /med/test_%d_med.jpg & convert -density 400 -quality 100 /input/test.pdf -resize 1310x650> -scene 1 /preview/test_%d_preview.jpg
    

1 个答案:

答案 0 :(得分:3)

更新了答案

我看到你有很长的多页文档,虽然我的原始答案很适合快速制作单个页面的多个大小,但它并不能解决并行处理页面的问题。所以,这是一种使用GNU Parallel的方法,它可以免费用于OS X(使用homebrew),安装在大多数Linux发行版上,也可以在Windows上使用 - 如果你真的必须的话。

代码如下所示:

#!/bin/bash

shopt -s nullglob
shopt -s nocaseglob

doPage(){
   # Expecting filename as first parameter and page number as second
   # echo DEBUG: File: $1 Page: $2
   noexten=${1%%.*}
   convert -density 400 -quality 100 "$1[$2]"     \
      -resize 1310x650 -write "${noexten}-p-$2-large.jpg" \
      -resize 230x160  -write "${noexten}-p-$2-med.jpg"   \
      -resize 170x117  "${noexten}-p-$2-small.jpg"
}

export -f doPage

# First, get list of all PDF documents
for d in *.pdf; do
   # Now get number of pages in this document - "pdfinfo" is probably quicker
   p=$(identify "$d" | wc -l)
   for ((i=0;i<$p;i++));do
      echo $d:$i
   done
done | parallel --eta --colsep ':' doPage {1} {2}

如果你想看看它是如何工作的,从最后一行中删除| parallel ....,你会看到前面的循环只是将文件名列表和页码的计数器回显到GNU Parallel中。然后,它将为每个CPU核心运行一个进程,除非您指定-j 8,如果您想要并行运行8个进程。如果您不想在命令可能完成时进行任何更新,请删除--eta

在评论中,我提到pdfinfoidentify快,如果你有可用的(它是OS X上poppler下的homebrew包的一部分),那么您可以使用它来获取PDF中的页数:

pdfinfo SomeDocument.pdf | awk '/^Pages:/ {print $2}'

原始答案

未经测试,但沿着这些线条的东西,所以你只能读一次,然后从最大的一个生成连续的较小的图像:

convert -density 400 -quality 100 x.pdf \
   -resize 1310x650 -write large.jpg    \
   -resize 230x160  -write medium.jpg   \
   -resize 170x117  small.jpg

除非你的意思是你有50页的PDF,并且你想要并行完成所有50页。如果你这样做,那么,当我10小时起床时,我会告诉你使用GNU Parallel ...