Source code for nbpresent.exporters.pdf_capture

import time

from ghost.bindings import (
    QPainter,
    QPrinter,
    QtCore,
)

from PyPDF2 import (
    PdfFileReader,
    PdfFileMerger,
)

from nbbrowserpdf.exporters.pdf_capture import CaptureServer

VIEWPORT = (1920, 1080)


[docs]class SlideCaptureServer(CaptureServer): """ CaptureServer to generate multi-page PDF based on nbpresent metadata """
[docs] def init_session(self): """ create a session with a some tweaked settings """ return self.ghost.start( # display=True, # TODO: read this off config viewport_size=VIEWPORT, show_scrollbars=False, )
[docs] def page_ready(self): """ Wait until nbpresent-css gets created """ self.session.wait_for_page_loaded() self.session.wait_for_selector("#nbpresent-css") time.sleep(1)
[docs] def print_to_pdf(self, path): """ Custom print based on metadata: generate one per slide """ merger = PdfFileMerger() for i, slide in enumerate(self.notebook.metadata.nbpresent.slides): print("\n\n\nprinting slide", i, slide) # science help you if you have 9999 slides filename = self.in_static("notebook-{0:04d}.pdf".format(i)) # this is weird, but it seems to always need it self.session.show() self.screenshot(filename) merger.append(PdfFileReader(filename, "rb")) # advance the slides result, resources = self.session.evaluate( """ console.log(window.nbpresent); console.log(window.nbpresent.mode.presenter.speaker.advance()); """) # always seem to get some weirdness... perhaps could inttegrate # ioloop... time.sleep(1) # all done! merger.write(path)
[docs] def screenshot(self, filename): """ do an individual slide screenshot big thanks to https://gist.github.com/jmaupetit/4217925 """ printer = QPrinter(mode=QPrinter.ScreenResolution) printer.setOutputFormat(QPrinter.PdfFormat) printer.setPaperSize(QtCore.QSizeF(*reversed(VIEWPORT)), QPrinter.DevicePixel) printer.setOrientation(QPrinter.Landscape) printer.setOutputFileName(filename) printer.setPageMargins(0, 0, 0, 0, QPrinter.DevicePixel) painter = QPainter(printer) painter.scale(1.45, 1.45) self.session.main_frame.render(painter) painter.end()