diff --git a/src/calibre/ebooks/lrf/comic/convert_from.py b/src/calibre/ebooks/lrf/comic/convert_from.py index 5bc4a9171b..7517766323 100755 --- a/src/calibre/ebooks/lrf/comic/convert_from.py +++ b/src/calibre/ebooks/lrf/comic/convert_from.py @@ -10,6 +10,14 @@ Based on ideas from comiclrf created by FangornUK. import os, sys, shutil, traceback, textwrap from uuid import uuid4 +try: + from reportlab.pdfgen import canvas + _reportlab = True +except: + _reportlab = False + + + from calibre import extract, terminal_controller, __appname__, __version__ from calibre.utils.config import Config, StringConfig from calibre.ptempfile import PersistentTemporaryDirectory @@ -43,7 +51,7 @@ PROFILES = { # Name : (width, height) in pixels 'prs500':(584, 754), # The SONY's LRF renderer (on the PRS500) only uses the first 800x600 block of the image - #'prs500-landscape': (784, 1200-92) + 'prs500-landscape': (784, 1012) } def extract_comic(path_to_comic_file): @@ -279,7 +287,7 @@ def process_pages(pages, opts, update): failures += failures_ return ans, failures, tdir -def config(defaults=None): +def config(defaults=None,output_format='lrf'): desc = _('Options to control the conversion of comics (CBR, CBZ) files into ebooks') if defaults is None: c = Config('comic', desc) @@ -316,10 +324,13 @@ def config(defaults=None): help=_('Be verbose, useful for debugging. Can be specified multiple times for greater verbosity.')) c.add_opt('no_progress_bar', ['--no-progress-bar'], default=False, help=_("Don't show progress bar.")) + if output_format == 'pdf': + c.add_opt('no_process',['--no_process'], default=False, + help=_("Apply no processing to the image")) return c -def option_parser(): - c = config() +def option_parser(output_format='lrf'): + c = config(output_format=output_format) return c.option_parser(usage=_('''\ %prog [options] comic.cb[z|r] @@ -382,6 +393,25 @@ def create_lrf(pages, profile, opts, thumbnail=None): book.renderLrf(open(opts.output, 'wb')) print _('Output written to'), opts.output + +def create_pdf(pages, profile, opts, thumbnail=None): + width, height = PROFILES[profile] + + if not _reportlab: + raise RuntimeError('Failed to load reportlab') + + pdf = canvas.Canvas(filename=opts.output, pagesize=(width,height+15)) + pdf.setAuthor(opts.author) + pdf.setTitle(opts.title) + + + for page in pages: + pdf.drawImage(page, x=0,y=0,width=width, height=height) + pdf.showPage() + + # Write the document to disk + pdf.save() + def do_convert(path_to_file, opts, notification=lambda m, p: p, output_format='lrf'): path_to_file = run_plugins_on_preprocess(path_to_file) @@ -393,29 +423,33 @@ def do_convert(path_to_file, opts, notification=lambda m, p: p, output_format='l opts.output = os.path.abspath(os.path.splitext(os.path.basename(source))[0]+'.'+output_format) tdir = extract_comic(source) pages = find_pages(tdir, sort_on_mtime=opts.no_sort, verbose=opts.verbose) + thumbnail = None if not pages: raise ValueError('Could not find any pages in the comic: %s'%source) - pages, failures, tdir2 = process_pages(pages, opts, notification) - if not pages: - raise ValueError('Could not find any valid pages in the comic: %s'%source) - if failures: - print 'Could not process the following pages (run with --verbose to see why):' - for f in failures: - print '\t', f - thumbnail = os.path.join(tdir2, 'thumbnail.png') - if not os.access(thumbnail, os.R_OK): - thumbnail = None - + if not opts.no_process: + pages, failures, tdir2 = process_pages(pages, opts, notification) + if not pages: + raise ValueError('Could not find any valid pages in the comic: %s'%source) + if failures: + print 'Could not process the following pages (run with --verbose to see why):' + for f in failures: + print '\t', f + thumbnail = os.path.join(tdir2, 'thumbnail.png') + if not os.access(thumbnail, os.R_OK): + thumbnail = None if output_format == 'lrf': create_lrf(pages, opts.profile, opts, thumbnail=thumbnail) - else: + if output_format == 'epub': create_epub(pages, opts.profile, opts, thumbnail=thumbnail) + if output_format == 'pdf': + create_pdf(pages, opts.profile, opts, thumbnail=thumbnail) shutil.rmtree(tdir) - shutil.rmtree(tdir2) + if not opts.no_process: + shutil.rmtree(tdir2) def main(args=sys.argv, notification=None, output_format='lrf'): - parser = option_parser() + parser = option_parser(output_format=output_format) opts, args = parser.parse_args(args) if len(args) < 2: parser.print_help() @@ -429,7 +463,6 @@ def main(args=sys.argv, notification=None, output_format='lrf'): source = os.path.abspath(args[1]) do_convert(source, opts, notification, output_format=output_format) - return 0 if __name__ == '__main__': diff --git a/src/calibre/ebooks/pdf/__init__.py b/src/calibre/ebooks/pdf/__init__.py new file mode 100644 index 0000000000..3b55c26564 --- /dev/null +++ b/src/calibre/ebooks/pdf/__init__.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python +__license__ = 'GPL v3' +__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' +__docformat__ = 'restructuredtext en' + +''' +Used for pdf output for comic2pdf +''' + diff --git a/src/calibre/ebooks/pdf/from_comic.py b/src/calibre/ebooks/pdf/from_comic.py new file mode 100644 index 0000000000..9e1bd76188 --- /dev/null +++ b/src/calibre/ebooks/pdf/from_comic.py @@ -0,0 +1,21 @@ +from __future__ import with_statement +__license__ = 'GPL v3' +__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' +__docformat__ = 'restructuredtext en' + +'Convert a comic in CBR/CBZ format to pdf' + +import sys +from functools import partial +from calibre.ebooks.lrf.comic.convert_from import do_convert, option_parser, config, main as _main + +convert = partial(do_convert, output_format='pdf') +main = partial(_main, output_format='pdf') + +if __name__ == '__main__': + sys.exit(main()) + +if False: + option_parser + config + diff --git a/src/calibre/linux.py b/src/calibre/linux.py index 224e301562..a9d91282e5 100644 --- a/src/calibre/linux.py +++ b/src/calibre/linux.py @@ -59,6 +59,7 @@ entry_points = { 'oeb2lit = calibre.ebooks.lit.writer:main', 'comic2lrf = calibre.ebooks.lrf.comic.convert_from:main', 'comic2epub = calibre.ebooks.epub.from_comic:main', + 'comic2pdf = calibre.ebooks.pdf.from_comic:main', 'calibre-debug = calibre.debug:main', 'calibredb = calibre.library.cli:main', 'calibre-fontconfig = calibre.utils.fontconfig:main', @@ -228,6 +229,7 @@ def setup_completion(fatal_errors): f.write(opts_and_exts('lit2oeb', lit2oeb, ['lit'])) f.write(opts_and_exts('comic2lrf', comicop, ['cbz', 'cbr'])) f.write(opts_and_exts('comic2epub', comic2epub, ['cbz', 'cbr'])) + f.write(opts_and_exts('comic2pdf', comic2epub, ['cbz', 'cbr'])) f.write(opts_and_words('feeds2disk', feeds2disk, feed_titles)) f.write(opts_and_words('feeds2lrf', feeds2lrf, feed_titles)) f.write(opts_and_words('feeds2lrf', feeds2epub, feed_titles))