【问题标题】:Imagemagick parallel conversionImagemagick 并行转换
【发布时间】:2015-09-15 07:12:17
【问题描述】:

我想将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

【问题讨论】:

    标签: imagemagick imagemagick-convert


    【解决方案1】:

    更新答案

    我看到您有很长的多页文档,虽然我的原始答案很适合快速制作单个页面的多种尺寸,但它并没有解决并行处理页面的问题。所以,这里有一种使用 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 上 homebrewpoppler 包的一部分),那么你可以使用它来获取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……

    【讨论】:

    • 谢谢@Mark。我的pdf确实有很多页,也有50页。我会期待你的帮助。此外,图像文件名应具有从 1 开始的“页码”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2021-11-02
    • 1970-01-01
    相关资源
    最近更新 更多