Imagemagick 并行转换

Imagemagick parallel conversion

我想将 pdf 的每个页面截图到 jpg 中。为此,我在命令行中使用 ImageMagickconvert 命令。

我必须实现以下目标 -

  1. 获取pdf文件每一页的截图。
  2. 将屏幕截图调整为 3 种不同的大小(小、中和预览)。
  3. 将不同的尺寸存储在不同的文件夹中(小、中和预览)。

我正在使用以下有效的命令,但是速度很慢。我怎样才能提高它的执行时间或并行执行命令。

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

拆分命令以提高可读性

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

更新答案

我看到您有很长的多页文档,虽然我的原始答案适用于快速制作单页的多种尺寸,但它没有解决并行处理页面的问题。因此,这是一种使用 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:  Page: 
   noexten=${1%%.*}
   convert -density 400 -quality 100 "[]"     \
      -resize 1310x650 -write "${noexten}-p--large.jpg" \
      -resize 230x160  -write "${noexten}-p--med.jpg"   \
      -resize 170x117  "${noexten}-p--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 快,如果你有的话(它是 homebrew 下的 poppler 包的一部分 OS X), 那么你可以用它来获取 PDF 中的页数:

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

原答案

沿着这些线的东西所以你只读一次然后从最大的图像生成连续的小图像:

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...