自动删除一堆PDF的最后一页


1

我有一个包含数百个PDF的文件夹,我想快速删除每个PDF的最后一页。如何让我的Mac自动执行此任务?我需要其他软件才能执行此操作吗?

Answers:


1

我使用Coherent PDF命令行工具社区版本完成了这项工作。

您可以下载预先构建的工具或源代码,以便自己编译后者,但后者需要在编译时安装OCaml。所以预先构建的工具是最简单的方法。下载的分发文件,例如cpdf-binaries-master.zip,包含Linux,OS X / macOS和Windows的二进制文件,大小约为5 MB。

一旦下载并解压(双击.zip文件),你会复制,如〜/下载/ CPDF-二进制主/ OSX英特尔/ CPDF文件,到在定义的位置PATH 环境变量,例如,/usr/local/bin/以使其在终端的命令行上全局可用。如果它不在PATH那时你必须使用可执行文件的完全限定路径名cpdf或者./cpdf它是否在当前工作目录(pwd)中。在终端中,键入echo $PATHso显示PATH

PDF文件有3页或更多页时删除最后一页的语法是:

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

PDF文件有2页时删除最后一页的语法是:

cpdf in.pdf 1 -o out.pdf

由于cpdf读取原始文件(in.pdf),并写入到一个新文件(out.pdf)的out.pdf文件名,如果需要保存在相同的位置是不同的in.pdf文件,或将其保存到不同的位置与同in.pdf文件名作为out.pdf文件名,或者任何out.pdf文件名你想要的。

下面,我将展示两个自动化示例,cpdf用于删除PDF文件的最后一页,假设它有两个或更多页面。其中使用的Automator 工作流作为服务的提供搜索服务上下文菜单和其他作为一个bash 脚本,在终端使用。


作为服务上下文菜单中的Finder中可用的Automator服务工作流:


在Automator中,使用如下图所示的设置创建新的服务工作流,并将图像下方的代码复制并粘贴到Run Shell Script 操作中,并保存为例如:从PDF中删除最后一页

要使用从PDF删除最后一页,在Finder中选择要删除从最后一页,然后选择PDF文件从PDF删除最后一个页面上下文菜单通过右键单击控制单击,或从搜索 > 服务 > 删除最后一页来自PDF

Automator服务工作流程


for f in "$@"; do
        # Get Page Count.
    p="$(/usr/local/bin/cpdf -info "$f" | awk '/Pages:/{print $2}')"
        # Get file extension.
    ext="${f##*.}"
        # Get filename without extension.
    fn="${f%.*}"
        # Rename original file to "filename (original).pdf".
        # Use '-n' to not overwrite an existing file.
    mv -n "$f" "${fn} (original).${ext}"
        # If page count is greater than 2, set 'p' to '3' as any
        # PDF with more than 2 pages the command will be the same.
    if [[ $p -gt 2 ]]; then
        p="3"
    fi
    case "$p" in
        3)
                # PDF file has 3 or more pages.
            /usr/local/bin/cpdf "${fn} (original).${ext}" 1-~2 -o "$f" 
            ;;
        2)
                # PDF file has 2 pages.
            /usr/local/bin/cpdf "${fn} (original).${ext}" 1 -o "$f"
            ;;
        1)
                # PDF file has 1 page. Make a copy to the
                # original name for consistency of output.
                # Use '-n' to not overwrite an existing file.
            cp -n "${fn} (original).${ext}" "$f"
            ;;      
    esac
        # If you don't want to keep the original
        # file, remove '#' from the next line.
    # rm "${fn} (original).${ext}"
done

注意,PATH通过一个运行shell脚本 行动的Automator是,/usr/bin:/bin:/usr/sbin:/sbin。所以代码上面是使用完全合格的路径名cpdf 可执行文件/usr/local/bin/cpdf因为这是在那里我把它,以便可以在终端通过使用其名称的方式cpdf,只。

另请注意,如果您不想保留原始文件,请在最后一行代码上方取消注释(删除#前面的from)# rm "${fn} (original).${ext}" 命令 done



作为在终端中使用的bash 脚本


以下列方式创建bash 脚本

在终端:

touch rlpfpdf
open rlpfpdf

代码块#!/bin/bash下面开始复制到打开的rlpfpdf文档中,然后保存。

回到航站楼:

使脚本可执行:

chmod u+x rlpfpdf

现在将rlpfpdf 脚本移动到,例如:/usr/local/bin/

sudo mv rlpfpdf /usr/local/bin/

然后,您可以将目录更改cd ...为包含要从中删除最后一页的PDF文件的目录,然后只需键入rlpfpdf并按enter

原始文件将被移动到“ 文件名(原始).pdf ”,而新创建的PDF文件没有最后一页,如果有2页或更多页,则将具有原始filename.pdf名称。


#!/bin/bash

for f in *.pdf *.PDF; do
    if [[ -f $f ]]; then
            # Get Page Count.
        p="$(cpdf -info "$f" | awk '/Pages:/{print $2}')"
            # Get file extension.
        ext="${f##*.}"
            # Get filename without extension.
        fn="${f%.*}"
            # Rename original file to "filename (original).pdf".
            # Use '-n' to not overwrite an existing file.
        mv -n "$f" "${fn} (original).${ext}"
            # If page count is greater than 2, set 'p' to '3' as any
            # PDF with more than 2 pages the command will be the same.
        if [[ $p -gt 2 ]]; then
            p="3"
        fi
        case "$p" in
            3)
                    # PDF file has 3 or more pages.
                cpdf "${fn} (original).${ext}" 1-~2 -o "$f" 
                ;;
            2)
                    # PDF file has 2 pages.
                cpdf "${fn} (original).${ext}" 1 -o "$f"
                ;;
            1)
                    # PDF file has 1 page. Make a copy to the
                    # original name for consistency of output.
                    # Use '-n' to not overwrite an existing file.
                cp -n "${fn} (original).${ext}" "$f"
                ;;      
        esac
            # If you don't want to keep the original
            #  file, remove '#' from the next line.
        # rm "${fn} (original).${ext}"
    fi
done

请注意,上面的代码假定cpdf 可执行文件位于环境变量中的目录中,例如:PATH /usr/local/bin/

另请注意,如果您不想保留原始文件,请在最后一行代码上方取消注释(删除#前面的from)# rm "${fn} (original).${ext}" 命令 done


我只有一个简单的询问。如何修改代码块以删除第一页而不是最后一页?
感兴趣的

@InterestedLearner,在下载的分发文件中,例如cpdf-binaries-master.zip,有cpdfmanual.pdf文件,在“1.2输入范围”下,从第2页开始,它讨论了这一点。删除第一页的语法是我对你的OP的回答中提供cpdf in.pdf 2-end out.pdf代码专门用于删除最后一页,你不能只是简单地使用2-end代替脚本1-~21脚本中编写代码。您必须重新编码以符合条件。如果您发布一个新问题,我会发布一个有利于这些条件的脚本
3439894 2017年


嘿,@ user3439894,非常好的回复。该语法cpdf in.pdf 1-~2 -o out.pdf现在也适用于2页文档。如果您能够相应地编辑答案,那就太棒了。这将简化脚本很多。
retrography
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.