mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
IGN:comic2pdf (thanks to moggie)
This commit is contained in:
commit
036a82a7e2
@ -10,6 +10,14 @@ Based on ideas from comiclrf created by FangornUK.
|
|||||||
import os, sys, shutil, traceback, textwrap
|
import os, sys, shutil, traceback, textwrap
|
||||||
from uuid import uuid4
|
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 import extract, terminal_controller, __appname__, __version__
|
||||||
from calibre.utils.config import Config, StringConfig
|
from calibre.utils.config import Config, StringConfig
|
||||||
from calibre.ptempfile import PersistentTemporaryDirectory
|
from calibre.ptempfile import PersistentTemporaryDirectory
|
||||||
@ -43,7 +51,7 @@ PROFILES = {
|
|||||||
# Name : (width, height) in pixels
|
# Name : (width, height) in pixels
|
||||||
'prs500':(584, 754),
|
'prs500':(584, 754),
|
||||||
# The SONY's LRF renderer (on the PRS500) only uses the first 800x600 block of the image
|
# 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):
|
def extract_comic(path_to_comic_file):
|
||||||
@ -279,7 +287,7 @@ def process_pages(pages, opts, update):
|
|||||||
failures += failures_
|
failures += failures_
|
||||||
return ans, failures, tdir
|
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')
|
desc = _('Options to control the conversion of comics (CBR, CBZ) files into ebooks')
|
||||||
if defaults is None:
|
if defaults is None:
|
||||||
c = Config('comic', desc)
|
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.'))
|
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,
|
c.add_opt('no_progress_bar', ['--no-progress-bar'], default=False,
|
||||||
help=_("Don't show progress bar."))
|
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
|
return c
|
||||||
|
|
||||||
def option_parser():
|
def option_parser(output_format='lrf'):
|
||||||
c = config()
|
c = config(output_format=output_format)
|
||||||
return c.option_parser(usage=_('''\
|
return c.option_parser(usage=_('''\
|
||||||
%prog [options] comic.cb[z|r]
|
%prog [options] comic.cb[z|r]
|
||||||
|
|
||||||
@ -382,6 +393,25 @@ def create_lrf(pages, profile, opts, thumbnail=None):
|
|||||||
book.renderLrf(open(opts.output, 'wb'))
|
book.renderLrf(open(opts.output, 'wb'))
|
||||||
print _('Output written to'), opts.output
|
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'):
|
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)
|
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)
|
opts.output = os.path.abspath(os.path.splitext(os.path.basename(source))[0]+'.'+output_format)
|
||||||
tdir = extract_comic(source)
|
tdir = extract_comic(source)
|
||||||
pages = find_pages(tdir, sort_on_mtime=opts.no_sort, verbose=opts.verbose)
|
pages = find_pages(tdir, sort_on_mtime=opts.no_sort, verbose=opts.verbose)
|
||||||
|
thumbnail = None
|
||||||
if not pages:
|
if not pages:
|
||||||
raise ValueError('Could not find any pages in the comic: %s'%source)
|
raise ValueError('Could not find any pages in the comic: %s'%source)
|
||||||
pages, failures, tdir2 = process_pages(pages, opts, notification)
|
if not opts.no_process:
|
||||||
if not pages:
|
pages, failures, tdir2 = process_pages(pages, opts, notification)
|
||||||
raise ValueError('Could not find any valid pages in the comic: %s'%source)
|
if not pages:
|
||||||
if failures:
|
raise ValueError('Could not find any valid pages in the comic: %s'%source)
|
||||||
print 'Could not process the following pages (run with --verbose to see why):'
|
if failures:
|
||||||
for f in failures:
|
print 'Could not process the following pages (run with --verbose to see why):'
|
||||||
print '\t', f
|
for f in failures:
|
||||||
thumbnail = os.path.join(tdir2, 'thumbnail.png')
|
print '\t', f
|
||||||
if not os.access(thumbnail, os.R_OK):
|
thumbnail = os.path.join(tdir2, 'thumbnail.png')
|
||||||
thumbnail = None
|
if not os.access(thumbnail, os.R_OK):
|
||||||
|
thumbnail = None
|
||||||
if output_format == 'lrf':
|
if output_format == 'lrf':
|
||||||
create_lrf(pages, opts.profile, opts, thumbnail=thumbnail)
|
create_lrf(pages, opts.profile, opts, thumbnail=thumbnail)
|
||||||
else:
|
if output_format == 'epub':
|
||||||
create_epub(pages, opts.profile, opts, thumbnail=thumbnail)
|
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(tdir)
|
||||||
shutil.rmtree(tdir2)
|
if not opts.no_process:
|
||||||
|
shutil.rmtree(tdir2)
|
||||||
|
|
||||||
|
|
||||||
def main(args=sys.argv, notification=None, output_format='lrf'):
|
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)
|
opts, args = parser.parse_args(args)
|
||||||
if len(args) < 2:
|
if len(args) < 2:
|
||||||
parser.print_help()
|
parser.print_help()
|
||||||
@ -429,7 +463,6 @@ def main(args=sys.argv, notification=None, output_format='lrf'):
|
|||||||
|
|
||||||
source = os.path.abspath(args[1])
|
source = os.path.abspath(args[1])
|
||||||
do_convert(source, opts, notification, output_format=output_format)
|
do_convert(source, opts, notification, output_format=output_format)
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
9
src/calibre/ebooks/pdf/__init__.py
Normal file
9
src/calibre/ebooks/pdf/__init__.py
Normal file
@ -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
|
||||||
|
'''
|
||||||
|
|
21
src/calibre/ebooks/pdf/from_comic.py
Normal file
21
src/calibre/ebooks/pdf/from_comic.py
Normal file
@ -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
|
||||||
|
|
@ -59,6 +59,7 @@ entry_points = {
|
|||||||
'oeb2lit = calibre.ebooks.lit.writer:main',
|
'oeb2lit = calibre.ebooks.lit.writer:main',
|
||||||
'comic2lrf = calibre.ebooks.lrf.comic.convert_from:main',
|
'comic2lrf = calibre.ebooks.lrf.comic.convert_from:main',
|
||||||
'comic2epub = calibre.ebooks.epub.from_comic:main',
|
'comic2epub = calibre.ebooks.epub.from_comic:main',
|
||||||
|
'comic2pdf = calibre.ebooks.pdf.from_comic:main',
|
||||||
'calibre-debug = calibre.debug:main',
|
'calibre-debug = calibre.debug:main',
|
||||||
'calibredb = calibre.library.cli:main',
|
'calibredb = calibre.library.cli:main',
|
||||||
'calibre-fontconfig = calibre.utils.fontconfig: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('lit2oeb', lit2oeb, ['lit']))
|
||||||
f.write(opts_and_exts('comic2lrf', comicop, ['cbz', 'cbr']))
|
f.write(opts_and_exts('comic2lrf', comicop, ['cbz', 'cbr']))
|
||||||
f.write(opts_and_exts('comic2epub', comic2epub, ['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('feeds2disk', feeds2disk, feed_titles))
|
||||||
f.write(opts_and_words('feeds2lrf', feeds2lrf, feed_titles))
|
f.write(opts_and_words('feeds2lrf', feeds2lrf, feed_titles))
|
||||||
f.write(opts_and_words('feeds2lrf', feeds2epub, feed_titles))
|
f.write(opts_and_words('feeds2lrf', feeds2epub, feed_titles))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user