web-dev-qa-db-fra.com

Afficher l'image pdf dans un bloc-notes iPython

Le code suivant me permet d'afficher une image png dans un bloc-notes iPython. Existe-t-il un moyen d'afficher pdf image? Je n'ai pas besoin d'utiliser nécessairement IPython.display. Je cherche un moyen d'imprimer une image pdf dans un fichier vers la cellule de sortie du bloc-notes iPython.

## This is for an `png` image
from IPython.display import Image

fig = Image(filename=('./temp/my_plot.png'))
fig

Je vous remercie.

39
Curious2learn

Le problème que vous (et d'autres) rencontrez est que les fichiers PDF ne peuvent pas être affichés directement dans le navigateur. Le seul moyen possible d'obtenir quelque chose de similaire est d'utiliser un convertisseur d'image pour créer un PNG ou JPG à partir du PDF et afficher celui-ci.
Cela pourrait être fait via imagemagick et une fonction d'affichage personnalisée.

Mise à jour 1

Une solution simple consiste à utiliser wand ( http://docs.wand-py.org ) une liaison python-imagemagick. J'ai essayé avec Ubuntu 13.04:

wand session in ipython

Sous forme de texte:

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

Pour un pdf de plusieurs pages, vous pouvez obtenir par exemple la deuxième page via:

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

Update 2

Comme les navigateurs récents prennent en charge l'affichage des fichiers PDF avec leur visionneuse PDF intégrée, une solution alternative possible basée sur un iframe peut être implémentée comme

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)

Cette classe implémente les représentations html et latex, donc le pdf survivra également à une conversion nb en latex. Il peut être utilisé comme

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

Avec Firefox 33, cela se traduit par enter image description here

52
Jakob

Pour afficher les fichiers pdf dans les blocs-notes ipython/jupyter, vous pouvez utiliser IFrame

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

Voici la capture d'écran

pdf preview in ipython/jupyter notebook

41
Levon

En supposant un pdf multi-images appelé Rplots.pdf

Les éléments suivants fonctionnent dans la cellule du bloc-notes jupyter. Pour l'installation j'ai utilisé

pip install Wand

Ce code colle dans une cellule

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 
3
Jeremy Ellis

En plus de l'excellente réponse de Jakob recommandant les fixations Wand pour ImageMagick:

Si votre PDF contient des graphiques vectoriels, utilisez le mot clé resolution pour contrôler la taille de l'image rendue. La valeur par défaut d'ImageMagick est de 72 dpi. Des valeurs plus élevées donnent plus de pixels.

from wand.image import Image as WImage
img = WImage(filename='hat.pdf', resolution=100) # bigger
img
1
Haffael