pdf - 处理 tif 文件的文件夹以创建可搜索的 PDF 文件
问题描述
我正在研究一个工作流程,以从一堆缩微胶卷报纸中创建 PDF 可搜索文件以及已识别文本的 txt 文件。每卷有近 500 张图像,如下所示:
我正在做的是:
- 使用 ScanTailor 高级处理每一卷,以便裁剪图像、分离奇数页和偶数页、添加边距并为每一页输出 tiff 文件,得到这个
然后,手动删除所有实际上不是报纸的页面(如滚动开始、滚动结束、建议和其他元图片)。
然后,将一份报刊的tif文件合并到一个文件中。例如,该特定报纸每个版本有 4 页。使用 automator 和 Imagemagick 我编写了一个 shell 服务,它接收来自 finder 的文件选择作为输入:
对于“$@”中的 f
做
/usr/local/opt/imagemagick@6/bin/convert -format tiff -quality 75 -set filename:original '%t' -compress jpeg "$@" -adjoin ~/Pictures/Microfilms/ediciones_%[filename:original ].tif
echo "$f" 完成
这是我需要帮助的地方:
在我的无知中,我不得不使用 -set filename:original '%t' 以避免文件覆盖,因为 IM 无法将文件(-adjoin)与输出文件名 %escape(例如 %02d)合并。这没问题,但不是理想的。
我如何 cd 到输入文件的父文件夹?
ScanTailor 的输出文件夹有近 1000 个文件,我需要处理 67 个文件夹。因此,您可以想象选择每个报纸版本的每 4 页并手动执行该过程...那么我如何告诉 automator 获取每 4 个(或 n 个)文件并使用它们执行转换命令?,并不是所有的报纸每个版本都有 4 页,所以最好的解决方案是询问用户有多少页(文件)有报纸版本。在这种情况下,我可以处理整个文件夹并让计算机通宵工作。
最后,我使用 Tesseract 处理多页 tif 以输出可搜索的 pdf 和纯文本 (.txt)。这里我需要将 tesseract 进程添加到 automator,告诉 automator 处理合并的 tif 文件夹的所有文件(IM 进程的输出),首先使用 PDF 选项,然后使用 TXT 选项。
提前致谢
解决方案
好的,对于处于相同情况的人:
我从这里和那里获取代码并制作了一个 Automator bash 脚本。
我创建了各种文件夹,其中包含报纸的版本页数:文件夹“2”包含与 2 页报纸版本对应的所有 tiff 文件,文件夹“4”包含与 4 页报纸版本对应的所有 tiff 文件等等...
因此,我打开一个 Finder 窗口,将文件视为大图标(缩略图),按 8 列文件列出(因此当报纸的页数多于或少于 4 或 8 页时,我可以很容易地在缩略图中看到。我移动了所有的 tiff 2 页报纸的文件到文件夹 2 和 o 儿子。
然后我使用脚本处理包含编号文件夹的文件夹(您可以在此处下载)。我也让它在这里:
for f in "$@"
do
cd "$@"
if [ -d ./ediciones ]; then
echo "Ya existe la carpeta ediciones. Carpeta ya fue procesada?"
exit 1
else
mkdir ./ediciones
mkdir ./ediciones/ocr
fi
if [ -d ./1 ]; then
cd ./1
/usr/local/opt/imagemagick@6/bin/convert -format tiff -quality 75 -set filename:original '%t' -compress jpeg +adjoin ../ediciones/edicion_%[filename:original].tif
cd ../
else
echo "No hay periódicos de 1 sola página"
fi
if [ -d ./2 ]; then
cd ./2
arr=(`ls *.tif`)
num=${#arr[*]}
for ((i=0; i<num; i=i+2)); do
j=$((i+1))
k=$((i+2))
/usr/local/opt/imagemagick@6/bin/convert -format tiff -quality 75 -set filename:original '%t' -compress jpeg ${arr[$i]} ${arr[$j]} -adjoin ../ediciones/edicion_%[filename:original].tif
done;
cd ../
else
echo "no hay de 2 paginas"
fi
if [ -d ./3 ]; then
cd ./3
arr=(`ls *.tif`)
num=${#arr[*]}
for ((i=0; i<num; i=i+3)); do
j=$((i+1))
k=$((i+2))
l=$((i+3))
/usr/local/opt/imagemagick@6/bin/convert -format tiff -quality 75 -set filename:original '%t' -compress jpeg ${arr[$i]} ${arr[$j]} ${arr[$k]} -adjoin ../ediciones/edicion_%[filename:original].tif
done;
cd ../
else
echo "no hay de 3 páginas"
fi
if [ -d ./4 ]; then
cd ./4
arr=(`ls *.tif`)
num=${#arr[*]}
for ((i=0; i<num; i=i+4)); do
j=$((i+1))
k=$((i+2))
l=$((i+3))
m=$((i+4))
/usr/local/opt/imagemagick@6/bin/convert -format tiff -quality 75 -set filename:original '%t' -compress jpeg ${arr[$i]} ${arr[$j]} ${arr[$k]} ${arr[$l]} -adjoin ../ediciones/edicion_%[filename:original].tif
done;
cd ../
else
echo "no hay de 4 paginas"
fi
if [ -d ./5 ]; then
cd ./5
arr=(`ls *.tif`)
num=${#arr[*]}
for ((i=0; i<num; i=i+5)); do
j=$((i+1))
k=$((i+2))
l=$((i+3))
m=$((i+4))
n=$((i+5))
/usr/local/opt/imagemagick@6/bin/convert -format tiff -quality 75 -set filename:original '%t' -compress jpeg ${arr[$i]} ${arr[$j]} ${arr[$k]} ${arr[$l]} ${arr[$m]} -adjoin ../ediciones/edicion_%[filename:original].tif
done;
cd ../
else
echo "no hay de 5 paginas"
fi
if [ -d ./6 ]; then
cd ./6
arr=(`ls *.tif`)
num=${#arr[*]}
for ((i=0; i<num; i=i+6)); do
j=$((i+1))
k=$((i+2))
l=$((i+3))
m=$((i+4))
n=$((i+5))
o=$((i+6))
/usr/local/opt/imagemagick@6/bin/convert -format tiff -quality 75 -set filename:original '%t' -compress jpeg ${arr[$i]} ${arr[$j]} ${arr[$k]} ${arr[$l]} ${arr[$m]} ${arr[$n]} -adjoin ../ediciones/edicion_%[filename:original].tif
done;
cd ../
else
echo "no hay de 6 paginas"
fi
if [ -d ./7 ]; then
cd ./7
arr=(`ls *.tif`)
num=${#arr[*]}
for ((i=0; i<num; i=i+7)); do
j=$((i+1))
k=$((i+2))
l=$((i+3))
m=$((i+4))
n=$((i+5))
o=$((i+6))
p=$((i+7))
/usr/local/opt/imagemagick@6/bin/convert -format tiff -quality 75 -set filename:original '%t' -compress jpeg ${arr[$i]} ${arr[$j]} ${arr[$k]} ${arr[$l]} ${arr[$m]} ${arr[$n]} ${arr[$o]} -adjoin ../ediciones/edicion_%[filename:original].tif
done;
cd ../
else
echo "no hay de 7 paginas"
fi
if [ -d ./8 ]; then
cd ./8
arr=(`ls *.tif`)
num=${#arr[*]}
for ((i=0; i<num; i=i+8)); do
j=$((i+1))
k=$((i+2))
l=$((i+3))
m=$((i+4))
n=$((i+5))
o=$((i+6))
p=$((i+7))
q=$((i+8))
/usr/local/opt/imagemagick@6/bin/convert -format tiff -quality 75 -set filename:original '%t' -compress jpeg ${arr[$i]} ${arr[$j]} ${arr[$k]} ${arr[$l]} ${arr[$m]} ${arr[$n]} ${arr[$o]} ${arr[$p]} -adjoin ../ediciones/edicion_%[filename:original].tif
done;
cd ../
else
echo "no hay de 8 paginas"
fi
if [ -d ./12 ]; then
cd ./12
arr=(`ls *.tif`)
num=${#arr[*]}
for ((i=0; i<num; i=i+12)); do
j=$((i+1))
k=$((i+2))
l=$((i+3))
m=$((i+4))
n=$((i+5))
o=$((i+6))
p=$((i+7))
q=$((i+8))
r=$((i+9))
s=$((i+10))
t=$((i+11))
u=$((i+12))
/usr/local/opt/imagemagick@6/bin/convert -format tiff -quality 75 -set filename:original '%t' -compress jpeg ${arr[$i]} ${arr[$j]} ${arr[$k]} ${arr[$l]} ${arr[$m]} ${arr[$n]} ${arr[$o]} ${arr[$p]} ${arr[$q]} ${arr[$r]} ${arr[$s]} ${arr[$t]} -adjoin ../ediciones/edicion_%[filename:original].tif
done;
cd ../
else
echo "no hay de 12 paginas"
fi
cd ./ediciones
for i in *.tif ; do
/usr/local/bin/tesseract -l spa $i ./ocr/$i txt PDF;
done;
cd ./ocr
sed -i '' "s/º/o/g" *.txt
cd ../
cd ../
done;
name=${PWD##*/}
a=1
for i in ./ediciones/ocr/*.pdf; do
new=$(printf "%03d.pdf" "$a")
mv -i -- "$i" "DM_${name}_${new}"
let a=a+1
done;
for z in ./ediciones/ocr/*.txt; do
new=$(printf "%03d.txt" "$a")
mv -i -- "$z" "DM_${name}_${new}"
let a=a+1
echo "$f"
done
这段代码做:
将所有版本的 tiff 文件合并到一个使用 imagemagick 创建(ediciones)的文件夹中,并进行合理的压缩。
阅读报纸合并文件并创建转录的可搜索 PDF 和 Txt 文件,这两个文件都位于名为 OCR 的子文件夹中。这是使用 Tesseract 和最佳训练数据文件制作的
用“o”更改所有“º”(总是写为错误识别的字符)。这是用 sed 制作的
重命名所有文件以符合我们的存档文件名规则。对我们来说是 DM_0001_01(DM 表示“Diario microfilmado”-缩微报纸-),0001 是卷号,01+ 是卷内的版本。
而已。
在此之前,我与 Scantailor 合作生成文件,然后让电脑通宵处理 2 或 3 个文件夹。
希望它对像我这样的人有所帮助。
推荐阅读
- java - 在 Java Swings 中自定义 JTextField - 向 JTextField 添加简单/复合/自定义边框
- java - 使用没有泛型的自定义类而不是 Java 中的普通集合是个好主意吗?
- java - 将库导入java
- couchbase - N1QL 检查数组是否包含 id
- linux - 做while循环例子
- jquery - Uncaught TypeError: $(...).load is not a function - JQuery load() not working
- .net-core - .NET Core 控制台在发布时包含特定文件夹
- istio - 如何在特殊应用程序上限制访问外部服务
- zsh - 如何去除 .zshrc 中的 $1 参数?
- list - 由于 URL 中的附加参数,无法获取 SP 列表