You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 12:06:06