Skip to main content

Manipulate PDF documents from the command line

Project description

Stapler is a pure Python alternative to PDFtk, a tool for manipulating PDF documents from the command line.

History

PDFtk was written in Java and C++, and is natively compiled with gcj. Sadly, it has been discontinued a few years ago and bitrot is setting in (e.g., it does not compile easily on a number of platforms).

Philip Stark decided to look for an alternative and found pypdf, a PDF library written in pure Python. He couldn’t find a tool which actually used the library, so he started writing his own.

Version 0.3 of stapler was completely refactored by Fred Wenzel. He also added tests and awesome functionality.

Like pdftk, stapler is a command-line tool. If you would like to add a GUI, compile it into a binary for your favorite platform, or contribute anything else, feel free to fork and send a pull request.

Contributors and Authorship

Stapler version 0.2 was written in 2009 by Philip Stark. Stapler version 0.3 was written in 2010 by Fred Wenzel.

For a list of contributors, check the CONTRIBUTORS file.

Change log (sorta)

  • 1.0.0 Port to Python 3. Replace OptionParser with more modern ArgumentParser. Cleaning up repository.

  • 0.3.3 include try-except blocks for supporting legacy pyPdf if needed. Also fixes some PyPI issues like the missing License Trove classifier and some dependencies.

  • 0.3.0 Refactoring by Fred Wenzel and now using PyPDF2

  • 0.2.0 Feature completeness using original pyPdf

License

Stapler is distributed under a BSD license. A copy of the BSD Style License used can be found in the file LICENSE.

Usage

There are the following modes in Stapler:

select/delete (called with sel and del, respectively)

sel is also available as cat for compatibility with my personal muscle memory. :)

With select, you can cherry-pick pages from pdfs and concatenate them into a new pdf file.

Input files can be associated with handles for use with ranges later. A handle is a single, upper-case letter:

<input handle>=<input>

Syntax:

stapler sel input1 page_or_range [page_or_range ...] [input2 p_o_r ...]

Examples:

# concatenate a and b into output.pdf
stapler sel a.pdf b.pdf output.pdf

# generate a pdf file called output.pdf with the following pages:
# 1, 4-8 in 180° (D for down), 20-40 from a.pdf, 1-5 from b.pdf in
# this order
stapler sel a.pdf 1 4-8D 20-40 b.pdf 1-5 output.pdf

# the same example with a handle for b.pdf
stapler sel B=b.pdf a.pdf 1 4-8D 20-40 B1-5 output.pdf

# generate a pdf file called output.pdf with the following pages:
# 1 from a.pdf, 1-5 from b.pdf, 4-8 in 180° (D for down), 20-40 from a.pdf
# this order
stapler sel A=a.pdf B=b.pdf A1 B1-5 A4-8D A20-40 output.pdf

# reverse some of the pages in a.pdf by specifying a negative range
stapler sel a.pdf 1-3 9-6 10 output.pdf

The delete command works almost exactly the same as select, but inverse. It uses the pages and ranges which you didn’t specify.

split/burst:

Splits the specified pdf files into their single pages and writes each page into it’s own pdf file with this naming scheme:

${origname}_${zero-padded page no}.pdf

Syntax:

stapler split input1 [input2 input3 ...]

Example for a file foobar.pdf with 20 pages:

$ stapler split foobar.pdf
$ ls
foobar_01.pdf foobar_02.pdf ... foobar_19.pdf foobar_20.pdf

Multiple files can be specified, they will be processed as if you called single instances of stapler.

zip:

With zip, you can cherry-pick pages from pdfs (like select). The pages from each pdf are merged together in an interleaving manner. This can be used to collate a pdf with odd pages and a pdf with even pages into a single file.

Syntax: stapler zip input1 [range[rotation]] [range …] [input2 [range…] …] out

Examples:

# combine a pdf with odd pages and a pdf with even pages into output.pdf
stapler zip odd.pdf even.pdf output.pdf

# combine a.pdf b.pdf and c.pdf, but use only some pages of c.pdf and
#  rotate b.pdf right (90° clockwise) and rotate c.pdf left (90° counter-
# clockwise)
stapler zip a.pdf b.pdf 1-endR c.pdf 1-3L output.pdf

If one of the ranges is shorter than the others, stapler will continue to merge the remaining pages.

info:

Shows information on the metadata stored inside a PDF file.

Syntax:

stapler info foo.pdf

Example output:

\*\*\* Metadata for foo.pdf

/ModDate:  D:20100313082451+01'00'
/CreationDate:  D:20100313082451+01'00'
/Producer:  GPL Ghostscript 8.70
/Title:  foo.pdf
/Creator:  PDFCreator Version 0.9.9
/Keywords:
/Author:  John Doe
/Subject:

list-logical:

Shows each logical page number and the associated physical page number.

Syntax:

stapler list-logical foo.pdf

Example output:

A-1 1
C-1 2
D-1 3
D-2 4
D-3 5
D-4 6

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

stapler-1.0.0.tar.gz (40.1 kB view details)

Uploaded Source

Built Distribution

stapler-1.0.0-py3-none-any.whl (38.3 kB view details)

Uploaded Python 3

File details

Details for the file stapler-1.0.0.tar.gz.

File metadata

  • Download URL: stapler-1.0.0.tar.gz
  • Upload date:
  • Size: 40.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.0.5 CPython/3.7.6 Linux/5.0.0-1032-azure

File hashes

Hashes for stapler-1.0.0.tar.gz
Algorithm Hash digest
SHA256 a7b5e76dbbaf883811039aaf8afb52122afe178c1ff2a734eb8da5e3465d542c
MD5 7a03af57ac943d37b96aeec0b13244be
BLAKE2b-256 3a34d532dcd3010740efe76621a3207c4056cb9fd85813a5f04e3a7ebe4e43fc

See more details on using hashes here.

File details

Details for the file stapler-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: stapler-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 38.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.0.5 CPython/3.7.6 Linux/5.0.0-1032-azure

File hashes

Hashes for stapler-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 865bec2599e233675215f9bf244da3e9f9bcd4988e9eba5697e6eb2a39f66945
MD5 b8cf16481aacc6286f2c7219d931a0ef
BLAKE2b-256 01d35ed2389ce75d9c507caac997f9ead1993a2b0cbe1fdc37d21651b8ce5d31

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page