""" Contains writer for writing nbconvert output to PDF. """ #----------------------------------------------------------------------------- #Copyright (c) 2013, the IPython Development Team. # #Distributed under the terms of the Modified BSD License. # #The full license is in the file COPYING.txt, distributed with this software. #----------------------------------------------------------------------------- #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- import subprocess import os from IPython.utils.traitlets import Integer, List, Bool from .base import PostProcessorBase #----------------------------------------------------------------------------- # Classes #----------------------------------------------------------------------------- class PDFPostProcessor(PostProcessorBase): """Writer designed to write to PDF files""" iteration_count = Integer(3, config=True, help=""" How many times pdflatex will be called. """) command = List(["pdflatex", "{filename}"], config=True, help=""" Shell command used to compile PDF.""") verbose = Bool(False, config=True, help=""" Whether or not to display the output of the compile call. """) def postprocess(self, input): """ Consume and write Jinja output a PDF. See files.py for more... """ command = [c.format(filename=input) for c in self.command] self.log.info("Building PDF: %s", command) with open(os.devnull, 'rb') as null: stdout = subprocess.PIPE if not self.verbose else None for index in range(self.iteration_count): p = subprocess.Popen(command, stdout=stdout, stdin=null) out, err = p.communicate() if p.returncode: if self.verbose: # verbose means I didn't capture stdout with PIPE, # so it's already been displayed and `out` is None. out = u'' else: out = out.decode('utf-8', 'replace') self.log.critical(u"PDF conversion failed: %s\n%s", command, out) return