ImageMagick将tiff转换为带有顺序文件后缀的pdf

时间:2016-10-15 21:30:45

标签: bash pdf imagemagick tiff imagemagick-convert

我有以下场景,而且我的编码器并不多(我也不太了解bash)。我甚至没有基础工作的bash脚本可以分享,所以任何帮助都会受到赞赏。

我有一个文件共享,其中包含文件管理系统的tiff(数千个)。目标是将多个文件tiff转换并组合成单个文件pdf(最好是PDF / A 1a格式)。

目录格式:

/Document Management Root     # This is root directory
 ./2009/                      # each subdirectory represents a year
 ./2010/
 ./2011/
 ....
 ./2016/
 ./2016/000009.001            
 ./2016/000010.001
              # files are stored flat - just thousands of files per year directory

文档管理系统存储带有序列号文件名的tiff以及顺序文件后缀:

000009.001
000010.001
000011.002
000012.003
000013.001

文档的每个页面都由后缀表示。创建新的非相关文档时,后缀将重新启动。在上面的示例中,000009.001是单页tiff。文件000010.001000011.002000012.003属于同一文档(即页面都相关)。文件000013.001代表新文档。

我需要保留多页文档的第一个文件的文件名,以便文件名可以与文档管理系统数据库交叉引用以获取元数据。

我提出的伪代码是:

for each file in {tiff directory}
    while file extension is "001"
      convert file to pdf and place new pdf file in {pdf directory}
    else 
      convert multiple files to pdf and place new pd file in {pdf  directory}

但是,无论下一个文件是什么,这似乎都会产生转换所有001文件的副作用。

非常感谢任何帮助。

编辑 - 以下两个答案都有效。第二个答案有效,但是我没有意识到我测试过的数据集与上面的情况不同,这是我的错误。

2 个答案:

答案 0 :(得分:2)

因此,请将以下脚本保存在您的登录($ HOME)目录中TIFF2PDF

#!/bin/bash
ls *[0-9] | awk -F'.' '
   /001$/ { if(NR>1)print cmd,outfile; outfile=$1 ".pdf"; cmd="convert " $0;next}
          { cmd=cmd " " $0}
   END    { print cmd,outfile}'

通过进入终端并运行:

使其可执行(仅需一次)
chmod +x TIFF2PDF    

然后将任何给定年份的一些文档复制到临时目录中进行尝试...然后转到目录并运行:

~/TIFF2PDF

示例输出

convert 000009.001 000009.pdf
convert 000010.001 000011.002 000012.003 000010.pdf
convert 000013.001 000013.pdf

如果看起来正确,你可以实际执行这样的命令:

~/TIFF2PDF | bash

或者,最好安装 GNU Parallel

~/TIFF2PDF | parallel

脚本说... “生成名称以数字结尾的所有文件的列表,并将该列表发送到awk。在awk中,使用点作为两者之间的分隔符字段,因此如果文件名为00011.0002,则$0将为00011.0002$1将为00011$2将为0002 1}}。现在,如果文件名以0001结尾,则打印累积的命令并附加输出文件名。然后保存带有PDF扩展名的文件名前缀作为下一个PDF的输出文件名并开始构建下一个 ImageMagick convert命令。在后续行(不以0001结尾)中,将文件名添加到文件列表中以包含在{{1最后,输出任何累积的命令并附加输出文件名。“

关于图像底部的丑陋黑​​色块,它的发生是因为那里有一些微小的白色斑点阻止ImageMagick移除黑色区域。我把它们用红色圈起来了:

enter image description here

如果您将图片模糊一点(以扩散斑点)然后获得修剪框的大小,您可以将其应用于原始的,不显眼的图像,如下所示:

PDF

enter image description here

我建议您先对所有图像进行复制,然后再运行PDF转换。由于您需要保存TIFF文件但扩展名为trimbox=$(convert original.tif -blur x2 -bordercolor black -border 1 -fuzz 50% -format %@ info:) convert original.tif -crop $trimbox result.tif 0001,因此您需要告诉 ImageMagick 修剪并强制输出文件类型为TIF:

0002

作为@AlexP。提到,如果有大量文件,可能会出现globbing问题。在OSX上,ARG_MAX非常高(262144)并且您的文件名大约为10个字符,因此如果一个目录中有超过26,000个文件,则可能遇到问题。如果是这种情况,只需更改:

original=XYZ.001
trimbox=$(convert $original -blur x2 -bordercolor black -border 1 -fuzz 50% -format %@ info:)
convert $original -crop $trimbox TIF:$original

ls *[0-9] | awk ...

答案 1 :(得分:1)

以下命令将转换整个/Document Management Root树(假设它是实际的绝对路径)正确处理所有子文件夹,即使名称包含空格字符并正确跳过所有其他不匹配000000.000命名模式的文件:

find '/Document Management Root' -type f -regextype sed -regex '.*/[0-9]\{6\}.001$' -exec bash -c 'p="{}"; d="${p:0: -10}"; n=${p: -10:6}; m=10#$n; c[1]="$d$n.001"; for i in {2..999}; do k=$((m+i-1)); l=$(printf "%s%06d.%03d" "$d" $k $i); [[ -f "$l" ]] || break; c[$i]="$l"; done; echo -n "convert"; printf " %q" "${c[@]}" "$d$n.pdf"; echo' \; | bash

要进行干运行,请最后删除| bash

已更新以匹配00000000.000模式(为清晰起见,拆分为多行):

find '/Document Management Root' -type f -regextype sed -regex '.*/[0-9]\{8\}.001$' -exec bash -c '
  pages[1]="{}"
  p1num="10#${pages[1]: -12:8}"
  for i in {2..999}; do
    nextpage=$(printf "%s%08d.%03d" "${pages[1]:0: -12}" $((p1num+i-1)) $i)
    [[ -f "$nextpage" ]] || break
    pages[i]="$nextpage"
  done
  echo -n "convert"
  printf " %q" "${pages[@]}" "${pages[1]:0: -3}pdf"
  echo
' \; | bash