Imagemagick 并行转换
Imagemagick parallel conversion
我想将 pdf
的每个页面截图到 jpg
中。为此,我在命令行中使用 ImageMagick
的 convert
命令。
我必须实现以下目标 -
- 获取pdf文件每一页的截图。
- 将屏幕截图调整为 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
。
在评论中我提到 pdfinfo
比 identify
快,如果你有的话(它是 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...
我想将 pdf
的每个页面截图到 jpg
中。为此,我在命令行中使用 ImageMagick
的 convert
命令。
我必须实现以下目标 -
- 获取pdf文件每一页的截图。
- 将屏幕截图调整为 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
。
在评论中我提到 pdfinfo
比 identify
快,如果你有的话(它是 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...