Reputation: 33598
The following code allows me to view a png
image in an iPython notebook. Is there a way to view pdf
image? I don't need to use IPython.display necessarily. I am looking for a way to print a pdf image in a file to the iPython notebook output cell.
## This is for an `png` image
from IPython.display import Image
fig = Image(filename=('./temp/my_plot.png'))
fig
Thank you.
Upvotes: 54
Views: 87515
Reputation: 153
I think there is a better way to do this, since
I would do it like this:
from PIL import Image
import matplotlib.pyplot as plt
import fitz
your_path = # YOUR PATH
doc = fitz.open(your_path)
MAX_PAGES = 1
zoom = 2 # to increase the resolution
mat = fitz.Matrix(zoom, zoom)
for i, page in enumerate(doc):
pix = page.get_pixmap(matrix=mat)
img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
# display images
plt.figure(figsize=(7,7), facecolor="w")
plt.xticks(color="white")
plt.yticks(color="white")
plt.tick_params(bottom = False)
plt.tick_params(left = False)
plt.imshow(img)
if i > MAX_PAGES - 1:
break
Upvotes: 1
Reputation: 410
In addition to Jakob's excellent answer recommending the Wand bindings for ImageMagick:
If your PDF contains vector graphics, use the resolution
keyword to control the size of the rendered image. ImageMagick's default value is 72 dpi. Higher values yield more pixels.
from wand.image import Image as WImage
img = WImage(filename='hat.pdf', resolution=100) # bigger
img
Upvotes: 5
Reputation: 11914
To show pdf-s inside ipython/jupyter notebooks you can use IFrame
from IPython.display import IFrame
IFrame("./samples/simple3.pdf", width=600, height=300)
Here is the screenshot
Upvotes: 82
Reputation: 41
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
Upvotes: 4
Reputation: 20801
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.
A simple solution is to use wand (http://docs.wand-py.org) a python-imagemagick binding. I tried with Ubuntu 13.04:
In text form:
from wand.image import Image as WImage
img = 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]')
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
Upvotes: 88