我有一个包含数百个PDF的文件夹,我想快速删除每个PDF的最后一页。如何让我的Mac自动执行此任务?我需要其他软件才能执行此操作吗?
我有一个包含数百个PDF的文件夹,我想快速删除每个PDF的最后一页。如何让我的Mac自动执行此任务?我需要其他软件才能执行此操作吗?
Answers:
我使用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 $PATH
so显示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
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
cpdf in.pdf 2-end out.pdf
的代码专门用于删除最后一页,你不能只是简单地使用2-end
代替脚本1-~2
或1
在脚本中编写代码。您必须重新编码以符合条件。如果您发布一个新问题,我会发布一个有利于这些条件的脚本。
cpdf in.pdf 1-~2 -o out.pdf
现在也适用于2页文档。如果您能够相应地编辑答案,那就太棒了。这将简化脚本很多。