我正在开展一个项目,我需要从多页PDF中提取每页TIFF。 PDF仅包含图像,每页有一个图像(我相信它们是在某种复印机/扫描仪上制作的,但尚未证实)。然后使用TIFF创建文档的其他衍生版本,因此分辨率越高越好。
我发现了两个有用的方面,但都不是理想的。希望有人可以帮助我调整其中一个,或提供第三个选项。
食谱1 ,pdfimages和ImageMagick:
首先:
$ pdfimages $MY_PDF.pdf foo"
这导致多个.pbm
个文件(名为foo-000.pbm
,foo-001.pbm
)等。
然后为每个*.pbm
做:
$ convert $each -resize 3200x3200\> -quality 100 $new_name.tif
Pro:结果TIFF在长维上是健康的3300+像素(-resize只用于规范所有内容)
Con:页面的方向丢失,它们以不同的方向旋转(它们遵循逻辑模式,所以它们可能是它们被送到扫描仪的方向?)。
食谱2 Imagemagick独奏:
convert +adjoin $MY_PDF.pdf pages.tif
这为我提供了每页TIFF(pages-0.tif
,pages-1.tif
等)。
专业:定位停留!
Con:结果文件的长尺寸是< 800 px,太小而无法使用,看起来好像有一些压缩。
如何在PDF中放弃图像流的缩放,但保留方向?我错过了ImageMagick中的一些魔法吗?还有其他什么呢?
答案 0 :(得分:2)
我想分享我的解决方案......它可能对每个人都不起作用,但因为没有别的东西可能会帮助别人。我最后选择了我的问题中的第一个选项,即使用pdfimages
来获取每个方向旋转的大图像。然后我找到了一种方法来使用OCR和字数来猜测方向,这使我从(估计)25%精确旋转到90%以上。
流程如下:
pdfimages
(apt-get install poppler-utils)获取一组pbm
文件(未在下面显示)。 YMMV。我的文件是双色的和高度文字的。源图像长边平均为3300像素。我不能说灰度或颜色,或者有大量图像的文件。我的大多数源PDF都是对旧复印件的不良扫描,因此使用更清晰的文件可能会更好。在旋转期间使用-despeckle
没有任何区别,并且显着减慢了事情(~5×)。我选择了ocrad的速度而不是准确性,因为我只需要粗略的数字而且扔掉了OCR。 Re:性能,我没什么特别的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
答案 1 :(得分:2)
对于这个老话题的噪音感到抱歉,但谷歌把我带到这里作为最好的结果之一,它可能需要其他人,所以我想我会发布我在这里找到的TO问题的解决方案:{{3 }}
简而言之:您必须告诉ImageMagick它应扫描PDF的密度。
所以convert -density 600x600 foo.pdf foo.png
会告诉ImageMagick将PDF视为具有600dpi分辨率,从而输出更大的PNG。在我的例子中,生成的foo.png大小为5000x6600px。您可以选择添加-resize 3000x3000
或您需要的任何尺寸,它将按比例缩小。
请注意,只要您的PDF文件中只有矢量图像或文本,密度就可以根据需要设置为高。如果PDF包含光栅化图像,如果将其设置为高于那些图像的dpi,则效果会不会很高! :)
克里斯