View pdf image in an iPython Notebook View pdf image in an iPython Notebook python python

View pdf image in an iPython Notebook


The problem you (and others) face is that PDFs cannot be displayed directly in the browser.The only possible way to get something similar is to use an image-converter to create a PNG or JPG out of the PDF and display this one.
This could be done via imagemagick and a custom display function.

Update 1

A simple solution is to use wand (http://docs.wand-py.org) a python-imagemagick binding. I tried with Ubuntu 13.04:

wand session in ipython

In text form:

from wand.image import Image as WImageimg = WImage(filename='hat.pdf')img

For a multi-page pdf, you can get e.g. the second page via:

img = WImage(filename='hat.pdf[1]')

Update 2

As recent browsers support to display pdfs with their embedded pdf viewer a possible alternative solution based on an iframe can be implemented as

class PDF(object):  def __init__(self, pdf, size=(200,200)):    self.pdf = pdf    self.size = size  def _repr_html_(self):    return '<iframe src={0} width={1[0]} height={1[1]}></iframe>'.format(self.pdf, self.size)  def _repr_latex_(self):    return r'\includegraphics[width=1.0\textwidth]{{{0}}}'.format(self.pdf)

This class implements html and latex representations, hence the pdf will also survive a nbconversion to latex. It can be used like

PDF('hat.pdf',size=(300,250))

With Firefox 33 this results in enter image description here


To show pdf-s inside ipython/jupyter notebooks you can use IFrame

from IPython.display import IFrameIFrame("./samples/simple3.pdf", width=600, height=300)

Here is the screenshot

pdf preview in ipython/jupyter notebook


Assuming a multi-image pdf called Rplots.pdf

The following works in the jupyter notebook cell. For installation I used

pip install Wand

This code pastes into a cell

from wand.image import Image  imageFromPdf = Image(filename='Rplots.pdf')  pages = len(imageFromPdf.sequence)  image = Image(    width=imageFromPdf.width,    height=imageFromPdf.height * pages  )  for i in range(pages):    image.composite(    imageFromPdf.sequence[i],    top=imageFromPdf.height * i,    left=0  )  image.format="png"  image