如何基于Job Separation(Patch Code)页面拆分PDF?附脚本实现
基于Patch Code拆分PDF的Bash脚本方案
我有一份包含Job Separation(又称Patch Code)页面的大型PDF文件,需要将其拆分为多个独立PDF,以Patch Code页面作为每个文件的结束标识。专业扫描软件大多支持基于这类特殊页面拆分输出,但我是通过文件共享或邮件接收扫描件,不想使用扫描客户端,因此想找简便的解决方案(比如Bash脚本)来完成拆分。试过ghostscript、pdftk、cpdf、tesseract等工具,均未发现直接支持Patch Code拆分的功能。
最终解决方案
试过各类工具后,我放弃寻找直接识别Patch Code的PDF工具,转而通过对扫描件执行OCR识别,根据Patch Code的位置完成PDF的拆分与合并,实现脚本如下:
# 先把单个PDF拆成单页PDF(使用pdftk) # 之后根据Patch Code页面,将多份单页PDF合并为完整文件 # 默认会生成pg_%04d.pdf格式的文件→比如pg_0001.pdf # 这里我们改为生成0001.pdf这类命名的单页文件 pdftk $fname burst output %04d.pdf # 创建数组,元素要么是单页PDF文件名"00XX.pdf",要么是标记"Patch-Code" declare -a PDFArray for i in 0* do # 对临时文件夹中的所有PDF执行OCR,"--sidecar"参数会生成对应文本文件存储识别内容 ocrmypdf -l deu "$i" "$i" --sidecar # 判断是否为Patch Code页面:文本文件大小为29字节,且包含"Patch Code"文本 if [[ "$(wc -c < "${i}.txt")" == 29 && "$(grep -c 'Patch Code' < "${i}.txt")" == 1 ]] ; then PDFArray+=(Patch-Code) else PDFArray+=("${i}") fi done # 在数组末尾添加一个Patch-Code标识,确保最后一组文件能被正确分割 PDFArray+=( Patch-Code ) # 处理数组内容,按Patch-Code标记分割为不同的文件组 PDFFiles=$(echo "${PDFArray[*]}" | perl -pe 's/ /''/g') echo "$PDFFiles" | perl -pe 's/Patch-Code/\n/g' | awk '!/^$/' | while read line do # 调试输出(可选) echo "line = $line" echo $line | xargs # 判断当前组的文件数量:如果只有一个文件,直接重命名;否则合并 # 合并后的文件命名规则为merge-组内首个文件名.pdf NumFields=$(echo $line | awk -F' ' "{ print NF }") if [[ $NumFields == 1 ]] ; then # xargs用于去除多余空格,可根据实际情况省略 mv $(echo $line | xargs) merge-"$line" else FirstElement=$( echo $line | awk '{print$1}' ) echo "FirstElement = $FirstElement" pdftk $(echo $line | xargs) cat output merge-"$FirstElement" fi done
内容的提问来源于stack exchange,提问作者Tim Haegele
相关产品推荐
相关产品推荐

