如何提取页面范围/ PDF的一部分?


423

您是否知道如何提取PDF文档的一部分并将其另存为PDF?在OS X上,通过使用Preview绝对是微不足道的。我尝试了PDF编辑器和其他程序,但无济于事。

我想要一个程序,在该程序中选择所需的部分,然后在OS X上使用诸如CMD+ 的简单命令将其另存为pdf N。我希望提取的部分以PDF格式而不是jpeg等格式保存。


您尝试过ImageMagick吗?
马丁·施罗德

3
那是位图,我需要另存为PDF!
user72469 2012年

3
pdfshuffler在回购中。
2014年

2
pdfshuffler在Ubuntu 14.04+中不再起作用。您始终可以使用打印对话框或基于终端的替代方法,例如pdfseparate
Rho

@Rho直接通过安装的版本apt-get在16.04中仍然可以正常工作。也许他们修复了错误,如果有的话?
xji

Answers:


476

pdftk是用于这项工作的有用的多平台工具(pdftk主页)。

pdftk full-pdf.pdf cat 12-15 output outfile_p12-15.pdf

您传递主pdf的文件名,然后告诉它仅包含某些页面(在此示例中为12-15),然后将其输出到新文件。


6
如果要提取第1-10、15和17页,该如何编写命令?
李彦宏

31
@PatrickLipdftk A=in.pdf cat A1-10 A15 A17 output out.pdf
m8mble

9
请注意,pdftk在Ubuntu 18.04中不可用。(见askubuntu.com/questions/1028522/...
alkamid

6
@alkamid它是:sudo snap install pdftk
Qubix

12
虽然pdftk肯定是可以完成这项工作的工具,但我还是建议不要这样做。这不是免费软件,而是笨拙的共享软件。它还需要JVM。如另一个答案中qpdf建议的那样,是一种更合理的工具。
左右约

244

非常简单,请使用默认的PDF阅读器:

打印为文件。这就对了! 打印菜单

然后

设置新的PDF


12
图钉辉煌
andybleaden

17
使用投影仪文件,地图和任何其他与打印机页面格式不符的文档产生灾难性的结果。
路易斯·德索萨

11
这可能导致文件的大小比原始文档大得多。
dat 2015年

7
因此它不会“提取”页面范围。它会根据旧的pdf文件创建新的pdf文件,就像您使用的是高清打印机/扫描仪对一样。
sylvainulg'8

6
适用于简单的情况,但带有突出显示注释的文档会产生不良结果:突出显示变为100%不透明并阻塞了文本。
love.by.Jesus '16

79

页面范围-Nautilus脚本


总览

我根据链接到的@ThiagoPonte教程创建了一个稍微高级的脚本。其主要特点是

  • 它是基于GUI的
  • 与文件名中的空格兼容,
  • 并基于三个能够保留原始文件所有属性的后端

屏幕截图

在此处输入图片说明

#!/bin/bash
#
# TITLE:        PDFextract
#
# AUTHOR:       (c) 2013-2015 Glutanimate (https://github.com/Glutanimate)
#
# VERSION:      0.2
#
# LICENSE:      GNU GPL v3 (http://www.gnu.org/licenses/gpl.html)
# 
# OVERVIEW:     PDFextract is a simple PDF extraction script based on Ghostscript/qpdf/cpdf.
#               It provides a simple way to extract a page range from a PDF document and is meant
#               to be used as a file manager script/addon (e.g. Nautilus script).
#
# FEATURES:     - simple GUI based on YAD, an advanced Zenity fork.
#               - preserves _all_ attributes of your original PDF file and does not compress 
#                 embedded images further than they are.      
#               - can choose from three different backends: ghostscript, qpdf, cpdf
#
# DEPENDENCIES: ghostscript/qpdf/cpdf poppler-utils yad libnotify-bin
#                         
#               You need to install at least one of the three backends supported by this script.
#
#               - ghostscript, qpdf, poppler-utils, and libnotify-bin are available via 
#                 the standard Ubuntu repositories
#               - cpdf is a commercial CLI PDF toolkit that is free for personal use.
#                 It can be downloaded here: https://github.com/coherentgraphics/cpdf-binaries
#               - yad can be installed from the webupd8 PPA with the following command:
#                 sudo add-apt-repository ppa:webupd8team/y-ppa-manager && apt-get update && apt-get install yad
#
# NOTES:        Here is a quick comparison of the advantages and disadvantages of each backend:
#
#                               speed     metadata preservation     content preservation        license
#               ghostscript:     --               ++                         ++               open-source
#               cpdf:             -               ++                         ++               proprietary
#               qpdf:            ++                +                         ++               open-source
#
#               Results might vary depending on the document and the version of the tool in question.
#
# INSTALLATION: https://askubuntu.com/a/236415
#
# This script was inspired by Kurt Pfeifle's PDF extraction script 
# (http://www.linuxjournal.com/content/tech-tip-extract-pages-pdf)
#
# Originally posted on askubuntu
# (https://askubuntu.com/a/282453)

# Variables

DOCUMENT="$1"
BACKENDSELECTION="^qpdf!ghostscript!cpdf"

# Functions

check_input(){
  if [[ -z "$1" ]]; then
    notify "Error: No input file selected."
    exit 1
  elif [[ ! "$(file -ib "$1")" == *application/pdf* ]]; then
    notify "Error: Not a valid PDF file."
    exit 1
  fi
}

check_deps () {
  for i in "$@"; do
    type "$i" > /dev/null 2>&1 
    if [[ "$?" != "0" ]]; then
      MissingDeps+="$i"
    fi
  done
}

ghostscriptextract(){
  gs -dFirstPage="$STARTPAGE "-dLastPage="$STOPPAGE" -sOutputFile="$OUTFILE" -dSAFER -dNOPAUSE -dBATCH -dPDFSETTING=/default -sDEVICE=pdfwrite -dCompressFonts=true -c \
  ".setpdfwrite << /EncodeColorImages true /DownsampleMonoImages false /SubsetFonts true /ASCII85EncodePages false /DefaultRenderingIntent /Default /ColorConversionStrategy \
  /LeaveColorUnchanged /MonoImageDownsampleThreshold 1.5 /ColorACSImageDict << /VSamples [ 1 1 1 1 ] /HSamples [ 1 1 1 1 ] /QFactor 0.4 /Blend 1 >> /GrayACSImageDict \
  << /VSamples [ 1 1 1 1 ] /HSamples [ 1 1 1 1 ] /QFactor 0.4 /Blend 1 >> /PreserveOverprintSettings false /MonoImageResolution 300 /MonoImageFilter /FlateEncode \
  /GrayImageResolution 300 /LockDistillerParams false /EncodeGrayImages true /MaxSubsetPCT 100 /GrayImageDict << /VSamples [ 1 1 1 1 ] /HSamples [ 1 1 1 1 ] /QFactor \
  0.4 /Blend 1 >> /ColorImageFilter /FlateEncode /EmbedAllFonts true /UCRandBGInfo /Remove /AutoRotatePages /PageByPage /ColorImageResolution 300 /ColorImageDict << \
  /VSamples [ 1 1 1 1 ] /HSamples [ 1 1 1 1 ] /QFactor 0.4 /Blend 1 >> /CompatibilityLevel 1.7 /EncodeMonoImages true /GrayImageDownsampleThreshold 1.5 \
  /AutoFilterGrayImages false /GrayImageFilter /FlateEncode /DownsampleGrayImages false /AutoFilterColorImages false /DownsampleColorImages false /CompressPages true \
  /ColorImageDownsampleThreshold 1.5 /PreserveHalftoneInfo false >> setdistillerparams" -f "$DOCUMENT"
}

cpdfextract(){
  cpdf "$DOCUMENT" "$STARTPAGE-$STOPPAGE" -o "$OUTFILE"
}

qpdfextract(){
  qpdf --linearize "$DOCUMENT" --pages "$DOCUMENT" "$STARTPAGE-$STOPPAGE" -- "$OUTFILE"
  echo "$OUTFILE"
  return 0 # even benign qpdf warnings produce error codes, so we suppress them
}

notify(){
  echo "$1"
  notify-send -i application-pdf "PDFextract" "$1"
}

dialog_warning(){
  echo "$1"
  yad --center --image dialog-warning \
  --title "PDFExtract Warning" \
  --text "$1" \
  --button="Try again:0" \
  --button="Exit:1"

  [[ "$?" != "0" ]] && exit 0
}

dialog_settings(){
  PAGECOUNT=$(pdfinfo "$DOCUMENT" | grep Pages | sed 's/[^0-9]*//') #determine page count

  SETTINGS=($(\
      yad --form --width 300 --center \
          --window-icon application-pdf --image application-pdf \
          --separator=" " --title="PDFextract"\
          --text "Please choose the page range and backend"\
          --field="Start:NUM" 1[!1..$PAGECOUNT[!1]] --field="End:NUM" $PAGECOUNT[!1..$PAGECOUNT[!1]] \
          --field="Backend":CB "$BACKENDSELECTION" \
          --button="gtk-ok:0" --button="gtk-cancel:1"\
      ))

  SETTINGSRET="$?"

  [[ "$SETTINGSRET" != "0" ]] && exit 1

  STARTPAGE=$(printf %.0f ${SETTINGS[0]}) #round numbers and store array in variables
  STOPPAGE=$(printf %.0f ${SETTINGS[1]})
  BACKEND="${SETTINGS[2]}"
  EXTRACTOR="${BACKEND}extract"

  check_deps "$BACKEND"

  if [[ -n "$MissingDeps" ]]; then
    dialog_warning "Error, missing dependency: $MissingDeps"
    unset MissingDeps
    dialog_settings
    return
  fi

  if [[ "$STARTPAGE" -gt "$STOPPAGE" ]]; then 
    dialog_warning "<b>   Start page higher than stop page.   </b>"
    dialog_settings
    return
  fi

  OUTFILE="${DOCUMENT%.pdf} (p${STARTPAGE}-p${STOPPAGE}).pdf"
}

extract_pages(){
  $EXTRACTOR
  EXTRACTORRET="$?"
  if [[ "$EXTRACTORRET" = "0" ]]; then
    notify "Pages $STARTPAGE to $STOPPAGE succesfully extracted."
  else
    notify "There has been an error. Please check the CLI output."
  fi
}


# Main

check_input "$1"
dialog_settings
extract_pages

安装

请遵循Nautilus脚本通用安装说明。确保仔细阅读脚本头,因为这将有助于阐明脚本的安装和使用。


部分页面-PDF Shuffler


总览

PDF-Shuffler是一个小型的python-gtk应用程序,可帮助用户使用交互式直观的图形界面来合并或拆分pdf文档以及旋转,裁剪和重新排列其页面。它是python-pyPdf的前端。

安装

sudo apt-get install pdfshuffler

用法

PDF-Shuffler可以裁剪和删除单个PDF页面。您可以使用它通过裁剪功能从文档甚至部分页面中提取页面范围:

在此处输入图片说明


页面元素-Inkscape


总览

Inkscape是一个非常强大的开源矢量图形编辑器。它支持多种不同格式,包括PDF文件。您可以使用它从PDF文件提取,修改和保存页面元素。

安装

sudo apt-get install inkscape

用法

1.)使用Inkscape打开您选择的PDF文件。将会出现一个导入对话框。选择要从中提取元素的页面。保留其他设置不变:

在此处输入图片说明

2.)在Inkscape中,单击并拖动以选择要提取的元素:

在此处输入图片说明

3.)用反转选择,!并用删除所选对象DELETE

在此处输入图片说明

4.)通过使用+ + 访问“ 文档属性”对话框并选择“使文档适合图像”,将文档裁剪为其余对象:CTRLSHIFTD

在此处输入图片说明

5.)文件 -> 另存为对话框将文档另存为PDF文件:

6.)如果裁剪后的文档中有位图/光栅图像,则可以在接下来出现的对话框中设置其DPI:

在此处输入图片说明

7.)如果执行了所有步骤,您将生成一个仅包含您选择的对象的真实PDF文件:

在此处输入图片说明


很努力。谢谢!我了解它不允许选择页面的一部分,而只能选择整个页面。我对吗?
carnendil

2
@carnendil:是的,完全正确。我不认为ghostscript有能力做到这一点。但是,可能还有其他解决方案可以通过编程方式实现。现在,我已经使用PDF-shuffler替代(有点黑)的解决方案编辑了答案。
Glutanimate

3
好的,我使用Inkscape添加了另一种方法。
Glutanimate

1
pdfshuffler如果要提取PDF页面的一部分,还不够。页面的原始PDF数据仍保留在文件中。如果要从PDF文件中删除敏感数据,请不要使用此方法。
Rob W

pdfshuffler现在称为pdfarranger
Amoe

69

QPDF很棒。用这种方法从中提取第1-10页input.pdf并将其另存为output.pdf

qpdf --pages input.pdf 1-10 -- input.pdf output.pdf

请注意input.pdf写两次。

您可以通过调用以下命令进行安装:

sudo apt-get install qpdf

这是用于PDF操作的好工具,它非常快,几乎没有依赖性。“它可以加密和线性化文件,公开PDF文件的内部结构,并执行许多其他对最终用户和PDF开发人员有用的操作。”

http://sourceforge.net/projects/qpdf/


3
我唯一遇到的问题是,尽管大多数页面都被删除了,但仍然列出了目录中的所有页面。除此之外,非常感谢!:)
Wilf

3
很棒的软件。尼斯
安华

2
警告-文件都很大..大约与原始文件大小相同。
科里·阿利克斯

3
可以,但是用于指定页面(列出输入文件两次,然后添加--)的语法确实很奇怪。
Dan Dascalescu

3
使用--pages标志可以拼接多个PDF中的页面。请注意,可以通过.在--pages选项中使用代替输入文件来避免重复名称qpdf --pages . 1-10 -- input.pdf output.pdf
巴特

43

将此另存为shell脚本,例如pdfextractor.sh:

#!/bin/bash
# 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}"

要运行,请输入:

./pdfextractor.sh 4 20 myfile.pdf
  1. 4 指的是它将启动新pdf的页面。

  2. 20 指的是将以pdf结尾的页面。

  3. myfile.pdf 是您要提取零件的pdf文件。

输出将myfile_p4_p20.pdf与原始pdf文件位于同一目录中。

所有这些和更多信息在这里:技术提示


15
让我们保持简单:gs -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dFirstPage=1 -dLastPage=10 -sOutputFile=output.pdf input.pdf
1

以及如何指定输入文件?
安华

1
-1用于在双引号字符串之外进行bash参数扩展。(应为"-sOutputFile=${3%.pdf}_p${1}-p${2}.pdf"等(请注意引号))。
Rotsor

1
@ Ho1,请将其写为新答案,确实有帮助!
约书亚·萨拉萨

这是最可移植的答案,因为Ghostscript可能几乎安装在任何地方。
6


27

有一个名为pdfseparate的命令行实用程序。

从文档:

pdfseparate sample.pdf sample-%d.pdf

extracts  all pages from sample.pdf, if i.e. sample.pdf has 3 pages, it
   produces

sample-1.pdf, sample-2.pdf, sample-3.pdf

或者,从文件sample.pdf中选择一个页面(在本例中为第一页):

pdfseparate -f 1 -l 1 sample.pdf sample-1.pdf

2
很棒的工具!比pdftk
Anwar

3
很好,但是只限于一页,如果您想要的更多,您将获得单独的页面。
Ho1

2
当然,尽管可以将上面的命令与pdfunite一起生成一个文档。
jdmcbr 2015年

3
如果您有一个庞大的文档,并且需要拆分所有页面,那么它确实非常快速且有用。
MEDVIS

19

pdftksudo apt-get install pdftk)对于PDF操作来说也是一个很好的命令行。以下是一些pdftk可以做什么的示例:

   Collate scanned pages
     pdftk A=even.pdf B=odd.pdf shuffle A B output collated.pdf
     or if odd.pdf is in reverse order:
     pdftk A=even.pdf B=odd.pdf shuffle A Bend-1 output collated.pdf

   Join in1.pdf and in2.pdf into a new PDF, out1.pdf
     pdftk in1.pdf in2.pdf cat output out1.pdf
     or (using handles):
     pdftk A=in1.pdf B=in2.pdf cat A B output out1.pdf
     or (using wildcards):
     pdftk *.pdf cat output combined.pdf

   Remove page 13 from in1.pdf to create out1.pdf
     pdftk in.pdf cat 1-12 14-end output out1.pdf
     or:
     pdftk A=in1.pdf cat A1-12 A14-end output out1.pdf

   Burst a single PDF document into pages and dump its data to
   doc_data.txt
     pdftk in.pdf burst

   Rotate the first PDF page to 90 degrees clockwise
     pdftk in.pdf cat 1east 2-end output out.pdf

   Rotate an entire PDF document to 180 degrees
     pdftk in.pdf cat 1-endsouth output out.pdf

在您的情况下,我会这样做:

     pdftk A=input.pdf cat A<page_range> output output.pdf

软件包“ pdftk”没有候选安装
FireInTheSky

8

您是否尝试过PDF Mod?

例如,您可以提取页面并将其另存为pdf。

描述:

PDF Mod是用于修改PDF文档的简单工具。它可以
通过拖放来旋转,提取,删除和重新排序页面。多个文档可以通过拖放来组合
。您也可以
使用PDF Mod 编辑PDF 文档的标题,主题,作者和关键字。

通过软件中心安装

希望这会有所帮助。

瑞格斯。


是的,我实际上确实尝试过,但是它不允许我将页面的一部分(例如,绘图)另存为pdf ...除非我没有看到该选项。它使我可以从文档中提取整个页面,但这不是我想要的
user72469

我经常使用它,很棒的工具!但是我有一个大约170页的文档,而pdfmod无法处理。
love.by.Jesus 16-10-16

哇。这是令人惊讶的平滑。将我的512页的真实书扔给它(50MiB),并且...很及时。UI轻而易举。对于像我这样的CLI迷,需要一定程度的GUI才能说服我,但这确实可以!
sehe

PDF Mod在Kubuntu 18
Joshua Salazar

8

我正试图做同样的事情。您要做的就是:

  1. 安装pdftk

    sudo apt-get install pdftk
    
  2. 如果要提取随机页面:

    pdftk myoldfile.pdf cat 1 2 4 5 output mynewfile.pdf
    
  3. 如果要提取范围:

    pdftk myoldfile.pdf cat 1-2 4-5 output mynewfile.pdf
    

请检查以获取更多信息。


我发现这个答案最好,因为它显示了如何输入多个范围。
RomanLuštrik18年

6

事实证明,我可以使用imagemagick。如果没有,只需使用以下命令进行安装:

sudo apt-get install imagemagick

注1:我已经用一页pdf尝试了此操作(我正在学习使用imagemagick,所以我不想遇到不必要的麻烦)。我不知道它是否/如何在多页中使用,但是您可以使用以下方法提取感兴趣的一页pdftk

pdftk A=myfile.pdf cat A1 output page1.pdf

您在其中指示要拆分的页码(在上面的示例中,A1选择第一页)。

注2:使用此过程生成的图像将成为光栅。


打开与命令的PDF display,这是部分imagemagick套房:

display file.pdf

我的看起来像这样:

PDF的imagemagick显示
点击图片查看完整分辨率版本

现在,您单击窗口,一个菜单将弹出到侧面。在此处,选择“ 变换” | 作物

imagemagick变换>裁剪菜单

返回主窗口,只需拖动指针即可选择要裁剪的区域(经典的角到角选择)。

选择要种植的区域
选择时请注意图像周围的手形指针

在继续下一步之前,可以优化此选择。

完成后,请注意左上角出现的小矩形(请参见上图)。它首先显示所选区域的尺寸(例如281x218),然后显示第一个角的坐标(例如+256+215)。

写下所选区域的尺寸;保存裁切后的图像时将需要它。

现在,回到弹出菜单(现在是特定的“作物”菜单),点击按钮裁剪

imagemagick裁剪菜单

最后,一旦您对裁剪的结果感到满意,请单击菜单File | File

要保存裁剪PDF,输入一个名称,单击按钮导航到该文件夹格式,在“选择图像格式类型”窗口中选择PDF,然后单击按钮选择。返回“浏览并选择文件”窗口,单击保存按钮。

imagemagick另存为pdf

保存之前,imagemagick将要求“选择页面几何形状”。在这里,您可以使用简单的字母“ x”来键入裁剪图像的尺寸,以分隔宽度和高度。

imagemagick选择页面几何

现在,您可以在命令行中完美地完成所有操作(该命令convert带有option -crop)-当然可以更快,但是您必须事先知道要提取图像的坐标。在他们的网页上查看man convert示例


不了解imagemagick的GUI。看起来很有趣。但是,如果我错了,请纠正我,但我认为imagemagick无法处理矢量化图像。因此,您要导出的内容可能只会是光栅/位图图像。在这种情况下,此方法与拍摄文档区域的屏幕快照相同。
Glutanimate 2013年

1
实际上,imagemagick仅可处理光栅图像,并且display只是该套件的一项命令。有很多界面imagemagick-检查其网页。我认为,对于矢量图像,最好的解决方案是使用Inkscape的方法。
carnendil

2
您可能需要在答案的顶部添加免责声明,以免将矢量从矢量图形转换为栅格图形。此属性使它成为根本不同的方法。
bluenote10

2

PDF拆分和合并对于此操作和其他PDF操作非常有用。

这里下载


1
您可以从上面的链接下载最新版本,但是如果您希望使用Software Center的便利,也可以从那里(或从终端通过安装sudo apt-get install pdfsam)进行安装。但是,Ubuntu中的版本已经过时了,因为它仍然是1.1.4版本,而sourceforge版本已经是2.2.2。
Waldir Leoncio

最新的3.x(当前为3.1.0)具有可安装在Ubuntu上的.deb软件包,并具有可完成OP要求的提取页面模块
Andrea Vacondio

1
@Andrea Vacondio Bravo的精彩编辑!您正在帮助确保互联网安全。我发现sourceforge.net上旧链接中的文件已嵌入废话。SourceForge网站的新所有者表示,他们将停止这样做,但显然他们说谎。
karel

2

原始用户要求使用交互式工具而不是命令行工具:一个简单的解决方案是使用任何PDF查看器(在Kubuntu上为okular,在Ubuntu上为evince甚至是Firefox),然后仅使用标准打印对话框,选择“打印到PDF文件”,然后在扩展设置对话框中选择要“打印”的页面。此变体有一些缺点,因为原始PDF上的某些头(例如旋转的页面,表单等)可能会丢失,但对于大多数简单的PDF来说却很直接。


0

如果要从PDF中提取,可以使用http://www.sumnotes.net。这是从PDF提取注释,突出显示和图像的绝佳工具。您还可以通过键入在YouTube上观看教程sumnotes

我希望你会喜欢它!

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.