Изображения в высоком разрешении из PDFS - PullRequest
1 голос
/ 12 января 2012

Я работаю над проектом, в котором мне нужно извлечь TIFF на страницу из многостраничных PDF-файлов.PDF-файлы содержат только изображения, и на странице есть одно изображение (я думаю, что они были сделаны на каком-то копировальном аппарате / сканере, но не подтвердили это).Затем TIFF используются для создания нескольких других производных версий документа, поэтому чем выше разрешение, тем лучше.

Я нашел два рецепта, оба с полезными аспектами, но ни один из них не идеален.Надеясь, что кто-то может помочь мне настроить один из них или предложить третий вариант.

Рецепт 1 , pdfimages и ImageMagick:

Сначала сделайте:

$ pdfimages $MY_PDF.pdf foo"

Что приводит к нескольким .pbm файлам (названным foo-000.pbm, foo-001.pbm) и т. Д.

Затем для каждого *.pbm do:

$ convert $each -resize 3200x3200\> -quality 100 $new_name.tif

Pro: Theрезультирующие TIFF - это исправные 3300+ пикселей в длинном измерении (-resize просто служит для нормализации всего)

Con: ориентация страниц потеряна, и они выходят повернутыми в разных направлениях (они следуют логическим схемамтак что, вероятно, это ориентация, в которой они подавались на сканер ??).

Рецепт 2 Imagemagick соло:

convert +adjoin $MY_PDF.pdf pages.tif

Это дает мне TIFFна страницу (pages-0.tif, pages-1.tif и т. д.).

Pro: ориентация остается!

Con: длинный размер результирующего файла <800 px, что слишком малобыть полезным, и похоже, что применяется некоторое сжатие. </p>

Как я могу угробить масштабирование IM?возраст потока в PDF, но сохранить ориентацию?Есть ли еще какая-то магия в ImageMagick, которую мне не хватает?Что-то еще целиком?

Ответы [ 2 ]

2 голосов
/ 02 января 2013

Извините за шумиху в этой старой теме, но Google взял меня здесь в качестве одного из лучших результатов, и это может занять другие, поэтому я подумал, что выложу решение вопроса TO, которое я нашел здесь: http://robfelty.com/2008/03/11/convert-pdf-to-png-with-imagemagick

Короче говоря: вы должны указать ImageMagick, с какой плотностью он должен сканировать PDF.

, поэтому convert -density 600x600 foo.pdf foo.png скажет ImageMagick обработать PDF, как если бы он имел разрешение 600 точек на дюйм, и, следовательно, вывестигораздо большие PNG.В моем случае результирующий файл foo.png был размером 5000x6600px.При желании вы можете добавить -resize 3000x3000 или любой другой размер, который вам необходим, и он будет уменьшен.

Обратите внимание, что, если у вас есть только векторные изображения или текст в ваших PDF-файлах, плотность может быть установлена ​​настолько высокой, насколько это необходимо.Если PDF-файл содержит растровые изображения, он будет выглядеть не очень хорошо, если вы установите его выше, чем dpi этих изображений, сюрприз!:)

Крис

2 голосов
/ 20 марта 2012

Я хотел бы поделиться своим решением ... оно может работать не для всех, но, поскольку больше ничего не происходит, может быть, оно поможет кому-то еще. Я выбрал первую опцию в своем вопросе, которая заключалась в использовании pdfimages для получения больших изображений, которые были повернуты в разные стороны. Затем я нашел способ использовать OCR и количество слов, чтобы угадать ориентацию, что привело меня к (предполагаемому) повороту на 25% с точностью до 90%.

Поток выглядит следующим образом:

  1. Используйте pdfimages (apt-get install poppler-utils), чтобы получить набор pbm файлы (не показаны ниже).
  2. Для каждого файла:
    1. Сделайте четыре версии, повернутые на 0, 90, 180 и 270 градусов (в моем коде я называю их «север», «восток», «юг» и «запад»).
    2. OCR каждый. Два с наименьшим количеством слов - это, скорее всего, версии с правой стороны вверх и вниз. Это было более 99% точности в моем наборе изображений, обработанных на сегодняшний день.
    3. Из двух с наименьшим количеством слов пропустите вывод OCR через проверку орфографии. Файл с наименьшим количеством орфографических ошибок (то есть наиболее узнаваемых слов), вероятно, будет правильным. Для моего набора это было примерно на 93% (вместо 25%) с точностью до выборки 500.

YMMV. Мои файлы являются битональными и очень текстовыми. Исходные изображения в среднем 3300 пикселей по длинной стороне. Я не могу говорить с оттенками серого или цветом, или файлами с большим количеством изображений. Большинство моих исходных PDF-файлов плохо сканируют старые фотокопии, поэтому точность может быть даже выше при использовании более чистых файлов. Использование -despeckle во время вращения не имело значения и значительно замедляло процесс (~ 5 ×). Я выбрал ocrad для скорости, а не для точности, так как мне нужны только приблизительные числа, и я выбрасываю OCR. Что касается производительности, мой ничего особенный настольный компьютер с Linux может запускать весь сценарий со скоростью примерно 2-3 файла в секунду.

Вот реализация в простом скрипте bash:

#!/bin/bash
# Rotates a pbm file in place.

# Pass a .pbm as the only arg.
file=$1

TMP="/tmp/rotation-calc"
mkdir $TMP

# Dependencies:                                                                 
# convert: apt-get install imagemagick                                          
# ocrad: sudo apt-get install ocrad                                               
ASPELL="/usr/bin/aspell"
AWK="/usr/bin/awk"
BASENAME="/usr/bin/basename"
CONVERT="/usr/bin/convert"
DIRNAME="/usr/bin/dirname"
HEAD="/usr/bin/head"
OCRAD="/usr/bin/ocrad"
SORT="/usr/bin/sort"
WC="/usr/bin/wc"

# Make copies in all four orientations (the src file is north; copy it to make 
# things less confusing)
file_name=$(basename $file)
north_file="$TMP/$file_name-north"
east_file="$TMP/$file_name-east"
south_file="$TMP/$file_name-south"
west_file="$TMP/$file_name-west"

cp  $file $north_file
$CONVERT -rotate 90 $file $east_file
$CONVERT -rotate 180 $file $south_file
$CONVERT -rotate 270 $file $west_file

# OCR each (just append ".txt" to the path/name of the image)
north_text="$north_file.txt"
east_text="$east_file.txt"
south_text="$south_file.txt"
west_text="$west_file.txt"

$OCRAD -f -F utf8 $north_file -o $north_text
$OCRAD -f -F utf8 $east_file -o $east_text
$OCRAD -f -F utf8 $south_file -o $south_text
$OCRAD -f -F utf8 $west_file -o $west_text

# Get the word count for each txt file (least 'words' == least whitespace junk
# resulting from vertical lines of text that should be horizontal.)
wc_table="$TMP/wc_table"
echo "$($WC -w $north_text) $north_file" > $wc_table
echo "$($WC -w $east_text) $east_file" >> $wc_table
echo "$($WC -w $south_text) $south_file" >> $wc_table
echo "$($WC -w $west_text) $west_file" >> $wc_table

# Take the bottom two; these are likely right side up and upside down, but 
# generally too close to call beyond that.
bottom_two_wc_table="$TMP/bottom_two_wc_table"
$SORT -n $wc_table | $HEAD -2 > $bottom_two_wc_table

# Spellcheck. The lowest number of misspelled words is most likely the 
# correct orientation.
misspelled_words_table="$TMP/misspelled_words_table"
while read record; do
    txt=$(echo $record | $AWK '{ print $2 }')
    misspelled_word_count=$(cat $txt | $ASPELL -l en list | wc -w)
    echo "$misspelled_word_count $record" >> $misspelled_words_table
done < $bottom_two_wc_table

# Do the sort, overwrite the input file, save out the text
winner=$($SORT -n $misspelled_words_table | $HEAD -1)
rotated_file=$(echo $winner | $AWK '{ print $4 }')

mv $rotated_file $file

# Clean up.
if [ -d $TMP ]; then
    rm -r $TMP
fi
...