我想将pdf
的每个页面的屏幕截图转换为jpg
。为此,我在命令行中使用ImageMagick
的{{1}}命令。
我必须达到以下目的 -
我正在使用以下命令,但是,它很慢。如何改善执行时间或平行执行命令。
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
答案 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
。
在评论中,我提到pdfinfo
比identify
快,如果你有可用的(它是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 ...