2012-01-11 27 views
1

私は、複数ページのPDFから1ページあたりにTIFFを抽出する必要があるプロジェクトに取り組んでいます。 PDFには画像しか含まれておらず、1ページに1枚の画像があります(私は彼らがある種の複写機/スキャナで作られたと信じていますが、これを確認していません)。 TIFFは、ドキュメントの他のいくつかの派生バージョンを作成するために使用されるので、解像度が高くなればなるほど。PDFからの高解像度画像

私は2つのレシピを見つけました。どちらも役立つ面がありますが、いずれも理想的ではありません。誰かが私の1つを調整したり、3つ目のオプションを提供したりするのを助けることができます。

レシピ1、pdfimagesとのImageMagick:

まず実行します(foo-000.pbm名付け、foo-001.pbm.pbmいくつかのファイルになり

$ pdfimages $MY_PDF.pdf foo" 

など

次に、各*.pbmのためにdo:

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

プロ:結果のTIFFファイルは

コン(-resizeだけですべてを正常化するのに役立つ)、長い寸法に健康3300+ピクセルです:ページの向きが失われ、彼らが出てくるには、(異なる方向に回転させます彼らは論理的なパターンに従っているので、恐らくスキャナに供給された向きであるでしょうか?)。

レシピ2 ImageMagickのソロ:

convert +adjoin $MY_PDF.pdf pages.tif 

これは私(などpages-0.tifpages-1.tif、)ページあたりのTIFFを与えます。

プロ:オリエンテーションはそのままです!

Con:結果のファイルの長さは、< 800 pxです。これは小さすぎて便利ではないようですが、圧縮が適用されているように見えます。

イメージストリームのスケーリングをPDFで取り除くことはできますが、その向きは保持できますか?私が紛失しているImageMagickにもっと魔法がいくつかありますか?何か完全に?

+0

フリーではないソリューションを使用しますか? – BitBank

+0

多分 - それはAPI(GUIなし)を持ち、統合するのに合理的である必要があります。私は何万ものドキュメントを取り扱っています。あなたはどう思いますか? – JStroop

+0

詳細を私に書いてください。私が助けることができるかどうかが分かります([email protected])。 – BitBank

答えて

1

は申し訳ありませんが、Googleは上位の結果の一つとして、ここに連れて行ってくれましたし、それが他の人がかかる場合がありますので、私は私と思いましたhttp://robfelty.com/2008/03/11/convert-pdf-to-png-with-imagemagick

短く:ImageMagickにPDFをスキャンする密度を教えてもらう必要があります。

それは600dpiの解像度ので、出力はるかに大きなPNG画像を持っていたかのようにconvert -density 600x600 foo.pdf foo.pngはPDFを治療するためのImageMagickのを教えてくれます。私の場合、結果のfoo.pngは5000x6600pxのサイズでした。必要に応じて-resize 3000x3000などの任意のサイズを追加することができます。サイズは縮小されます。限り、あなたは、あなたのPDF - ファイル内のベクトル画像やテキストを持っているように、密度が必要なだけ高く設定されることがあります

注意。 PDFにラスタライズされた画像が含まれている場合、その画像のdpiよりも高い値を設定するとうまく表示されません。 :)

クリス

+1

素晴らしい、ありがとう!私は決して答えを得ていないので、騒ぎはほとんどありません。完全を期すために、ここでは、ページごとにTIFFを作るサイズを正規化し、グレースケールに変換するための私の最終的なレシピです: は '隣接+変換-density 300×300 -depth 8 -resize 3200x3200 \> in.pdf out_prefix.tif' – JStroop

2

私は自分の解決策を共有したいと思っています...誰にとってもうまくいかないかもしれませんが、他の誰かが他の人に役立つかもしれないので、私は最初の選択肢を持って私の質問につきました。これはpdfimagesを使って、どんな方法でも回転された大きな画像を得ることでした。私はOCRと単語数を使ってオリエンテーションを推測する方法を見つけました。私は25%を正確に90%以上に回転させました。次のように

フローは次のとおりです。

  1. 使用pdfimages(のpoppler-utilsのインストールapt-getの)PBM ファイル(以下に示していない)のセットを取得します。各ファイルに対して
    1. 4つのバージョンを作成し、0を回転させ、90、180、および270度(私は「北」、「東」、「南」、そして私のコードでは「西」としてそれらを参照してください。 )。
    2. それぞれOCR。単語数が最も少ない2つは、右側の上下のバージョンです。これまでに処理された画像のセットでは99%以上の正確さでした。
    3. 単語カウントが最も低い2つの単語から、OCR出力をスペルチェックで実行します。スペルミスが最も少ないファイル(すなわち、最も認識可能な単語)は正しいと思われる。私のセットでは、これは500

メーリングリストへのサンプルに基づいて正確な(最大25%)から約93%でした。私のファイルは色が濃く、テキストも多いです。ソース画像は長辺の平均3300ピクセルです。私は、グレースケールや色、または多くの画像を持つファイルには話すことができません。私のソースファイルのほとんどは古いコピーの悪いスキャンなので、精度はクリーンなファイルではさらに良いかもしれません。ローテーション中に-despeckleを使用すると、違いはなく、かなり遅くなった(約5倍)。私は大まかな数字しか必要とせず、OCRを投げ捨てているので、スピードと正確さのためにocradを選んだ。再:パフォーマンス、私の特別な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