我将处理单个PDF,每个PDF是通过“合并”多个PDF创建的。每个合并的PDF都有PDF部件开始以书签显示的位置。
有没有办法用脚本自动按书签将其拆分?
我们只有书签来指示部件,而不是页码,因此我们需要从书签中推断出页码。最好使用Linux工具。
您具有像pdf-split那样构建的程序可以为您做到这一点:
A-PDF拆分是一个非常简单,快速的桌面实用程序,可让您将任何Acrobat pdf文件拆分为较小的pdf文件。就如何拆分文件以及拆分后的输出文件如何唯一命名而言,它提供了完全的灵活性和用户控制。 A-PDF拆分为大文件的拆分提供了多种选择-按页,按书签和按奇数/偶数页。即使您可以提取或删除PDF文件的一部分。 A-PDF拆分还提供了高级定义的拆分,可以将其保存并随后导入以用于重复的文件拆分任务。 A-PDF Split代表了文件分割灵活性的最终选择,可以满足各种需求。
A-PDF拆分与受密码保护的pdf文件一起使用,并且可以将各种pdf安全功能应用于拆分的输出文件。如果需要,您可以使用实用程序(例如A-PDF Merger)将生成的拆分文件与其他pdf文件重新组合,以形成新的复合pdf文件。
A-PDF Split不需要Adobe Acrobat,并且可以生成与Adobe Acrobat Reader版本5及更高版本兼容的文档。
编辑*
如果您不想付款,还找到了免费的开源程序Here。
pdftk可用于拆分PDF文件并提取书签的页码。
要获取书签的页码,请执行>
pdftk in.pdf dump_data
并使您的脚本从输出中读取页码。
然后使用
pdftk in.pdf cat A-B output out_A-B.pdf
将页面从A到B放入out_A-B.pdf。
脚本可能是这样的:
#!/bin/bash
infile=$1 # input pdf
outputprefix=$2
[ -e "$infile" -a -n "$outputprefix" ] || exit 1 # Invalid args
pagenumbers=( $(pdftk "$infile" dump_data | \
grep '^BookmarkPageNumber: ' | cut -f2 -d' ' | uniq)
end )
for ((i=0; i < ${#pagenumbers[@]} - 1; ++i)); do
a=${pagenumbers[i]} # start page number
b=${pagenumbers[i+1]} # end page number
[ "$b" = "end" ] || b=$[b-1]
pdftk "$infile" cat $a-$b output "${outputprefix}"_$a-$b.pdf
done
[有一个用Java编写的名为Sejda的命令行工具,您可以在其中找到完全符合您的要求的splitbybookmarks
命令。它是Java,因此它可以在Linux上运行,并且作为命令行工具,您可以编写脚本来做到这一点。
这是我用于该任务的一个Perl小程序。 Perl并不特殊。它只是pdftk的包装器,以解释其dump_data
输出以将其转换为要提取的页码: