home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- __license__ = 'GPL v3'
- __copyright__ = '2009, John Schember <john@nachtimwald.com>'
- __docformat__ = 'restructuredtext en'
- import os
- import shutil
- from calibre.ptempfile import PersistentTemporaryDirectory
- from calibre.ebooks.pdf.pageoptions import unit, paper_size, orientation
- from calibre.ebooks.metadata import authors_to_string
- from calibre.ptempfile import PersistentTemporaryFile
- from calibre import __appname__, __version__, fit_image
- from PyQt4 import QtCore
- from PyQt4.Qt import QUrl, QEventLoop, QObject, QPrinter, QMetaObject, QSizeF, Qt, QPainter, QPixmap
- from PyQt4.QtWebKit import QWebView
- from pyPdf import PdfFileWriter, PdfFileReader
-
- def get_pdf_printer():
- return QPrinter(QPrinter.HighResolution)
-
-
- def get_custom_size(opts):
- custom_size = None
- if opts.custom_size != None:
- (width, sep, height) = opts.custom_size.partition('x')
- if height != '':
-
- try:
- width = int(width)
- height = int(height)
- custom_size = (width, height)
- custom_size = None
-
-
-
- return custom_size
-
-
- def setup_printer(opts, for_comic = False):
- is_ok_to_use_qt = is_ok_to_use_qt
- import calibre.gui2
- if not is_ok_to_use_qt():
- raise Exception('Not OK to use Qt')
- is_ok_to_use_qt()
- printer = get_pdf_printer()
- custom_size = get_custom_size(opts)
- if opts.output_profile.short_name == 'default':
- if custom_size is None:
- printer.setPaperSize(paper_size(opts.paper_size))
- else:
- printer.setPaperSize(QSizeF(custom_size[0], custom_size[1]), unit(opts.unit))
- elif for_comic:
- pass
-
- w = opts.output_profile.width
- h = None if for_comic else opts.output_profile.height
- dpi = opts.output_profile.dpi
- printer.setPaperSize(QSizeF(float(w) / dpi, float(h) / dpi), QPrinter.Inch)
- printer.setPageMargins(0, 0, 0, 0, QPrinter.Point)
- printer.setOrientation(orientation(opts.orientation))
- printer.setOutputFormat(QPrinter.PdfFormat)
- return printer
-
-
- def get_printer_page_size(opts, for_comic = False):
- printer = setup_printer(opts, for_comic = for_comic)
- size = printer.paperSize(QPrinter.Millimeter)
- return (size.width() / 10, size.height() / 10)
-
-
- def draw_image_page(printer, painter, p, preserve_aspect_ratio = True):
- page_rect = printer.pageRect()
- if preserve_aspect_ratio:
- aspect_ratio = float(p.width()) / p.height()
- nw = page_rect.width()
- nh = page_rect.height()
- if aspect_ratio > 1:
- nh = int(page_rect.width() / aspect_ratio)
- else:
- nw = page_rect.height() * aspect_ratio
- (__, nnw, nnh) = fit_image(nw, nh, page_rect.width(), page_rect.height())
- dx = int((page_rect.width() - nnw) / 2)
- dy = int((page_rect.height() - nnh) / 2)
- page_rect.moveTo(dx, dy)
- page_rect.setHeight(nnh)
- page_rect.setWidth(nnw)
-
- painter.drawPixmap(page_rect, p, p.rect())
-
-
- class PDFMetadata(object):
-
- def __init__(self, oeb_metadata = None):
- self.title = _('Unknown')
- self.author = _('Unknown')
- if oeb_metadata != None:
- if len(oeb_metadata.title) >= 1:
- self.title = oeb_metadata.title[0].value
-
- if len(oeb_metadata.creator) >= 1:
- self.author = []([ x.value for x in oeb_metadata.creator ])
-
-
-
-
-
- class PDFWriter(QObject):
-
- def __init__(self, opts, log, cover_data = None):
- is_ok_to_use_qt = is_ok_to_use_qt
- import calibre.gui2
- if not is_ok_to_use_qt():
- raise Exception('Not OK to use Qt')
- is_ok_to_use_qt()
- QObject.__init__(self)
- self.logger = log
- self.loop = QEventLoop()
- self.view = QWebView()
- self.view.setRenderHints(QPainter.Antialiasing | QPainter.TextAntialiasing | QPainter.SmoothPixmapTransform)
- self.view.loadFinished.connect(self._render_html, type = Qt.QueuedConnection)
- self.render_queue = []
- self.combine_queue = []
- self.tmp_path = PersistentTemporaryDirectory('_pdf_output_parts')
- self.opts = opts
- self.size = get_printer_page_size(opts)
- self.cover_data = cover_data
-
-
- def dump(self, items, out_stream, pdf_metadata):
- self.metadata = pdf_metadata
- self._delete_tmpdir()
- self.render_queue = items
- self.combine_queue = []
- self.out_stream = out_stream
- QMetaObject.invokeMethod(self, '_render_book', Qt.QueuedConnection)
- self.loop.exec_()
-
-
- def _render_book(self):
- if len(self.render_queue) == 0:
- self._write()
- else:
- self._render_next()
-
- _render_book = QtCore.pyqtSignature('_render_book()')(_render_book)
-
- def _render_next(self):
- item = str(self.render_queue.pop(0))
- self.combine_queue.append(os.path.join(self.tmp_path, '%i.pdf' % (len(self.combine_queue) + 1)))
- self.logger.debug('Processing %s...' % item)
- self.view.load(QUrl.fromLocalFile(item))
-
-
- def get_printer(self, set_horz_margins = False):
- printer = get_pdf_printer()
- printer.setPaperSize(QSizeF(self.size[0] * 10, self.size[1] * 10), QPrinter.Millimeter)
- if set_horz_margins:
- printer.setPageMargins(0, self.opts.margin_top, 0, self.opts.margin_bottom, QPrinter.Point)
- else:
- printer.setPageMargins(0, 0, 0, 0, QPrinter.Point)
- printer.setOrientation(orientation(self.opts.orientation))
- printer.setOutputFormat(QPrinter.PdfFormat)
- printer.setFullPage(not set_horz_margins)
- return printer
-
-
- def _render_html(self, ok):
- if ok:
- item_path = os.path.join(self.tmp_path, '%i.pdf' % len(self.combine_queue))
- self.logger.debug('\tRendering item %s as %i' % (os.path.basename(str(self.view.url().toLocalFile())), len(self.combine_queue)))
- printer = self.get_printer(set_horz_margins = True)
- printer.setOutputFileName(item_path)
- self.view.print_(printer)
-
- self._render_book()
-
-
- def _delete_tmpdir(self):
- if os.path.exists(self.tmp_path):
- shutil.rmtree(self.tmp_path, True)
- self.tmp_path = PersistentTemporaryDirectory('_pdf_output_parts')
-
-
-
- def insert_cover(self):
- if self.cover_data is None:
- return None
- item_path = os.path.join(self.tmp_path, 'cover.pdf')
- printer = self.get_printer()
- printer.setOutputFileName(item_path)
- self.combine_queue.insert(0, item_path)
- p = QPixmap()
- p.loadFromData(self.cover_data)
- if not p.isNull():
- painter = QPainter(printer)
- draw_image_page(printer, painter, p, preserve_aspect_ratio = self.opts.preserve_cover_aspect_ratio)
- painter.end()
-
-
-
- def _write(self):
- self.logger.debug('Combining individual PDF parts...')
- self.insert_cover()
-
- try:
- outPDF = PdfFileWriter(title = self.metadata.title, author = self.metadata.author)
- for item in self.combine_queue:
- inputPDF = PdfFileReader(open(item, 'rb'))
- for page in inputPDF.pages:
- outPDF.addPage(page)
-
-
- outPDF.write(self.out_stream)
- finally:
- self._delete_tmpdir()
- self.loop.exit(0)
-
-
-
-
- class ImagePDFWriter(object):
-
- def __init__(self, opts, log, cover_data = None):
- self.opts = opts
- self.log = log
- self.size = get_printer_page_size(opts, for_comic = True)
-
-
- def dump(self, items, out_stream, pdf_metadata):
- f = PersistentTemporaryFile('_comic2pdf.pdf')
- f.close()
-
- try:
- self.render_images(f.name, pdf_metadata, items)
-
- try:
- x = _[1]
- shutil.copyfileobj(x, out_stream)
- finally:
- pass
-
- finally:
- os.remove(f.name)
-
-
-
- def render_images(self, outpath, mi, items):
- printer = get_pdf_printer()
- printer.setPaperSize(QSizeF(self.size[0] * 10, self.size[1] * 10), QPrinter.Millimeter)
- printer.setPageMargins(0, 0, 0, 0, QPrinter.Point)
- printer.setOrientation(orientation(self.opts.orientation))
- printer.setOutputFormat(QPrinter.PdfFormat)
- printer.setOutputFileName(outpath)
- printer.setDocName(mi.title)
- printer.setCreator(u'%s [%s]' % (__appname__, __version__))
- printer.setFullPage(True)
- painter = QPainter(printer)
- painter.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform)
- for i, imgpath in enumerate(items):
- self.log('Rendering image:', i)
- p = QPixmap()
- p.load(imgpath)
- if not p.isNull():
- if i > 0:
- printer.newPage()
-
- draw_image_page(printer, painter, p)
- continue
- self.log.warn('Failed to load image', i)
-
- painter.end()
-
-
-