技术提示:从 PDF 中提取页面
发布于 2009 年 7 月 14 日
有许多方法可以从 PDF 文件中提取一系列页面:可以使用 PDF 相关工具包来执行此操作,也可以直接使用 Ghostscript。
例如,使用以下命令从 100 页的 PDF 文件中提取第 22-36 页:pdftk:
$ pdftk A=100p-inputfile.pdf cat A22-36 output outfile_p22-p36.pdf
或者将 xpdf-utils (或 poppler-tools) 与 psutils 和ps2pdf命令(随 Ghostscript 一起发布)结合使用
$ pdftops 100p-inputfile.pdf - | psselect -p22-36 | \ ps2pdf14 - outfile_p22-p36.pdf
或者,直接使用 Ghostscript(与pdftk不同,几乎安装在任何地方;并且您已经在上一个命令中使用了它)
$ gs -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dSAFER \ -dFirstPage=22 -dLastPage=36 \ -sOutputFile=outfile_p22-p36.pdf 100p-inputfile.pdf
关于处理的速度和效率,更重要的是输出文件的质量,上述三种方法中第二种方法肯定是最差的。将原始 PDF 转换为 PostScript 再转换回 PDF(也称为“重炼” PDF)不太可能完全保留高级 PDF 功能(例如透明度信息、字体提示、叠印信息、颜色配置文件、陷印指令等)。
第三种方法仅使用 Ghostscript(无论如何第二种方法都会使用,因为ps2pdf14只不过是一个围绕更复杂 Ghostscript 命令行的包装脚本。 第三种方法还会按原样保留您页面上所有重要的 PDF 对象,而无需任何“往返”转换....
第三种方法的唯一缺点是它需要输入更长、更复杂的命令行。 但是,如果您将其保存为 bash 函数,则可以克服这一缺点。 只需将这些行放入您的~/.bashrc文件中
function pdfpextr() { # this function uses 3 arguments: # $1 is the first page of the range to extract # $2 is the last page of the range to extract # $3 is the input file # output file will be named "inputfile_pXX-pYY.pdf" gs -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dSAFER \ -dFirstPage=${1} \ -dLastPage=${2} \ -sOutputFile=${3%.pdf}_p${1}-p${2}.pdf \ ${3} }
现在您只需要输入(在启动新的 bash 副本或 sourcing .bashrc 之后)以下命令
$ pdfpextr 22 36 inputfile.pdf
这将导致文件inputfile_p22-p36.pdf与输入文件位于同一目录中。