如何使用cpdf将PDF拆分为多页重叠文档?
我来帮你一步步解决这个问题~
首先,你遇到的Bad rectangle specification a4portrait错误,是因为cpdf的-mediabox参数需要的是具体的矩形坐标数值(格式为x1 y1 x2 y2),而不能直接用a4portrait这种别名。如果要设置A4纵向的尺寸,你可以用A4的标准点值(1点=1/72英寸),A4纵向的MediaBox是0 0 595 842,对应的正确命令是:
cpdf -mediabox 0 0 595 842 mypdf.pdf -o out.pdf
不过这个命令只是修改页面尺寸,还没实现拆分长页为多页带重叠的效果,我们继续往下说。
第一步:获取原PDF的页面尺寸
你完全可以用cpdf本身来获取原文档的页面尺寸,不需要额外工具。执行以下命令:
cpdf -mediabox mypdf.pdf
执行后会输出类似MediaBox: 0 0 595 1684的结果,最后两个数字就是页面的宽度和高度(比如这个例子里宽度是595,高度是1684,相当于两个A4纵向的高度)。
第二步:计算分页参数
假设你想要每页是A4纵向(高度842),并且每页之间保留一定的重叠量(比如50点,这个数值可以根据你的需求调整),可以用下面的逻辑计算总页数:
总页数 = 向上取整( (原文档高度 - 重叠量) / (单页高度 - 重叠量) )
简单来说,就是让每一页的起始位置比上一页的结束位置提前一个重叠量,确保内容衔接自然。
第三步:批量裁剪并合并成多页PDF
我们可以用脚本循环生成每一页的裁剪区域,再合并成最终的PDF。以bash脚本为例:
# 获取原PDF的高度(假设原文档只有1页) ORIG_HEIGHT=$(cpdf -mediabox mypdf.pdf | grep -oE '[0-9]+$') # 定义A4纵向高度和重叠量 A4_HEIGHT=842 OVERLAP=50 # 计算需要拆分的总页数 PAGES=$(( (ORIG_HEIGHT - OVERLAP + A4_HEIGHT - OVERLAP - 1) / (A4_HEIGHT - OVERLAP) )) # 循环生成每一页的裁剪PDF for ((i=0; i<PAGES; i++)); do START_Y=$(( i*(A4_HEIGHT - OVERLAP) )) END_Y=$(( START_Y + A4_HEIGHT )) # 如果结束位置超过原文档高度,就用原高度作为结束 if [ $END_Y -gt $ORIG_HEIGHT ]; then END_Y=$ORIG_HEIGHT fi # 裁剪对应区域并保存单页PDF cpdf -crop "0 $START_Y 595 $END_Y" mypdf.pdf -o page_$((i+1)).pdf done # 将所有单页PDF合并成最终的多页文档 cpdf page_*.pdf -o final_split.pdf
执行这个脚本后,你就能得到一个拆分完成、带指定重叠量的多页PDF了。
总结一下:全程用cpdf就可以完成,不需要额外工具,核心是先获取原文档尺寸,再通过裁剪命令批量生成带重叠的页面,最后合并即可。
备注:内容来源于stack exchange,提问作者halloleo

