##// END OF EJS Templates
Backport PR #4178: add missing data_javascript...
Backport PR #4178: add missing data_javascript Note that javascript is still excluded from html output by default, but this makes it possible to include javascript output in custom templates. candidate for backport to 1.1

File last commit:

r12061:c3812c55
r12465:b2940d33
Show More
pdf.py
60 lines | 2.3 KiB | text/x-python | PythonLexer
"""
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 call(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