67 lines
2.2 KiB
Python
Executable File
67 lines
2.2 KiB
Python
Executable File
#!/usr/bin/env python
|
|
"""
|
|
Concatenate pages from pdf files into a single pdf file.
|
|
|
|
Page ranges refer to the previously-named file.
|
|
A file not followed by a page range means all the pages of the file.
|
|
|
|
PAGE RANGES are like Python slices.
|
|
{page_range_help}
|
|
EXAMPLES
|
|
pdfcat -o output.pdf head.pdf content.pdf :6 7: tail.pdf -1
|
|
Concatenate all of head.pdf, all but page seven of content.pdf,
|
|
and the last page of tail.pdf, producing output.pdf.
|
|
|
|
pdfcat chapter*.pdf >book.pdf
|
|
You can specify the output file by redirection.
|
|
|
|
pdfcat chapter?.pdf chapter10.pdf >book.pdf
|
|
In case you don't want chapter 10 before chapter 2.
|
|
"""
|
|
# Copyright (c) 2014, Steve Witham <switham_github@mac-guyver.com>.
|
|
# All rights reserved. This software is available under a BSD license;
|
|
# see https://github.com/mstamy2/PyPDF2/LICENSE
|
|
|
|
import argparse
|
|
from PyPDF2.pagerange import PAGE_RANGE_HELP
|
|
|
|
def parse_args():
|
|
parser = argparse.ArgumentParser(
|
|
description=__doc__.format(page_range_help=PAGE_RANGE_HELP),
|
|
formatter_class=argparse.RawDescriptionHelpFormatter)
|
|
parser.add_argument("args", nargs="+",
|
|
metavar="filename or page range expression")
|
|
parser.add_argument("-o", "--output",
|
|
metavar="output_file")
|
|
parser.add_argument("-v", "--verbose", action="store_true",
|
|
help="show page ranges as they are being read")
|
|
return parser.parse_args()
|
|
|
|
from sys import stderr, stdout, exit
|
|
import os
|
|
import traceback
|
|
from PyPDF2 import PdfFileMerger, parse_filename_page_ranges
|
|
|
|
|
|
if __name__ == "__main__":
|
|
args = parse_args()
|
|
filename_page_ranges = parse_filename_page_ranges(args.args)
|
|
|
|
merger = PdfFileMerger()
|
|
try:
|
|
for (filename, page_range) in filename_page_ranges:
|
|
if args.verbose:
|
|
print >>stderr, filename, page_range
|
|
with open(filename, "rb") as f:
|
|
merger.append(f, pages=page_range)
|
|
except:
|
|
print >>stderr, traceback.format_exc()
|
|
print >>stderr, "Error while reading " + filename
|
|
exit(1)
|
|
if args.output:
|
|
output = open(args.output, "wb")
|
|
else:
|
|
stdout.flush()
|
|
output = os.fdopen(stdout.fileno(), "wb")
|
|
merger.write(output)
|