Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,19 @@ pdftools

* **Copyright (c)** 2015 Stefan Lehmann
* **License:** MIT
* **Description:** Python-based command line tool for manipulating PDFs. It is based on the PyPdf2 package.
* **Description:** Python-based command line tool for manipulating PDFs. It is based on the pypdf package.

[![Build Status](https://travis-ci.org/stlehmann/pdftools.svg?branch=master)](https://travis-ci.org/stlehmann/pdftools)
[![PyPI version](https://badge.fury.io/py/pdftools.svg)](https://badge.fury.io/py/pdftools)
[![Downloads](https://pepy.tech/badge/pdftools)](https://pepy.tech/project/pdftools)
[![Downloads](https://pepy.tech/badge/pdftools/week)](https://pepy.tech/project/pdftools/week)

## Installation notes

Ideally, you should be able to clone this repo and run `pip install -e .` to install the package locally.

On OSX, I had to go into `~/Library/Python/<python-version>/lib/python/site-packages/easy-install.pth` and add the local repo directory.

## Features

* add, insert, remove and rotate pages
Expand All @@ -28,7 +34,7 @@ The description for each script is listed below.
usage: pdftools [-h] [-V] <command> ...

Python-based command line tool for manipulating PDFs. It is based on the
PyPdf2 package.
pypdf package.

optional arguments:
-h, --help show this help message and exit
Expand Down
2 changes: 1 addition & 1 deletion pdftools/_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

def main():
PARSER = argparse.ArgumentParser(
description="Python-based command line tool for manipulating PDFs. It is based on the PyPdf2 package.",
description="Python-based command line tool for manipulating PDFs. It is based on the pypdf package.",
formatter_class=argparse.ArgumentDefaultsHelpFormatter
)
# global options
Expand Down
82 changes: 41 additions & 41 deletions pdftools/pdftools.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import os
from tempfile import NamedTemporaryFile
from shutil import move
from PyPDF2 import PdfFileReader, PdfFileWriter
from pypdf import PdfReader, PdfWriter
from pdftools.parseutil import parse_rangearg, limit


Expand All @@ -21,7 +21,7 @@ def pdf_merge(inputs: [str], output: str, delete: bool = False):
:param delete: delete input files after completion if true

"""
writer = PdfFileWriter()
writer = PdfWriter()
if os.path.isfile(output):
ans = input(
"The file '%s' already exists. "
Expand All @@ -35,9 +35,9 @@ def pdf_merge(inputs: [str], output: str, delete: bool = False):
infiles = []
for filename in inputs:
f = open(filename, "rb")
reader = PdfFileReader(f)
reader = PdfReader(f)
for page in reader.pages:
writer.addPage(page)
writer.add_page(page)
infiles.append(f)
writer.write(outputfile)
except FileNotFoundError as e:
Expand Down Expand Up @@ -67,8 +67,8 @@ def pdf_rotate(
rotated
"""
infile = open(input, "rb")
reader = PdfFileReader(infile)
writer = PdfFileWriter()
reader = PdfReader(infile)
writer = PdfWriter()

# get pages from source depending on pages parameter
if pages:
Expand All @@ -78,11 +78,11 @@ def pdf_rotate(
for i, page in enumerate(reader.pages):
if pages is None or i in pages:
if counter_clockwise:
writer.addPage(page.rotateCounterClockwise(degrees))
writer.add_page(page.rotateCounterClockwise(degrees))
else:
writer.addPage(page.rotateClockwise(degrees))
writer.add_page(page.rotateClockwise(degrees))
else:
writer.addPage(page)
writer.add_page(page)

# Open output file or temporary file for writing
if output is None:
Expand Down Expand Up @@ -123,16 +123,16 @@ def pdf_copy(input: str, output: str, pages: [int], yes_to_all=False):
return

with open(input, "rb") as inputfile:
reader = PdfFileReader(inputfile)
reader = PdfReader(inputfile)
outputfile = open(output, "wb")
writer = PdfFileWriter()
writer = PdfWriter()
if pages is None:
pages = range(len(reader.pages))
else:
pages = parse_rangearg(pages, len(reader.pages))
for pagenr in sorted(pages):
page = reader.getPage(pagenr)
writer.addPage(page)
page = reader._get_page(pagenr)
writer.add_page(page)
writer.write(outputfile)
outputfile.close()

Expand All @@ -154,16 +154,16 @@ def pdf_split(
return

with open(input, "rb") as inputfile:
reader = PdfFileReader(inputfile)
reader = PdfReader(inputfile)
pagenr = 0
outputfile = None
if sequence is None:
for i, page in enumerate(reader.pages):
if not i % stepsize:
pagenr += 1
outputfile = open(output + "_%i.pdf" % pagenr, "wb")
writer = PdfFileWriter()
writer.addPage(page)
writer = PdfWriter()
writer.add_page(page)
if not (i + 1) % stepsize:
writer.write(outputfile)
outputfile.close()
Expand All @@ -174,11 +174,11 @@ def pdf_split(
with open(
output + "_%i.pdf" % (filenr + 1), "wb"
) as outputfile:
writer = PdfFileWriter()
writer = PdfWriter()
for i in range(pagecount):
try:
page = next(iter_pages)
writer.addPage(page)
writer.add_page(page)
except StopIteration:
writer.write(outputfile)
return
Expand Down Expand Up @@ -217,18 +217,18 @@ def pdf_zip(
outputfile = open(output, "wb")
try:
f1, f2 = open(input1, "rb"), open(input2, "rb")
r1, r2 = PdfFileReader(f1), PdfFileReader(f2)
writer = PdfFileWriter()
r1, r2 = PdfReader(f1), PdfReader(f2)
writer = PdfWriter()
pages1 = [page for page in r1.pages]
pages2 = [page for page in r2.pages]
if not revert:
for p1, p2 in zip(pages1, pages2):
writer.addPage(p1)
writer.addPage(p2)
writer.add_page(p1)
writer.add_page(p2)
else:
for p1, p2 in zip(pages1, reversed(pages2)):
writer.addPage(p1)
writer.addPage(p2)
writer.add_page(p1)
writer.add_page(p2)
writer.write(outputfile)
f1.close()
f2.close()
Expand Down Expand Up @@ -266,31 +266,31 @@ def pdf_insert(
if ans not in ["y", ""]:
return

writer = PdfFileWriter()
writer = PdfWriter()
# read pages from file1
destfile = open(dest, "rb")
destreader = PdfFileReader(destfile)
destreader = PdfReader(destfile)
for page in destreader.pages:
writer.addPage(page)
writer.add_page(page)

# read pages from file2
srcfile = open(source, "rb")
srcreader = PdfFileReader(srcfile)
srcreader = PdfReader(srcfile)

# if no page numbers are given insert all pages
index = limit(index - 1, 0, len(destreader.pages))
if pages is None:
for i, page in enumerate(srcreader.pages):
if index is None:
writer.addPage(page)
writer.add_page(page)
else:
writer.insertPage(page, index + i)
else:
pages = parse_rangearg(pages, len(srcreader.pages))
for i, pagenr in enumerate(pages):
page = srcreader.getPage(pagenr)
page = srcreader._get_page(pagenr)
if index is None:
writer.addPage(page)
writer.add_page(page)
else:
writer.insertPage(page, index + i)

Expand Down Expand Up @@ -323,15 +323,15 @@ def pdf_remove(source: str, pages: [str], output: str = None):
if overwrite_dlg(output) is False:
return

writer = PdfFileWriter()
writer = PdfWriter()
srcfile = open(source, "rb")
srcreader = PdfFileReader(srcfile)
srcreader = PdfReader(srcfile)

# Add pages, leave out removed pages
pages = parse_rangearg(pages, len(srcreader.pages))
for pagenr, page in enumerate(srcreader.pages):
if pagenr not in pages:
writer.addPage(page)
writer.add_page(page)

# Open output file or temporary file for writing
if output is None:
Expand Down Expand Up @@ -367,27 +367,27 @@ def pdf_add(dest: str, source: str, pages: [str], output: str):
if not overwrite_dlg(output):
return

writer = PdfFileWriter()
writer = PdfWriter()

# read pages from destination file
destfile = open(dest, "rb")
destreader = PdfFileReader(destfile)
destreader = PdfReader(destfile)
for page in destreader.pages:
writer.addPage(page)
writer.add_page(page)

# read pages from source file
srcfile = open(source, "rb")
srcreader = PdfFileReader(srcfile)
srcreader = PdfReader(srcfile)

# if no page numbers are given add all pages from source
if pages is None:
for i, page in enumerate(srcreader.pages):
writer.addPage(page)
writer.add_page(page)
else:
pages = parse_rangearg(pages, len(srcreader.pages))
for pagenr in pages:
page = srcreader.getPage(pagenr)
writer.addPage(page)
page = srcreader._get_page(pagenr)
writer.add_page(page)

if output is None:
# Write into Temporary File first and then overwrite dest file
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
PyPDF2==1.25.1
pypdf==3.9.1
4 changes: 2 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,10 @@ def extract_version():
license="MIT",
author="Stefan Lehmann",
author_email="stlm@posteo.de",
description="A collection of convenience scripts for PDF manipulation, based on the PyPdf2 package",
description="A collection of convenience scripts for PDF manipulation, based on the pypdf package",
long_description=read("README.md"),
long_description_content_type='text/markdown',
install_requires=["PyPdf2"],
install_requires=["pypdf"],
maintainer="Stefan Lehmann",
classifiers=[
"Development Status :: 5 - Production/Stable",
Expand Down