【问题标题】:Remove the last page of a pdf file using PDFtk?使用 PDFtk 删除 pdf 文件的最后一页?
【发布时间】:2013-07-16 08:54:35
【问题描述】:

谁能告诉我如何使用 PDFtk 删除 PDF 文件的最后一页?

【问题讨论】:

    标签: linux pdf pdftk


    【解决方案1】:

    这将创建outfile.pdf,除了infile.pdf中的最后一页之外的所有页面

    pdftk infile.pdf cat 1-r2 output outfile.pdf
    

    参数说明

    • infile.pdf是原始pdf文件
    • cat是操作
    • 1-r2 是页面范围
      • 您可以通过在页码前面加上字母 r 来以相反的顺序引用页码。例如,page r1 是文档的最后一页,r2 是文档的倒数第二页,rend 是文档的第一页。您也可以在范围内使用此前缀,例如 r3-r1 是 PDF 的最后三页。

    • output 会将其输出到特定文件中
    • output.pdf 是输出的pdf文件

    更多示例在这里:https://www.pdflabs.com/docs/pdftk-cli-examples/

    【讨论】:

    • 如果您想删除多个页面,您可以更改范围,例如1-r3 只删除最后两页。
    • 也可以指定多个ranes,以空格分隔。例如:1-5 7-10 14-r2
    【解决方案2】:

    您需要找出页数,然后将其与 pdftk cat 函数一起使用,因为 (AFAICT) pdftk 不允许指定“从最后一个偏移量”。

    Poppler (http://poppler.freedesktop.org/) 的“pdfinfo”等工具可以提供此功能。

    将其封装在一些 bash 脚本中可以轻松地自动执行此过程:

    page_count=`pdfinfo "$INFILE" | grep 'Pages:' | awk '{print $2}'`
    page_count=$(( $page_count - 1 ))
    pdftk A="$INFILE" cat A1-$page_count output "$OUTFILE"
    

    显然,添加参数、错误检查等也可以放在所述脚本中:

    #! /bin/sh
    
    ### Path to the PDF Toolkit executable 'pdftk'
    pdftk='/usr/bin/pdftk'
    pdfinfo='/usr/bin/pdfinfo'
    
    
    ####################################################################
    script=`basename "$0"`
    
    
    ### Script help
    if [ "$1" = "" ] || [ "$1" = "-h" ] || [ "$1" = "--help" ] || [ "$1" = "-?" ] || [ "$1" = "/?" ]; then
        echo "$script: <input-file.PDF> [<output-file.PDF>]"
        echo "    Removes the last page from the PDF, overwriting the source"
        echo "    if no output filename is given"
        exit 1
    fi
    
    ### Check we have pdftk available
    if [ ! -x "$pdftk" ] || [ ! -x "$pdfinfo" ]; then
        echo "$script: The PDF Toolkit and/or Poppler doesn't seem to be installed"
        echo "    (was looking for the [$pdftk] and [$pdfinfo] executables)"
        exit 2
    fi
    
    ### Check our input is OK
    INFILE="$1"
    if [ ! -r "$INFILE" ]; then
        echo "$script: Failed to read [$INFILE]"
        exit 2
    fi
    
    OUTFILE="$2"
    if [ "$OUTFILE" = "" ]; then
        echo "$script: Will overwrite [$INFILE] if processing is ok"
    fi
    
    timestamp=`date +"%Y%m%d-%H%M%S"`
    tmpfile="/tmp/$script.$timestamp"
    
    page_count=`$pdfinfo "$INFILE" | grep 'Pages:' | awk '{print $2}'`
    page_count=$(( $page_count - 1 ))
    
    ### Do the deed!
    $pdftk A="$INFILE" cat A1-$page_count output "$tmpfile"
    
    ### Was it good for you?
    if [ $? -eq 0 ]; then
        echo "$script: PDF Toolkit says all is good"
        if [ "$OUTFILE" = "" ]; then
            echo "$script: Overwriting [$INFILE]"
            cp -f "$tmpfile" "$INFILE"
        else
            echo "$script: Creating [$OUTFILE]"
            cp -f "$tmpfile" "$OUTFILE"
        fi
    fi
    
    
    ### Clean Up
    if [ -f "$tmpfile" ]; then
        rm -f "$tmpfile"
    fi
    

    【讨论】:

    • 可以修改 awk 命令以进行减量,从而在一定程度上简化脚本:grep Pages | awk '{ printf("%d",$2 - 1); }' 这使得 $(( $page_count - 1 )) 变得多余。
    • 实际上不需要pdfinfopdftkdump_data 子命令提供页数:它产生一行NumberOfPages: 8
    • 另外请记住,您不需要知道页数即可删除最后一页(至少对于 pdftk 版本 1.45 及更高版本)。您可以使用1-r2 指示从第一页到倒数第二页。请参阅pdftk 文档,其中包含以下内容:您可以通过在页码前面加上字母 r 来以相反的顺序引用页码。例如,page r1 是文档的最后一页,r2 是文档的倒数第二页,rend 是文档的第一页。您也可以在范围内使用此前缀,例如 r3-r1 是 PDF 的最后三页。
    【解决方案3】:

    使用cpdf,您可以使用波浪号以及开头来引用页面与文档末尾的距离。

    所以,我们可以做

    cpdf in.pdf 1-~2 -o out.pdf
    

    【讨论】:

    • 感谢您创建这样的工具。像魔术一样工作。我唯一希望的是:未指定输出文件,“in.pdf”文件会自动重命名(例如,“in_1--2.pdf”)
    • 我还想重申这是多么令人难以置信的套件!修剪前几页或最后几页(或其他任何内容)非常容易。甚至该软件的分发也是完美的,它由一个静态二进制文件组成(适用于 Linux 32、Linux 64、OSX 和 Windows)。它还包括出色的 PDF 文档。我很惊讶以前从未遇到过该软件,也许是因为它不是开源的(据我了解,仅免费用于非商业用途)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2012-02-27
    相关资源
    最近更新 更多