From 13c5fdb2be2bdbad1a94034ecaa65e16a4ddd51d Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 25 Apr 2015 12:56:06 +0530 Subject: [PATCH] E-book viewer: When printing, print to a PDF file instead of directly to the printer. This fixes printing not working on some systems. Fixes #1448330 [Ebook Viewer Print not working](https://bugs.launchpad.net/calibre/+bug/1448330) --- imgsrc/print-preview.svg | 14298 -------------------------- resources/images/print-preview.png | Bin 8874 -> 0 bytes src/calibre/gui2/viewer/main.py | 10 +- src/calibre/gui2/viewer/printing.py | 268 +- src/calibre/gui2/viewer/ui.py | 3 +- 5 files changed, 177 insertions(+), 14402 deletions(-) delete mode 100644 imgsrc/print-preview.svg delete mode 100644 resources/images/print-preview.png diff --git a/imgsrc/print-preview.svg b/imgsrc/print-preview.svg deleted file mode 100644 index 6ffe4fafa8..0000000000 --- a/imgsrc/print-preview.svg +++ /dev/null @@ -1,14298 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/images/print-preview.png b/resources/images/print-preview.png deleted file mode 100644 index 88e7cc0c97fcd8c339e692f697bcebf465ccacd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8874 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 from_ and (to == 0 or pagenum <= to)): - if not first: - printer.newPage() - first = False - self.mf.render(painter) - try: - nsl = int(evaljs('paged_display.next_screen_location()')) - except (TypeError, ValueError): - break - if nsl <= 0: - break - evaljs('window.scrollTo(%d, 0)'%nsl) + def save_used_values(self): + data = self.data + vprefs['print-to-pdf-page-size'] = data['paper_size'] + vprefs['print-to-pdf-page-numbers'] = data['page_numbers'] + for edge in 'left top right bottom'.split(): + vprefs['print-to-pdf-%s-margin' % edge] = data['margin_' + edge] - painter.end() + def accept(self): + fname = self.file_name.text().strip() + if not fname: + return error_dialog(self, _('No filename specified'), _( + 'You must specify a filename for the PDF file to generate'), show=True) + if not fname.lower().endswith('.pdf'): + return error_dialog(self, _('Incorrect filename specified'), _( + 'The filename for the PDF file must end with .pdf'), show=True) + self.save_used_values() + return Dialog.accept(self) + +class DoPrint(Thread): + + daemon = True + + def __init__(self, data): + Thread.__init__(self, name='DoPrint') + self.data = data + self.tb = self.log = None + + def run(self): + try: + with PersistentTemporaryFile('print-to-pdf-log.txt') as f: + p = self.worker = start_pipe_worker('from calibre.gui2.viewer.printing import do_print; do_print()', stdout=f, stderr=subprocess.STDOUT) + p.stdin.write(cPickle.dumps(self.data, -1)), p.stdin.flush(), p.stdin.close() + rc = p.wait() + if rc != 0: + f.seek(0) + self.log = f.read().decode('utf-8', 'replace') + try: + os.remove(f.name) + except EnvironmentError: + pass + except Exception: + import traceback + self.tb = traceback.format_exc() + +def do_print(): + data = cPickle.loads(sys.stdin.read()) + args = ['ebook-convert', data['input'], data['output'], '--override-profile-size', '--paper-size', data['paper_size'], '--pdf-add-toc', + '--disable-remove-fake-margins', '--disable-font-rescaling', '--page-breaks-before', '/', '--chapter-mark', 'none', '-vv'] + if data['page_numbers']: + args.append('--pdf-page-numbers') + for edge in 'left top right bottom'.split(): + args.append('--margin-' + edge), args.append('%.1f' % (data['margin_' + edge] * 72)) + from calibre.ebooks.conversion.cli import main + main(args) + +class Printing(QProgressDialog): + + def __init__(self, thread, parent=None): + QProgressDialog.__init__(self, _('Printing, this will take a while, please wait...'), _('&Cancel'), 0, 0, parent) + self.setWindowTitle(_('Printing...')) + self.setWindowIcon(QIcon(I('print.png'))) + self.thread = thread + self.timer = t = QTimer(self) + t.timeout.connect(self.check) + self.canceled.connect(self.do_cancel) + t.start(100) + + def check(self): + if self.thread.is_alive(): + return + if self.thread.tb or self.thread.log: + error_dialog(self, _('Failed to convert to PDF'), _( + 'Failed to generate PDF file, click "Show details" for more information.'), det_msg=self.thread.tb or self.thread.log, show=True) + else: + open_local_file(self.thread.data['output']) + self.accept() + + def do_cancel(self): + if hasattr(self.thread, 'worker'): + try: + if self.thread.worker.poll() is None: + self.thread.worker.kill() + except EnvironmentError: + import traceback + traceback.print_exc() + self.timer.stop() + self.reject() + +def print_book(path_to_book, parent=None, book_title=None): + book_title = book_title or os.path.splitext(os.path.basename(path_to_book))[0] + d = PrintDialog(book_title, parent) + if d.exec_() == d.Accepted: + data = d.data + data['input'] = path_to_book + t = DoPrint(data) + t.start() + Printing(t, parent).exec_() if __name__ == '__main__': - from calibre.gui2 import Application - from calibre.ebooks.oeb.iterator.book import EbookIterator - from PyQt5.Qt import QPrinter, QTimer - import sys app = Application([]) - - def doit(): - with EbookIterator(sys.argv[-1]) as it: - p = Printing(it, None) - printer = QPrinter() - of = sys.argv[-1]+'.pdf' - printer.setOutputFileName(of) - p.do_print(printer) - print ('Printed to:', of) - app.exit() - QTimer.singleShot(0, doit) - app.exec_() - + print_book(sys.argv[-1]) + del app diff --git a/src/calibre/gui2/viewer/ui.py b/src/calibre/gui2/viewer/ui.py index f38ae6c3be..19092aebf1 100644 --- a/src/calibre/gui2/viewer/ui.py +++ b/src/calibre/gui2/viewer/ui.py @@ -394,8 +394,7 @@ class Main(MainWindow): a('load_theme', _('Load a theme'), 'wizard.png', menu_name='themes', popup_mode=QToolButton.InstantPopup) self.tool_bar.addSeparator() - a('print', _('Print'), 'print.png', menu_name='print') - self.print_menu.addAction(QIcon(I('print-preview.png')), _('Print Preview')) + a('print', _('Print to PDF file'), 'print.png') a('find_next', _('Find next occurrence'), 'arrow-down.png', tb=self.tool_bar2) a('find_previous', _('Find previous occurrence'), 'arrow-up.png', tb=self.tool_bar2)