2012-01-11 4 views
1

여러 페이지 PDF에서 한 페이지 당 TIFF를 추출해야하는 프로젝트를 진행하고 있습니다. PDF는 이미지 만 포함하고 있으며 페이지 당 하나의 이미지가 있습니다 (필자는 일종의 복사기/스캐너로 제작되었지만이를 확인하지는 않았다고 생각합니다). TIFF는 문서의 여러 다른 파생 버전을 만드는 데 사용되므로 해상도가 높을수록 좋습니다.PDF 크기의 고해상도 이미지

나는 두 가지 조리법을 모두 유용한 측면에서 발견했지만 어느 것도 이상적이지 않습니다. 누군가를 원하면 그 중 하나를 조정하거나 세 번째 옵션을 제공 할 수 있습니다.

레시피 1, pdfimages와 ImageMagick이 :

먼저 수행

( foo-000.pbm foo-001.pbm 이름) .pbm 여러 파일 결과
$ pdfimages $MY_PDF.pdf foo" 

등 각 *.pbm에 대한 다음

해야 할 일 :

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

프로 : 결과의 TIFFs은 긴 치수에 건강한 3300+ 픽셀이며,

콘 (-resize은 모든 것을 정상화하는 역할) : 페이지의 방향이 손실되고, 그들이 밖으로 서로 다른 방향으로 회전 온 (논리 패턴을 따르므로 스캐너에 공급되는 방향 일 수 있습니다.). 솔로

레시피 2있는 Imagemagick :

이 나에게 페이지 당 TIFF 제공
convert +adjoin $MY_PDF.pdf pages.tif 

(pages-0.tif, pages-1.tif를, 등).

프로 : 오리엔테이션이 그대로!

단점 : 결과 파일의 길이가 길면 < 800px가됩니다.이 파일은 너무 작아서 유용하지 않을 수 있으며 약간의 압축이 적용된 것처럼 보입니다.

PDF에서 이미지 스트림의 배율을 어떻게 떨어 뜨리지 만 오리엔테이션을 유지할 수 있습니까? 내가 잃어버린 ImageMagick에 더 많은 magick가 있습니까? 완전히 다른 것?

+0

무료가 아닌 솔루션을 사용 하시겠습니까? – BitBank

+0

아마도 - API가 있어야하고 (GUI가 필요하지 않습니다) 통합 할 수 있어야합니다. 저는 수만 명의 문서를 다루고 있습니다. 너는 무엇을 염두에두고 있니? – JStroop

+0

세부 정보를 보내 주시면 도와 드리겠습니다. ([email protected]). – BitBank

답변

1

미안하지만, 구글은 최고 결과 중 하나 여기에 데려와는 다른 사람이 걸릴 수 있습니다, 그래서 내가 생각 여기에 찾은 TO의 질문에 대한 해결책을 게시하십시오. http://robfelty.com/2008/03/11/convert-pdf-to-png-with-imagemagick

짧은 : ImageMagick에게 PDF를 스캔해야하는 밀도를 알려줘야합니다.

그래서 convert -density 600x600 foo.pdf foo.png은 ImageMagick에게 PDF를 600dpi 해상도로 처리하여 훨씬 더 큰 PNG를 출력하도록합니다. 필자의 경우 결과 foo.png의 크기는 5000x6600px였습니다. 선택적으로 -resize 3000x3000 또는 원하는 크기를 추가 할 수 있으며 크기가 축소됩니다.

PDF 파일에 벡터 이미지 또는 텍스트 만 있으면 밀도가 필요한만큼 높게 설정 될 수 있습니다. PDF에 래스터 화 된 이미지가 포함되어있는 경우 이미지의 dpi보다 더 높게 설정하면 이미지가 잘 보이지 않습니다. :)

크리스

+1

끝내 주셔서 고마워요! 나는 결코 대답을 얻지 못했기 때문에 거의 소음이 아니다. 완성도를 위해 다음은 페이지 당 TIFF를 만들고, 크기를 표준화하고, 그레이 스케일로 변환하는 마지막 방법입니다. 'convert + adjoin -density 300x300 -depth 8 -resize 3200x3200 \> in.pdf out_prefix.tif' – JStroop

2

내 솔루션을 공유하고 싶었지만 ... 모든 사람들에게 효과가 없을 수는 있지만 다른 누군가가 도움이 될만한 다른 프로그램이 없기 때문에. 나는 내 질문에 첫 번째 옵션으로가는 상처를 입었다.이 질문은 pdfimages을 사용하여 모든 방법으로 회전 된 큰 이미지를 얻는 것이었다. 그런 다음 오리엔테이션을 추측하기 위해 OCR과 단어 수를 사용하는 방법을 찾았는데, 이로 인해 정확히 25 %가 90 % 이상으로 정확하게 회전했습니다. 다음과 같이

흐름은 다음과 같습니다

  1. 사용 pdfimages (apt-get을 poppler-utils를 설치) PBM의 파일 (아래 도시하지 않음) 세트를 얻을 수 있습니다. 각 파일에 대해
  2. :
    1. 는 4 개의 버전을 확인는 0도, 90도, 180도, 270도 (내 코드에서 "북쪽", "동쪽", "남쪽"및 "서쪽"로 참조 회전).
    2. 각 OCR.가장 낮은 단어 수를 가진 두 개는 오른쪽 위 및 아래를 뒤집은 버전 일 가능성이 큽니다. 현재까지 처리 된 이미지 집합에서 99 % 이상 정확했습니다.
    3. 단어 수가 가장 적은 단어 2 개 중에서 맞춤법 검사를 통해 OCR 출력을 실행하십시오. 철자 오류가 가장 적은 파일 (예 : 가장 잘 알아볼 수있는 단어)은 정확할 것입니다. 내 세트의이 500

YMMV의 샘플에 따라 정확한 (25 %)에서 약 93 %였다. 내 파일은 색다른 텍스트입니다. 원본 이미지는 긴면에 평균 3300 픽셀입니다. 그레이 스케일이나 컬러, 이미지가 많은 파일에 대해서는 말할 수 없습니다. 필자가 사용하는 대부분의 원본 PDF는 오래된 복사본의 잘못된 스캔이므로 정확성은 더 깨끗한 파일로 더 좋을 수 있습니다. 회전 중에 -despeckle을 사용하면 아무런 차이가 없었으며 상당히 느려졌습니다 (~ 5 배). 나는 단지 거친 숫자가 필요하고 OCR을 버리고 있기 때문에 속도와 정확성을 위해 ocrad를 선택했습니다. 재 : 성능, 내 특별한 리눅스 데스크탑 컴퓨터는 초당 약 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 
관련 문제