770

Do you have any idea how to extract a part of a PDF document and save it as PDF? On OS X it is absolutely trivial by using Preview. I tried PDF editor and other programs but to no avail.

I would like a program where I select the part that I want and then save it as a PDF file with a simple command like CMD+N on OS X. I want the extracted part to be saved as PDF and not as JPEG, etc.

0

21 Answers 21

798

pdftk is a useful multi-platform tool for the job (pdftk homepage).

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

you pass the filename of the main pdf, then you tell it to only include certain pages (12-15 in this example) and output it to a new file.

Installation instructions:

To install the snap version, which is an unofficial repackaging of an old version of PDFtk (repackaged by Scott Moser), visit this link or run:

sudo snap install pdftk

Alternatively, you can install an open source port of PDFtk to Java by Marc Vinyals, by running:

sudo apt install pdftk-java

Another alternative is PDFtk Server, available from the website: https://www.pdflabs.com/tools/pdftk-server/ . This version is free of charge for personal use, but it is not open source.

15
  • 12
    If I want to extract pages 1-10, 15, and 17, how do I write the command?
    – JACKY88
    Oct 12, 2016 at 8:26
  • 70
    @PatrickLi pdftk A=in.pdf cat A1-10 A15 A17 output out.pdf
    – m8mble
    Oct 28, 2016 at 12:06
  • 17
    Note that pdftk is not available in Ubuntu 18.04. (see askubuntu.com/questions/1028522/…)
    – alkamid
    Jun 30, 2018 at 12:05
  • 21
    @alkamid it is: sudo snap install pdftk
    – Qubix
    Sep 23, 2018 at 18:51
  • 43
    Although pdftk is certainly a tool that can do the job, I would recommend against it. This is not free software, but an clunky piece of shareware. Also it needs the JVM. A more reasonable tool is qpdf, as suggested in another answer. Nov 13, 2018 at 13:11
376

Very simple. Use the default PDF reader, select "Print To File" and that's it!

print menu

Then:

setting new PDF

Note that with this way, the text will no more be searchable, instead all texts are converted to images: this is how "Print" works.

16
  • 42
    Produces catastrophic results with beamer files, maps and any other documents that do not conform with the printer page format. Jan 13, 2015 at 13:48
  • 26
    This can result in file with a much larger size than the original document.
    – dat
    Dec 8, 2015 at 17:06
  • 15
    so it does not "extract" the page range. It creates a new pdf from the old one, as if you used high-definition printer/scanner pair.
    – sylvainulg
    Aug 11, 2016 at 9:36
  • 11
    Good for simple cases, but undesired results in documents with highlighting comments: the highlighting becomes 100% opacity and blocks the text. Oct 16, 2016 at 20:30
  • 8
    Also doesn't preserve hyperlinks. Nov 13, 2018 at 13:13
288

QPDF is great. Use it this way to extract pages 1 to 10 from input.pdf and save it as output.pdf:

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

This preserves all metadata associated with that file.

From the old manual:

If you wanted pages 1 through 5 from infile.pdf but you wanted the rest of the metadata to be dropped, you could instead run

qpdf --empty --pages infile.pdf 1-5 -- outfile.pdf

Here's a link to the current documentation, giving more examples of page selection.


You can install it by invoking:

sudo apt-get install qpdf

It is a great tool for PDF manipulation. It's very fast and has very few dependencies. From QPDF's GitHub repo:

QPDF is a command-line tool and C++ library that performs content-preserving transformations on PDF files. It supports linearization, encryption, and numerous other features. It can also be used for splitting and merging files, creating PDF files (but you have to supply all the content yourself), and inspecting files for study or analysis.

16
  • 4
    The --pages flag allows you to splice pages from multiple PDFs. Note that you can avoid duplicating the name by using . in place of the input file in the --pages options: qpdf --pages . 1-10 -- input.pdf output.pdf.
    – bart
    May 8, 2019 at 23:40
  • 12
    Using ---pages . doesn't seem to work on Ubuntu 18.04. Maybe that was a recent addition?
    – cgmb
    Jun 25, 2019 at 6:26
  • 7
    When I extract only a few pages, why does the resulting PDF has the same data size as the source PDF?
    – edison23
    Jun 25, 2019 at 10:50
  • 6
    If you want to extract pages 1-8 and 53-70 then qpdf --pages . 1-8 . 53-70 -- input.pdf output.pdf Sep 26, 2019 at 7:28
  • 12
    qpdf input.pdf --pages . 1 -- output.pdf was not working for me. (version 8.0.2). This is what worked for me: qpdf input.pdf --pages input.pdf 1 -- output.pdf Apr 29, 2020 at 17:27
104

Page range - Nautilus script


Overview

I created a slightly more advanced script based on the tutorial @ThiagoPonte linked to. Its key features are

  • that it's GUI based,
  • compatible with spaces in file names,
  • and based on three different backends that are capable of preserving all attributes of the original file

Screenshot

enter image description here

Code

#!/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

Installation

Please follow the generic installation instructions for Nautilus scripts. Make sure to read the script header carefully as it will help to clarify the installation and usage of the script.


Partial pages - PDF Arranger


Overview

PDF Arranger is a small python-gtk application, which helps the user to merge or split pdf documents and rotate, crop and rearrange their pages using an interactive and intuitive graphical interface. It is a frontend for python-pyPdf.

Installation

sudo apt-get install pdfshuffler

Usage

PDF Arranger can crop and delete single PDF pages. You can use it to extract a page range from a document or even partial pages using the cropping function:

enter image description here


Page elements - Inkscape


Overview

Inkscape is a very powerful open-source vector graphics editor. It supports a wide range of different formats, including PDF files. You can use it to extract, modify and save page elements from a PDF file.

Installation

sudo apt-get install inkscape

Usage

1.) Open the PDF file of your choice with Inkscape. An import dialog will appear. Choose the page you want to extract elements from. Leave the other settings as they are:

enter image description here

2.) In Inkscape click and drag to select the element(s) you want to extract:

enter image description here

3.) Invert the selection with ! and delete the selected object with DELETE:

enter image description here

4.) Crop the document to the remaining objects by accessing the Document Properties dialog with CTRL+SHIFT+D and selecting "fit document to image":

enter image description here

5.) Save the document as a PDF file from the File --> Save as dialog:

6.) If there are bitmap/raster images in your cropped document you can set their DPI in the dialog that appears next:

enter image description here

7.) If you followed all steps you will have produced a true PDF file that only consists of the objects of your choice:

enter image description here

6
  • 1
    Great effort. Thanks! I understand that it does not allow to select a portion of a page, but only whole pages. Am I right?
    – carnendil
    Apr 17, 2013 at 23:36
  • 2
    @carnendil : Yes, exactly. I don't think ghostscript is capable of that. But there might be other solutions out there to do this programmatically. For now I have edited my answer with an alternate (and a bit hackish) solution using PDF-shuffler. Apr 18, 2013 at 5:11
  • 3
    pdfshuffler is not sufficient if you want to extract a part of the PDF page. The original PDF data of the page is still preserved in the file. Do not use this method if you want to remove sensitive data from a PDF file.
    – Rob W
    Nov 7, 2015 at 11:48
  • 5
    pdfshuffler is now called pdfarranger.
    – amoe
    Sep 11, 2019 at 15:20
  • 2
    I wish you would have posted the three answers separately so that we could comment on each one separately and upvote them all separately.
    – Flimm
    Jan 7, 2022 at 8:46
70

Save this as a shell script, like 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}"

To run type:

./pdfextractor.sh 4 20 myfile.pdf
  1. 4 refers to the page it will start the new pdf.

  2. 20 refers to the page it will end the pdf with.

  3. myfile.pdf is the pdf file you want to extract parts.

The output would be myfile_p4_p20.pdf in the same directory the original pdf file.

All this and more information here: Tech Tip

5
  • 31
    Let's keep it simple: gs -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dFirstPage=1 -dLastPage=10 -sOutputFile=output.pdf input.pdf
    – Ho1
    Sep 9, 2015 at 7:14
  • 1
    @Ho1 please write it as a new answer, it really helps! Oct 3, 2018 at 18:36
  • 1
    This is the most portable answer, as ghostscript is likely to be installed pretty much anywhere.
    – Calimo
    Jun 13, 2019 at 15:43
  • 1
    gs is slightly familiar and much smaller file size than what qpdf gives! pdftk is also not available on my Mac through Homebrew and I hear it's slow too.
    – Pysis
    Jul 19, 2019 at 21:02
  • Perfect thank you!
    – Smeterlink
    Sep 30, 2021 at 19:43
53

In any system that a TeX distribution is installed:

pdfjam <input file> <page ranges> -o <output file>

For example:

pdfjam original.pdf 5-10 -o out.pdf

See https://tex.stackexchange.com/a/79626/8666

6
  • 1
    this was the only one that worked for me .
    – abc
    Oct 21, 2018 at 3:12
  • 2
    Completely messed up my landscape PDF.
    – Turion
    Mar 10, 2020 at 21:10
  • This used to work fine for me with landscape PDF's, but it's messing it up now.
    – Kevin
    May 14, 2020 at 3:08
  • 2
    pdfjam --landscape ... solves the landscape problem Aug 20, 2020 at 13:01
  • 1
    The only solution I tried that accepted more than one range, e.g. pdfjam original.pdf 2-4,43,49-64 -o selection.pdf. May 1, 2023 at 22:32
47

There is a command line utility called pdfseparate.

From the docs:

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

Or, to select a single page (in this case, the first page) from the file sample.pdf:

pdfseparate -f 1 -l 1 sample.pdf sample-1.pdf
7
  • 3
    great tool! much faster than pdftk
    – Anwar
    Apr 8, 2015 at 5:57
  • 4
    Good, but it is only limited to one page, and if you want more than that, you will get separate pages.
    – Ho1
    Sep 9, 2015 at 7:19
  • 3
    Sure, though one can follow the above command with pdfunite to produce a single document.
    – jdmcbr
    Sep 9, 2015 at 15:22
  • 4
    If you have a huge document and need to split all pages, it is really fast and useful.
    – MEDVIS
    Apr 27, 2016 at 10:32
  • 1
    This is not the best method. It took 3m15s to pdfseparate+pdfunite a page range (1m11s for gs and 0m8s for qpdf), and also created a much bigger file (due to metadata for each SEPARATE page) - 62 MB vs. 37 MB original (for pages 81-end of 530), vs. 50 MB for gs and, properly, 33 MB for qpdf for same page range... Use qpdf instead!
    – vstepaniuk
    May 26, 2020 at 15:55
19

pdftk (sudo apt-get install pdftk) is a great command line too for PDF manipulation. Here are some examples of what pdftk can do:

   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

In your case, I would do:

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

I was trying to do the same. All you have to do is:

  1. install pdftk:

    sudo apt-get install pdftk
    
  2. if you want to extract random pages:

    pdftk myoldfile.pdf cat 1 2 4 5 output mynewfile.pdf
    
  3. if you want to extract a range:

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

Please check the source for more infos.

2
8

If you wish to use inbuilt bash commands then pdfseparate and pdfunite are for you.

pdfseparate sample.pdf sample-%d.pdf
# ls; sample.pdf sample-1.pdf sample-2.pdf sample-3.pdf sample-4.pdf

pdfunite sample-2.pdf sample-3.pdf output.pdf
# now you can use output.pdf
2
  • 1
    pdfseparate is not a "built-in bash command". Try file $(which pdfseparate). Aug 1, 2022 at 21:07
  • pdfseparate + pdfunite the parts, created an output file 3x bigger than the original file. Aug 1, 2022 at 21:15
8

Have you tried PDF Mod?

You can for example.. extract pages and save them as pdf.

Description:

PDF Mod is a simple tool for modifying PDF documents. It can rotate, extract, remove
and reorder pages via drag and drop. Multiple documents may be combined via drag
and drop. You may also edit the title, subject, author and keywords of a PDF
document using PDF Mod.

sudo apt install pdfmod

Screenshot

Hope this will useful.

Regars.

5
  • YES, I actually did try it but it does NOT allow me to save part of a page e.g. a plot as pdf... Unless I dont see the option. It allows me to extract a whole page from a document but that is not what I want
    – user72469
    Nov 26, 2012 at 2:21
  • I use it regularly, great tool! but I had a document with about 170 pages that pdfmod could not handle. Oct 16, 2016 at 20:54
  • Wow. This is surprisingly smooth. Threw my 512 page real book at it (50MiB) and it... was prompt. UI is a breeze. For a CLI junkie like me it takes some level of GUI to convince me, but this will do!
    – sehe
    Oct 12, 2017 at 6:50
  • PDF Mod has bugs running in Kubuntu 18 Oct 3, 2018 at 18:37
  • Couldn't open a PDF generated by TurboTax. Sep 1, 2022 at 22:57
6

As it turns out, I can do it with imagemagick. If you don't have it, install simply with:

sudo apt-get install imagemagick

Note 1: I've tried this with a one-page pdf (I'm learning to use imagemagick, so I didn't want more trouble than necessary). I don't know if/how it will work with multiple pages, but you can extract one page of interest with pdftk:

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

where you indicate the page number to be split out (in the example above, A1 selects the first page).

Note 2: The resulting image using this procedure will be a raster.


Open the pdf with the command display, which is part of the imagemagick suite:

display file.pdf

Mine looked like this:

imagemagick display of a pdf
Click on the image to see a full resolution version

Now you click on the window and a menu will pop to the side. There, select Transform | Crop.

imagemagick transform>crop menu

Back in the main window, you can select the area you want to crop by simply dragging the pointer (classic corner-to-corner selection).

selection of area to crop
Notice the hand-shaped pointer around the image while selecting

This selection can be refined before proceeding to the next step.

Once you are done, take notice of the little rectangle that appears on the upper left corner (see the image above). It shows the dimensions of the area selected first (e.g. 281x218) and second the coordinates of the first corner (e.g. +256+215).

Write down the dimensions of the selected area; you'll need it at the moment of saving the cropped image.

Now, back at the pop menu (which now is the specific "crop" menu), click the button Crop.

imagemagick crop menu

Finally, once you are satisfied with the results of cropping, click on menu File | Save

Navigate to the folder where you want to save the cropped pdf, type a name, click the button Format, on the "Select image format type" window select PDF and click the button Select. Back on the "Browse and select a file" window, click the button Save.

imagemagick save as pdf

Before saving, imagemagick will ask to "select page geometry". Here, you type the dimensions of your cropped image, using a simple letter "x" to separate width and height.

imagemagick select page geometry

Now, you can do all this perfectly from the command line (the command is convert with option -crop) -- surely it's faster, but you would have to know beforehand the coordinates of the image you want to extract. Check man convert and an example in their webpage.

3
  • DIdn't know about imagemagick's GUI. Looks interesting. However, please correct me if I'm wrong but I think imagemagick can't handle vectorized images. So what you're exporting is likely going to be a raster/bitmap image only. In that case this method is the same as taking taking a screenshot of a region of the document. Apr 19, 2013 at 8:23
  • 1
    Indeed, imagemagick works only raster images, and display is just one command of the suite. There are plenty of interfaces for imagemagick -- check their webpage. For vector images the best solution is, I think, your method with Inkscape.
    – carnendil
    Apr 19, 2013 at 15:00
  • 2
    You might want to add a disclaimer at the top of the answer as a caution that this will convert from vector to raster graphics. This property makes it a fundamentally different approach.
    – bluenote10
    Jul 9, 2014 at 15:10
6

mutool, which comes with mupdf, can do a lot of simple PDF processing stuff, but has a more elegant syntax than qpdf (and some of the other answers). Additionally, it seems faster on big PDFs:

# extract page range 20-40
mutool clean in.pdf out.pdf 20-40
# extract from all over the pdf
mutool clean in.pdf out.pdf '1, 3-4, 74-92'
1
  • Generates bigger files
    – Gilberto
    Mar 11, 2021 at 17:34
5

Tested on Ubuntu 20.04 with pdftk --version 3.0.9 from May 11, 2018 (date shown at the bottom of man pdftk).

If using pdftk, here's how to format it for multiple groups of pages:

pdftk in.pdf cat 13 18 33-36 39-41 52 output out.pdf

This will capture those groups of pages, inclusive.

To install and/or update pdftk:

sudo apt update
sudo apt install pdftk

Related:

  1. [my answer] How to rotate PDF pages: https://unix.stackexchange.com/questions/394065/command-line-how-do-you-rotate-a-pdf-file-90-degrees/634882#634882
3

PDF Split and Merge is quite useful for this and other PDF manipulation operations.

Download from here

3
  • 1
    You can download the latest version from the link above, but if you prefer the convenience of the Software Center, you can also install it from there (or from the terminal, through sudo apt-get install pdfsam). However, the version in Ubuntu is quite outdated, as it's still in version 1.1.4 whereas the sourceforge version is already 2.2.2. Feb 14, 2014 at 18:00
  • The latest 3.x (currently 3.1.0) has a .deb package that can be installed on Ubuntu and has an Extract Pages module that does what the OP asked Aug 6, 2016 at 8:25
  • 1
    @Andrea Vacondio Bravo for your excellent edit! You're helping to make the internet safe. I found out that the file from the old link at sourceforge.net has crap embedded in it . The new owners of the SourceForge website said they were going to stop doing this, but obviously they lied.
    – karel
    Aug 6, 2016 at 8:41
3

Unfortunately, Ubuntu do no provide command to do that directly.

But you can use pdfseparate and pdfunite in conjonction (both comes by default with your Ubuntu)

So if you want to extract page 32 to 65 of sourcefile.pdf in a new file called extract.pdf, you can type these commands :

mkdir tmppdfdir
pdfseparate -f 32 -l 65 sourcefile.pdf tmppdfdir/page-%d.pdf
pdfunite tmppdfdir/page*.pdf extract.pdf
rm -rf tmppdfdir/

Warning : Be sure that tmppdfdir do not already exists before !

2
  • This answer duplicates this one, which was given 7+ months earlier. We already have way too many answers for this question. Please consider deleting this one. Thank you. Sep 1, 2022 at 23:03
  • Hey @Dan This is not a duplicate as the answer you point is only for extracting 2 pages from a 5 pages document. Unusable with 33 pages as in my answer. Mine is generic, the other not. Remember that some documents have more than 500 pages.
    – doom
    Sep 2, 2022 at 9:20
2

LibreOffice Draw

LibreOffice is able to edit PDFs and create new ones, and that allows you to easily and interactively select page ranges with your mouse.

This way you can easily inspect which pages you want visually and then immediately move them around without having to note the page number and go to the command line.

Another advantage is that almost every Linux desktop user is already going to have the fundamental LibreOffice package already installed in their computer, but if for some reason you don't:

sudo apt install libreoffice

Then, just open the PDF, e.g. from the CLI:

libreoffice raymond.pdf

or just open LibreOffice from the GUI and then File > Open.

Once opened, you will see:

enter image description here

Now to split the document up:

  1. Select a page range from the page index on the left. You can use the usual range shortcuts:

    • Shift for range endpoint
    • Ctrl to select or unselect individual items
  2. Ctrl + C or Right click > Copy

  3. Ctrl + N or File > New to create a new document

  4. Ctrl + V on new document to paste from the old document

  5. No to "Do you want to scale the copied objects to fit the new page size?"

  6. Shift + Delete or Right click > Delete Page to the pre-existing initial blank page from the new document

  7. File > Export As > Export Directly as PDF.

    If you are doing this a lot, you might want to assign a keyboard shortcut to this option under Tools > Customize > Keyboard.

The PDF shown in the above examples is: http://users.ece.utexas.edu/~perry/education/382v-s08/papers/raymond.pdf which is a rendering of [The Cathedral and the Bazaar by Eric S. Raymond](The Cathedral and the Bazaar).

Tested on Ubuntu 22.04, LibreOffice Draw 7.3.4.

2
  • Given the amount of bugs I've found in LibreOffice, including Draw's handling of PDFs, I wouldn't touch any important PDFs with it. Sep 1, 2022 at 23:08
  • Tried it and result is poor. Formatting is not 100% correct and sequences of "it" and "ti" show up as blank. Still, was easy to try...
    – xenoid
    Nov 20, 2023 at 21:23
2

If you want to extract pages in a WYSIWYG way, then pdfarranger offers a nice and simple GUI. It can also join PDFs, and you can rotate or crop pages.

PSF Arranger

Worked great on a TurboTax file, which pdfmod couldn't open.

The only (tiny) donwside was that it couldn't export some metadata and the table of contents was lost, but I verified that the exported selection included all pages I had selected, so the tool did its job.

1

Apache PDFBox is open source Java tool for working with PDF documents. It comes with a command line tools that can split pages from pdf, among many others things (see manual here).

To use it simply install the pdfbox-app-2.?.?.jar and execute a command like:

java -jar pdfbox-app-2.0.20.jar PDFSplit -startPage 1 -endPage 10 -outputPrefix ch1 book.pdf
1
  • This is excellent
    – Murwa
    Feb 22, 2023 at 8:30
1

ThiagoPonte's Ghostscript answer is great for its portability, but it does not explain how to use a discontinuous page list, such as 2, 6, 7, 8, 9, 11. That is possible with -sPageList:

gs -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -sPageList=2,6-9,11 -sOutputFile=out.pdf in.pdf

However I could not get it to work on older versions of Ghostscript, for which case, inspired by a Stack Overflow question, I created this shell script that only relies on -dFirstPage and -dLastPage:

#!/bin/sh -f
if [ "$#" != 2 ] && [ "$#" != 3 ]; then
    >&2 echo "Usage: $0 pagelist infile [outfile]"
    exit 11
fi
range=$1
infile=$2
outfile=${3-"${2%pdf}"out.pdf}
set --
IFS=,
for i in $range; do
    set -- "$@" "-dFirstPage=${i%-*}" "-dLastPage=${i#*-}" "$infile"
done
gs -sOutputFile="$outfile" -sDEVICE=pdfwrite -dNOPAUSE -dBATCH "$@"

You can save it in a PATH directory such as /usr/local/bin/, make it executable with chmod +x scriptname and then just call

scriptname 2,6-9,11 in.pdf out.pdf
0

I have started to put together a tool to provide a simplified interface to common actions.

You can slice out a subset of a PDF like this:

$ npm install @mountbuild/mouse -g
$ mouse slice input.pdf -s 15 -e 25 -o output.pdf

This will create a new PDF for pages between and including 15 and 25.

If nothing else check out the source and see how to write your own script to do this in JavaScript.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .