2015-06-28 3 views
0

Я хочу получить снимок экрана каждой страницы pdf в jpg. Чтобы сделать это, я использую команду ImageMagickconvert в командной строке.Imagemagick параллельное преобразование

Я должен достигнуть следующего -

  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 

ответ

2

Обновлено Ответ

Я вижу, у вас есть длинные многостраничные документы и в то время как мой первоначальный ответ хорош для изготовления различных размеров одной страницы быстро, она не обращается к страницам параллельно. Итак, вот способ сделать это с помощью 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. Затем он запустит один процесс на ядро ​​процессора, если вы не укажете -j 8, если вы хотите сказать, что 8 процессов выполняются параллельно. Удалите --eta, если вы не хотите никаких обновлений, когда команда может завершиться.

В комментариях я намекаю на pdfinfo быть быстрее, чем identify, если у вас есть, что доступно (это часть poppler пакета под homebrew на OS X), то вы можете использовать это, чтобы получить количество страниц в формате 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 страниц параллельно. Если да, скажите так, и я покажу вам, что с помощью GNU Parallel, когда я встану через 10 часов ...

+0

Спасибо @Mark. У pdf-файла у меня есть много страниц, 50 тоже. Я с нетерпением жду вашей помощи. Кроме того, имя файла изображения должно иметь «номер страницы», начиная с 1. – JHS