powershell 使用PDFTK将PDF拆分为多个页面?

rsaldnfx  于 12个月前  发布在  Shell
关注(0)|答案(6)|浏览(204)

我发现这个问题很难措辞,也找不到一个在线解决方案。
我知道如何使用PDFTK使用以下脚本将大型PDF拆分为 * 单个 * 页面:

pdftk your_file.pdf burst output your_directory/page_%02d.pdf

字符串
但是现在我想每隔一页拆分PDF,这样每个新的PDF都有两(2)页(例如1 + 2页在一起,3 + 4页在一起,5 + 6页等)。
我知道这就像一个冠军,但我需要一些我可以从PowerShell执行。
我对替代方案/变通方案持开放态度,比如在单次爆发后将单页合并为两页。

mo49yndu

mo49yndu1#

这个PowerShell脚本将
1.使用pdftk获取页面数
1.在构建范围字符串的步骤中循环
1.使用范围提取到一个新的PDF与附加范围的基本名称(并存储在同一个文件夹)的页面。
更改前两个变量以适应您的环境。

## Q:\Test\2017\05\06\Split-Pdf.ps1
$pdfPath = 'Q:\Test\2017\05\06\'
$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:\Test\2017\05\06\test.pdf
processing: Q:\Test\2017\05\06\test_1-3.pdf
processing: Q:\Test\2017\05\06\test_4-6.pdf
processing: Q:\Test\2017\05\06\test_7-9.pdf
processing: Q:\Test\2017\05\06\test_10-10.pdf

drnojrws

drnojrws2#

你可以使用sejda-console,它是在AGPLv3下开源的,可以从GitHub项目页面下载。
您可以使用splitbyevery命令,
每隔'n'页拆分一个给定的PDF文档,创建每个'n'页的文档。
在这种情况下,命令行将类似于:
sejda-console splitbyevery -n 2 -f /tmp/input_file.pdf -o /out_dir

rqenqsqc

rqenqsqc3#

您可以使用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

kcwpcxri

kcwpcxri4#

我发现Szakacs Peter的解决方案很棒,但bash脚本需要三个调整:从1开始$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运行它

xtfmy6hx

xtfmy6hx5#

按任意页数拆分(作为第二个参数):例如<script_filename>.sh <filename.pdf> <num_pages_per_output_file>

#!/bin/bash 
FILE="${1}"
SPAN=${2:-2}
SPAN_LESS_1=$((SPAN - 1))
COUNTER=1
NUMBEROFPAGES=`pdftk $FILE dump_data |grep NumberOfPages | awk '{print $2}'`
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
...

y3bcpkx1

y3bcpkx16#

布拉德史密斯的脚本是好的,但它不会在这种形式下工作。当你没有定义$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 $2}'`
NUMBEROFPAGES="${NUMBEROFPAGES//[$'\t\r\n ']}" #to strip possible white characters
while [  $COUNTER -lt $NUMBEROFPAGES ]; do
    pdftk $FILE cat $COUNTER-$(($COUNTER+1)) output out$COUNTER.pdf
    let COUNTER=COUNTER+2 
done

字符串

相关问题