使用 PDFTK 将 PDF 拆分为多页?
Split PDF by multiple pages using PDFTK?
我发现很难用措词来表达这个问题,并且找不到针对我正在尝试做的事情的在线解决方案。
我知道如何使用以下脚本使用 PDFTK 将大型 PDF 拆分为单个 页:
pdftk your_file.pdf burst output your_directory/page_%02d.pdf
但现在我想将 PDF 按每个 other 页拆分,以便每个新 PDF 都有两 (2) 页(例如,第 1 + 2 页在一起,第 3 + 页4 在一起,5 + 6,等等)。
我知道 Acrobat 做得很出色,但是我需要一些可以从 Powershell 执行的东西。
我对alternatives/workarounds持开放态度,喜欢将单个页面在单张爆裂后由两张合并。
您可以使用 cat 关键字从所需页面生成文件。
pdftk in.pdf cat 1-2 output out1.pdf
pdftk in.pdf cat 3-4 output out2.pdf
可以添加一个bash脚本以便于使用:
#!/bin/bash
COUNTER=0
while [ $COUNTER -lt $NUMBEROFPAGES ]; do
pdftk in.pdf cat $COUNTER-$COUNTER+1 output out1.pdf
let COUNTER=COUNTER+2
done
此 PowerShell 脚本将
- 使用pdftk获取页数
- 循环构建范围字符串
- 使用范围将页面提取到新的 pdf 中,并在基本名称上附加范围(并存储在同一文件夹中)。
更改前两个变量以适应您的环境。
## Q:\Test17\Split-Pdf.ps1
$pdfPath = 'Q:\Test17\'
$pdfFile = Join-Path $pdfPath "test.pdf"
$SetsOfPages = 3
$Match = 'NumberOfPages: (\d+)'
$NumberOfPages = [regex]::match((pdftk $pdfFile dump_data),$Match).Groups[1].Value
"{0,2} pages in {1}" -f $NumberOfPages, $pdfFile
for ($Page=1;$Page -le $NumberOfPages;$Page+=$SetsOfPages){
$File = Get-Item $pdfFile
$Range = "{0}-{1}" -f $page,[math]::min($Page+$SetsOfPages-1,$NumberOfPages)
$OutFile = Join-Path $pdfPath ($File.BaseName+"_$Range.pdf")
"processing: {0}" -f $OutFile
pdftk $pdfFile cat $Range output $OutFile
}
编辑 以处理可变页面集并正确处理悬垂。
再次编辑: 找到了一种更简单的方法来缩短最后一组页面。
示例输出
> .\Split-Pdf.ps1
10 pages in Q:\Test17\test.pdf
processing: Q:\Test17\test_1-3.pdf
processing: Q:\Test17\test_4-6.pdf
processing: Q:\Test17\test_7-9.pdf
processing: Q:\Test17\test_10-10.pdf
您可以使用 sejda-console
,它在 AGPLv3 and can be downloaded from the project GitHub 页面下是开源的。
您可以使用 splitbyevery
命令
Splits a given PDF document every 'n' pages creating documents of 'n'
pages each.
在你的情况下,命令行将类似于:
sejda-console splitbyevery -n 2 -f /tmp/input_file.pdf -o /out_dir
我发现 Szakacs Peter 的解决方案非常棒,但 bash 脚本需要进行三处调整: 从 $COUNTER
开始,以便它指向 pdf 的第一页;在第四行添加双括号,以便 (($COUNTER+1))
计算;另一个 $COUNTER
使输出文件名唯一。
为我解决这个问题的最终 bash 脚本是:
#!/bin/bash
COUNTER=1
while [ $COUNTER -lt $NUMBEROFPAGES ]; do
pdftk in.pdf cat $COUNTER-$(($COUNTER+1)) output out$COUNTER.pdf
let COUNTER=COUNTER+2
done
然后将其另存为 burst2page.sh
,执行 chmod u+x burst2page.sh
使其可执行,然后 运行 使用 ./burst2page.sh
Brad Smith 的剧本很好,但在那种形式下行不通。当您没有定义 $NUMBEROFPAGES 时,脚本会抛出一个错误 script.sh: line 3: [: 1: unary operator expected
。我建议将其更改为:
#!/bin/bash
FILE='in.pdf'
COUNTER=1
NUMBEROFPAGES=`pdftk $FILE dump_data |grep NumberOfPages | awk '{print }'`
while [ $COUNTER -lt $NUMBEROFPAGES ]; do
pdftk $FILE cat $COUNTER-$(($COUNTER+1)) output out$COUNTER.pdf
let COUNTER=COUNTER+2
done
按任意页数拆分(作为第二个参数):
例如<script_filename>.sh <filename.pdf> <num_pages_per_output_file>
#!/bin/bash
FILE=""
SPAN=${2:-2}
SPAN_LESS_1=$((SPAN - 1))
COUNTER=1
NUMBEROFPAGES=`pdftk $FILE dump_data |grep NumberOfPages | awk '{print }'`
while [ $COUNTER -lt $NUMBEROFPAGES ]; do
CANDIDATE_END=$(($COUNTER+$SPAN_LESS_1))
END=$(($CANDIDATE_END<$NUMBEROFPAGES ? $CANDIDATE_END : $NUMBEROFPAGES))
OUT_NAME="${FILE%.*}__${COUNTER}-${END}.pdf"
pdftk $FILE cat $COUNTER-$END output ${OUT_NAME}
let COUNTER=COUNTER+SPAN
done
此外,输出文件名将在输入文件名后附加起始页码和结束页码,例如
<input_filename>__1-15.pdf
<input_filename>__16-30.pdf
...
我发现很难用措词来表达这个问题,并且找不到针对我正在尝试做的事情的在线解决方案。
我知道如何使用以下脚本使用 PDFTK 将大型 PDF 拆分为单个 页:
pdftk your_file.pdf burst output your_directory/page_%02d.pdf
但现在我想将 PDF 按每个 other 页拆分,以便每个新 PDF 都有两 (2) 页(例如,第 1 + 2 页在一起,第 3 + 页4 在一起,5 + 6,等等)。
我知道 Acrobat 做得很出色,但是我需要一些可以从 Powershell 执行的东西。
我对alternatives/workarounds持开放态度,喜欢将单个页面在单张爆裂后由两张合并。
您可以使用 cat 关键字从所需页面生成文件。
pdftk in.pdf cat 1-2 output out1.pdf
pdftk in.pdf cat 3-4 output out2.pdf
可以添加一个bash脚本以便于使用:
#!/bin/bash
COUNTER=0
while [ $COUNTER -lt $NUMBEROFPAGES ]; do
pdftk in.pdf cat $COUNTER-$COUNTER+1 output out1.pdf
let COUNTER=COUNTER+2
done
此 PowerShell 脚本将
- 使用pdftk获取页数
- 循环构建范围字符串
- 使用范围将页面提取到新的 pdf 中,并在基本名称上附加范围(并存储在同一文件夹中)。
更改前两个变量以适应您的环境。
## Q:\Test17\Split-Pdf.ps1
$pdfPath = 'Q:\Test17\'
$pdfFile = Join-Path $pdfPath "test.pdf"
$SetsOfPages = 3
$Match = 'NumberOfPages: (\d+)'
$NumberOfPages = [regex]::match((pdftk $pdfFile dump_data),$Match).Groups[1].Value
"{0,2} pages in {1}" -f $NumberOfPages, $pdfFile
for ($Page=1;$Page -le $NumberOfPages;$Page+=$SetsOfPages){
$File = Get-Item $pdfFile
$Range = "{0}-{1}" -f $page,[math]::min($Page+$SetsOfPages-1,$NumberOfPages)
$OutFile = Join-Path $pdfPath ($File.BaseName+"_$Range.pdf")
"processing: {0}" -f $OutFile
pdftk $pdfFile cat $Range output $OutFile
}
编辑 以处理可变页面集并正确处理悬垂。
再次编辑: 找到了一种更简单的方法来缩短最后一组页面。
示例输出
> .\Split-Pdf.ps1
10 pages in Q:\Test17\test.pdf
processing: Q:\Test17\test_1-3.pdf
processing: Q:\Test17\test_4-6.pdf
processing: Q:\Test17\test_7-9.pdf
processing: Q:\Test17\test_10-10.pdf
您可以使用 sejda-console
,它在 AGPLv3 and can be downloaded from the project GitHub 页面下是开源的。
您可以使用 splitbyevery
命令
Splits a given PDF document every 'n' pages creating documents of 'n' pages each.
在你的情况下,命令行将类似于:
sejda-console splitbyevery -n 2 -f /tmp/input_file.pdf -o /out_dir
我发现 Szakacs Peter 的解决方案非常棒,但 bash 脚本需要进行三处调整: 从 $COUNTER
开始,以便它指向 pdf 的第一页;在第四行添加双括号,以便 (($COUNTER+1))
计算;另一个 $COUNTER
使输出文件名唯一。
为我解决这个问题的最终 bash 脚本是:
#!/bin/bash
COUNTER=1
while [ $COUNTER -lt $NUMBEROFPAGES ]; do
pdftk in.pdf cat $COUNTER-$(($COUNTER+1)) output out$COUNTER.pdf
let COUNTER=COUNTER+2
done
然后将其另存为 burst2page.sh
,执行 chmod u+x burst2page.sh
使其可执行,然后 运行 使用 ./burst2page.sh
Brad Smith 的剧本很好,但在那种形式下行不通。当您没有定义 $NUMBEROFPAGES 时,脚本会抛出一个错误 script.sh: line 3: [: 1: unary operator expected
。我建议将其更改为:
#!/bin/bash
FILE='in.pdf'
COUNTER=1
NUMBEROFPAGES=`pdftk $FILE dump_data |grep NumberOfPages | awk '{print }'`
while [ $COUNTER -lt $NUMBEROFPAGES ]; do
pdftk $FILE cat $COUNTER-$(($COUNTER+1)) output out$COUNTER.pdf
let COUNTER=COUNTER+2
done
按任意页数拆分(作为第二个参数):
例如<script_filename>.sh <filename.pdf> <num_pages_per_output_file>
#!/bin/bash
FILE=""
SPAN=${2:-2}
SPAN_LESS_1=$((SPAN - 1))
COUNTER=1
NUMBEROFPAGES=`pdftk $FILE dump_data |grep NumberOfPages | awk '{print }'`
while [ $COUNTER -lt $NUMBEROFPAGES ]; do
CANDIDATE_END=$(($COUNTER+$SPAN_LESS_1))
END=$(($CANDIDATE_END<$NUMBEROFPAGES ? $CANDIDATE_END : $NUMBEROFPAGES))
OUT_NAME="${FILE%.*}__${COUNTER}-${END}.pdf"
pdftk $FILE cat $COUNTER-$END output ${OUT_NAME}
let COUNTER=COUNTER+SPAN
done
此外,输出文件名将在输入文件名后附加起始页码和结束页码,例如
<input_filename>__1-15.pdf
<input_filename>__16-30.pdf
...