This commit is contained in:
Kovid Goyal 2009-04-02 11:15:02 -07:00
commit b637b2907d
4 changed files with 42 additions and 37 deletions

View File

@ -1,4 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import with_statement
__license__ = 'GPL 3' __license__ = 'GPL 3'
__copyright__ = '2009, John Schember <john@nachtimwald.com>' __copyright__ = '2009, John Schember <john@nachtimwald.com>'
__docformat__ = 'restructuredtext en' __docformat__ = 'restructuredtext en'
@ -9,10 +11,12 @@ Convert OEB ebook format to PDF.
#unit, papersize, orientation, custom_size, profile #unit, papersize, orientation, custom_size, profile
import os import os, glob
from calibre.customize.conversion import OutputFormatPlugin, \ from calibre.customize.conversion import OutputFormatPlugin, \
OptionRecommendation OptionRecommendation
from calibre.ebooks.oeb.output import OEBOutput
from calibre.ptempfile import TemporaryDirectory
from calibre.ebooks.pdf.writer import PDFWriter from calibre.ebooks.pdf.writer import PDFWriter
from calibre.ebooks.pdf.pageoptions import UNITS, unit, PAPER_SIZES, \ from calibre.ebooks.pdf.pageoptions import UNITS, unit, PAPER_SIZES, \
paper_size, ORIENTATIONS, orientation, PageOptions paper_size, ORIENTATIONS, orientation, PageOptions
@ -66,6 +70,11 @@ class PDFOutput(OutputFormatPlugin):
popts.paper_size = paper_size(opts.paper_size) popts.paper_size = paper_size(opts.paper_size)
popts.orientation = orientation(opts.orientation) popts.orientation = orientation(opts.orientation)
with TemporaryDirectory('_pdf_out') as oebdir:
OEBOutput(None).convert(oeb_book, oebdir, input_plugin, opts, log)
opf = glob.glob(os.path.join(oebdir, '*.opf'))[0]
writer = PDFWriter(log, popts) writer = PDFWriter(log, popts)
close = False close = False
@ -79,7 +88,7 @@ class PDFOutput(OutputFormatPlugin):
out_stream.seek(0) out_stream.seek(0)
out_stream.truncate() out_stream.truncate()
writer.dump(oeb_book.spine, out_stream) writer.dump(opf, out_stream)
if close: if close:
out_stream.close() out_stream.close()

View File

@ -13,6 +13,7 @@ import os, shutil, sys
from calibre.ptempfile import PersistentTemporaryDirectory from calibre.ptempfile import PersistentTemporaryDirectory
from calibre.ebooks.pdf.pageoptions import PageOptions from calibre.ebooks.pdf.pageoptions import PageOptions
from calibre.ebooks.metadata.opf2 import OPF
from PyQt4 import QtCore from PyQt4 import QtCore
from PyQt4.Qt import QUrl, QEventLoop, SIGNAL, QObject, QApplication, QPrinter, \ from PyQt4.Qt import QUrl, QEventLoop, SIGNAL, QObject, QApplication, QPrinter, \
@ -37,10 +38,11 @@ class PDFWriter(QObject):
self.tmp_path = PersistentTemporaryDirectory('_any2pdf_parts') self.tmp_path = PersistentTemporaryDirectory('_any2pdf_parts')
self.popts = popts self.popts = popts
def dump(self, spine, out_stream): def dump(self, opfpath, out_stream):
self._delete_tmpdir() self._delete_tmpdir()
self.render_queue = spine[:] opf = OPF(opfpath, os.path.dirname(opfpath))
self.render_queue = [i.path for i in opf.spine]
self.combine_queue = [] self.combine_queue = []
self.out_stream = out_stream self.out_stream = out_stream
@ -56,7 +58,7 @@ class PDFWriter(QObject):
def _render_next(self): def _render_next(self):
item = str(self.render_queue.pop(0)) item = str(self.render_queue.pop(0))
self.combine_queue.append(os.path.join(self.tmp_path, '%s_%i.pdf' % (os.path.basename(item), len(self.combine_queue)))) self.combine_queue.append(os.path.join(self.tmp_path, '%i.pdf' % (len(self.combine_queue) + 1)))
self.logger.info('Processing %s...' % item) self.logger.info('Processing %s...' % item)
@ -64,9 +66,9 @@ class PDFWriter(QObject):
def _render_html(self, ok): def _render_html(self, ok):
if ok: if ok:
item_path = os.path.join(self.tmp_path, '%s_%i.pdf' % (os.path.basename(str(self.view.url().toLocalFile())), len(self.combine_queue) - 1)) item_path = os.path.join(self.tmp_path, '%i.pdf' % len(self.combine_queue))
self.logger.debug('\tRendering item as %s' % item_path) self.logger.debug('\tRendering item %s as %i' % (os.path.basename(str(self.view.url().toLocalFile())), len(self.combine_queue)))
printer = QPrinter(QPrinter.HighResolution) printer = QPrinter(QPrinter.HighResolution)
printer.setPageMargins(self.popts.margin_left, self.popts.margin_top, self.popts.margin_right, self.popts.margin_bottom, self.popts.unit) printer.setPageMargins(self.popts.margin_left, self.popts.margin_top, self.popts.margin_right, self.popts.margin_bottom, self.popts.unit)
@ -80,7 +82,7 @@ class PDFWriter(QObject):
def _delete_tmpdir(self): def _delete_tmpdir(self):
if os.path.exists(self.tmp_path): if os.path.exists(self.tmp_path):
shutil.rmtree(self.tmp_path, True) shutil.rmtree(self.tmp_path, True)
self.tmp_path = PersistentTemporaryDirectory('_any2pdf_parts') self.tmp_path = PersistentTemporaryDirectory('_pdf_out_parts')
def _write(self): def _write(self):
self.logger.info('Combining individual PDF parts...') self.logger.info('Combining individual PDF parts...')

View File

@ -24,23 +24,17 @@ class TXTOutput(OutputFormatPlugin):
'Use \'old_mac\' for compatibility with Mac OS 9 and earlier. ' 'Use \'old_mac\' for compatibility with Mac OS 9 and earlier. '
'For Mac OS X use \'unix\'. \'system\' will default to the newline ' 'For Mac OS X use \'unix\'. \'system\' will default to the newline '
'type used by this OS.' % sorted(TxtNewlines.NEWLINE_TYPES.keys()))), 'type used by this OS.' % sorted(TxtNewlines.NEWLINE_TYPES.keys()))),
OptionRecommendation(name='prepend_author', recommended_value='true', OptionRecommendation(name='prepend_metadata', recommended_value='false',
level=OptionRecommendation.LOW, long_switch='prepend_author', level=OptionRecommendation.LOW, long_switch='prepend_metadata',
choices=['true', 'false'], choices=['true', 'false'],
help=_('Write the author to the beginning of the file. ' help=_('Write the title and author to the beginning of the file. '
'Default is \'true\'. Use \'false\' to disable.')), 'Default is \'true\'. Use \'false\' to disable.')),
OptionRecommendation(name='prepend_title', recommended_value='true',
choices=['true', 'false'],
level=OptionRecommendation.LOW, long_switch='prepend_title',
help=_('Write the title to the beginning of the file. '
'Default is \'true\'. Use \'false\' to disable.'))
]) ])
def convert(self, oeb_book, output_path, input_plugin, opts, log): def convert(self, oeb_book, output_path, input_plugin, opts, log):
metadata = TxtMetadata() metadata = TxtMetadata()
if opts.prepend_author.lower() == 'true': if opts.prepend_metadata.lower() == 'true':
metadata.author = opts.authors if opts.authors else authors_to_string(oeb_book.metadata.authors.value) if oeb_book.metadata.authors != [] else _('Unknown') metadata.author = opts.authors if opts.authors else authors_to_string(oeb_book.metadata.authors.value) if oeb_book.metadata.authors != [] else _('Unknown')
if opts.prepend_title.lower() == 'true':
metadata.title = opts.title if opts.title else oeb_book.metadata.title[0].value if oeb_book.metadata.title != [] else _('Unknown') metadata.title = opts.title if opts.title else oeb_book.metadata.title[0].value if oeb_book.metadata.title != [] else _('Unknown')
writer = TxtWriter(TxtNewlines(opts.newline).newline, log) writer = TxtWriter(TxtNewlines(opts.newline).newline, log)

View File

@ -34,8 +34,8 @@ class TxtWriter(object):
# Prepend metadata # Prepend metadata
if metadata.author != None and metadata.author != '': if metadata.author != None and metadata.author != '':
out = (u'%s%s%s%s' % (metadata.author.upper(), self.newline, self.newline, self.newline)) + out
if metadata.title != None and metadata.title != '': if metadata.title != None and metadata.title != '':
out = (u'%s%s%s%s' % (metadata.author.upper(), self.newline, self.newline, self.newline)) + out
out = (u'%s%s%s%s' % (metadata.title.upper(), self.newline, self.newline, self.newline)) + out out = (u'%s%s%s%s' % (metadata.title.upper(), self.newline, self.newline, self.newline)) + out
# Put two blank lines at end of file # Put two blank lines at end of file