From ffa5f36fae29af536d8eb4a8eb8082eefc917f86 Mon Sep 17 00:00:00 2001 From: John Schember Date: Sun, 29 Mar 2009 09:10:47 -0400 Subject: [PATCH] bzr 'command sub-command' style wrapper for pdf manipulation --- src/calibre/ebooks/pdf/manipulate.py | 67 +++++++++++++++++++ .../ebooks/pdf/{pdfmerge.py => merge.py} | 13 ++-- .../ebooks/pdf/{pdfsplit.py => split.py} | 21 +++--- .../ebooks/pdf/{pdftrim.py => trim.py} | 10 +-- src/calibre/linux.py | 5 +- 5 files changed, 89 insertions(+), 27 deletions(-) create mode 100644 src/calibre/ebooks/pdf/manipulate.py rename src/calibre/ebooks/pdf/{pdfmerge.py => merge.py} (92%) rename src/calibre/ebooks/pdf/{pdfsplit.py => split.py} (93%) rename src/calibre/ebooks/pdf/{pdftrim.py => trim.py} (95%) diff --git a/src/calibre/ebooks/pdf/manipulate.py b/src/calibre/ebooks/pdf/manipulate.py new file mode 100644 index 0000000000..0e75734bb9 --- /dev/null +++ b/src/calibre/ebooks/pdf/manipulate.py @@ -0,0 +1,67 @@ +''' +Command line interface to run pdf manipulation commands. +''' +from __future__ import with_statement + +__license__ = 'GPL v3' +__copyright__ = '2009, John Schember ' +__docformat__ = 'restructuredtext en' + +import string, sys + +from calibre.utils.config import Config, StringConfig +from calibre.ebooks.pdf import merge, split, trim + +COMMANDS = { + 'merge' : merge, + 'split' : split, + 'trim' : trim, + } + +def config(defaults=None): + desc = _('Options to control the transformation of pdf') + if defaults is None: + c = Config('trimpdf', desc) + else: + c = StringConfig(defaults, desc) + return c + +def option_parser(): + c = config() + return c.option_parser(usage=_('''\ + + %prog command ... + + command can be one of the following: + [%%commands] + + Use %prog command --help to get more information about a specific command + + Manipulate a PDF. + '''.replace('%%commands', string.join(sorted(COMMANDS.keys()), ', ')))) + +def main(args=sys.argv): + parser = option_parser() + + if len(args) < 2: + print 'Error: No command sepecified.\n' + print parser.get_usage() + return 2 + + command = args[1].lower().strip() + + if command in COMMANDS.keys(): + del args[1] + return COMMANDS[command].main(args, command) + else: + parser.parse_args(args) + print 'Unknown command %s.\n' % command + print parser.get_usage() + return 2 + + # We should never get here. + return 0 + +if __name__ == '__main__': + sys.exit(main()) + diff --git a/src/calibre/ebooks/pdf/pdfmerge.py b/src/calibre/ebooks/pdf/merge.py similarity index 92% rename from src/calibre/ebooks/pdf/pdfmerge.py rename to src/calibre/ebooks/pdf/merge.py index 4a741c4f5a..7ae35d1065 100644 --- a/src/calibre/ebooks/pdf/pdfmerge.py +++ b/src/calibre/ebooks/pdf/merge.py @@ -17,9 +17,8 @@ from pyPdf import PdfFileWriter, PdfFileReader def config(defaults=None): desc = _('Options to control the transformation of pdf') - default_crop=10 if defaults is None: - c = Config('trimpdf', desc) + c = Config('mergepdf', desc) else: c = StringConfig(defaults, desc) c.add_opt('verbose', ['-v', '--verbose'], default=0, action='count', @@ -28,13 +27,13 @@ def config(defaults=None): help=_('Path to output file. By default a file is created in the current directory.')) return c -def option_parser(): +def option_parser(name): c = config() return c.option_parser(usage=_('''\ - %prog [options] file1.pdf file2.pdf ... + %prog %%name [options] file1.pdf file2.pdf ... Merges individual PDFs. Metadata will be used from the first PDF specified. - ''')) + '''.replace('%%name', name))) def merge_files(in_paths, out_path, metadata=None): if metadata == None: @@ -67,8 +66,8 @@ def verify_files(files): invalid.append(pdf_path) return invalid -def main(args=sys.argv): - parser = option_parser() +def main(args=sys.argv, name=''): + parser = option_parser(name) opts, args = parser.parse_args(args) args = args[1:] diff --git a/src/calibre/ebooks/pdf/pdfsplit.py b/src/calibre/ebooks/pdf/split.py similarity index 93% rename from src/calibre/ebooks/pdf/pdfsplit.py rename to src/calibre/ebooks/pdf/split.py index 460dbef148..36517fb704 100644 --- a/src/calibre/ebooks/pdf/pdfsplit.py +++ b/src/calibre/ebooks/pdf/split.py @@ -17,9 +17,8 @@ from pyPdf import PdfFileWriter, PdfFileReader def config(defaults=None): desc = _('Options to control the transformation of pdf') - default_crop=10 if defaults is None: - c = Config('trimpdf', desc) + c = Config('splitpdf', desc) else: c = StringConfig(defaults, desc) c.add_opt('verbose', ['-v', '--verbose'], default=0, action='count', @@ -29,21 +28,21 @@ def config(defaults=None): The file name will be the base name for the output.')) return c -def option_parser(): +def option_parser(name): c = config() return c.option_parser(usage=_('''\ - %prog [options] file.pdf page_to_split_on ... - %prog [options] file.pdf page_range_to_split_on ... + %prog %%name [options] file.pdf page_to_split_on ... + %prog %%name [options] file.pdf page_range_to_split_on ... Ex. - %prog file.pdf 6 - %prog file.pdf 6-12 - %prog file.pdf 6-12 8 10 9-20 + %prog %%name file.pdf 6 + %prog %%name file.pdf 6-12 + %prog %%name file.pdf 6-12 8 10 9-20 Split a PDF. - ''')) + '''.replace('%%name', name))) def split_pdf(in_path, pages, page_ranges, out_name, metadata=None): pdf = PdfFileReader(open(os.path.abspath(in_path), 'rb')) @@ -155,8 +154,8 @@ def valid_pdf(pdf_path): return False return True -def main(args=sys.argv): - parser = option_parser() +def main(args=sys.argv, name=''): + parser = option_parser(name) opts, args = parser.parse_args(args) pdf, pages, page_ranges, unknown = split_args(args[1:]) diff --git a/src/calibre/ebooks/pdf/pdftrim.py b/src/calibre/ebooks/pdf/trim.py similarity index 95% rename from src/calibre/ebooks/pdf/pdftrim.py rename to src/calibre/ebooks/pdf/trim.py index c1e8fa2494..c999d24a46 100644 --- a/src/calibre/ebooks/pdf/pdftrim.py +++ b/src/calibre/ebooks/pdf/trim.py @@ -33,16 +33,16 @@ def config(defaults=None): return c -def option_parser(): +def option_parser(name): c = config() return c.option_parser(usage=_('''\ - %prog [options] file.pdf + %prog %%name [options] file.pdf Crops a pdf. - ''')) + '''.replace('%%name', name))) -def main(args=sys.argv): - parser = option_parser() +def main(args=sys.argv, name=''): + parser = option_parser(name) opts, args = parser.parse_args(args) try: source = os.path.abspath(args[1]) diff --git a/src/calibre/linux.py b/src/calibre/linux.py index 3ba6f55bc8..6bfe665557 100644 --- a/src/calibre/linux.py +++ b/src/calibre/linux.py @@ -39,10 +39,7 @@ entry_points = { 'calibre-fontconfig = calibre.utils.fontconfig:main', 'calibre-parallel = calibre.parallel:main', 'calibre-customize = calibre.customize.ui:main', - 'pdftrim = calibre.ebooks.pdf.pdftrim:main', - 'pdfmerge = calibre.ebooks.pdf.pdfmerge:main', - 'pdfsplit = calibre.ebooks.pdf.pdfsplit:main', - 'fetch-ebook-metadata = calibre.ebooks.metadata.fetch:main', + 'pdfmanipulate = calibre.ebooks.pdf.manipulate:main', ], 'gui_scripts' : [ __appname__+' = calibre.gui2.main:main',