【问题标题】:Split PDF by multiple pages using PDFTK?使用 PDFTK 将 PDF 拆分为多个页面?
【发布时间】:2017-05-05 13:04:15
【问题描述】:

我发现很难说出这个问题,并且找不到我正在尝试做的在线解决方案。

我知道如何使用以下脚本使用 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 执行的东西。

我对替代方案/解决方法持开放态度,例如获取单个页面并在单次爆发后将它们组合成两个。

【问题讨论】:

    标签: powershell pdf merge split pdftk


    【解决方案1】:

    此 PowerShell 脚本将

    1. 使用pdftk获取页数
    2. 循环构建范围字符串的步骤
    3. 使用范围将页面提取到新的 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
    

    【讨论】:

    • 谢谢!它每 2 页拆分文档。出于好奇,是否可以对其进行修改以动态定义要拆分的页码?
    • 应该没问题,我会在一分钟内编辑答案。将 var $SetsOfPages 编辑为所需的大小。
    • 另外,一个小问题,我注意到如果原始 pdf 是奇数页,它看起来会丢弃最后一页。
    • 编辑了答案以正确处理悬垂 / 和可变的页面集。
    • 非常感谢!太棒了。你太棒了!
    【解决方案2】:

    你可以使用sejda-console,它在AGPLv3下开源,可以从项目GitHub页面下载。

    你可以使用splitbyevery这个命令

    每隔“n”页拆分给定的PDF文档,创建“n”个文档 每页。

    在您的情况下,命令行将类似于:

    sejda-console splitbyevery -n 2 -f /tmp/input_file.pdf -o /out_dir

    【讨论】:

    • 感谢您提供不同的选择。我会联系我的 IT 部门并进行调查。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我发现 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 运行它

      【讨论】:

        【解决方案5】:

        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 $2}'`
        while [  $COUNTER -lt $NUMBEROFPAGES ]; do
            pdftk $FILE cat $COUNTER-$(($COUNTER+1)) output out$COUNTER.pdf
            let COUNTER=COUNTER+2 
        done
        

        【讨论】:

          猜你喜欢
          • 2023-03-11
          • 1970-01-01
          • 2013-11-28
          • 2017-10-21
          • 2020-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多