在iPython Notebook中查看PDF图片

52
以下代码可以使我在iPython笔记本中查看png图像。有没有一种方法可以查看pdf图像?我不一定需要使用IPython.display。我正在寻找一种将pdf图像打印到iPython笔记本输出单元格的方法。

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

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

谢谢。

4个回答

85

你(和其他人)面临的问题是PDF无法直接在浏览器中显示。唯一可能的方法是使用图像转换器将PDF转换为PNG或JPG并显示该图像。
可以通过imagemagick和自定义显示函数来完成此操作。

更新1

一个简单的解决方案是使用Wand(http://docs.wand-py.org),一种Python-ImageMagick绑定工具。我已经在Ubuntu 13.04上尝试过:

ipython中的wand会话

以文本形式:

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

对于多页PDF,您可以通过以下方式获取第二页:

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

更新2

由于现代浏览器支持使用其嵌入式pdf查看器显示pdf文件,因此可以基于iframe实现可能的替代方案,如下:

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)

这个类实现了HTML和LaTeX表示,因此PDF文件也能在转换成LaTeX时被保留。它可以像以下这样使用:

这个类实现了html和latex的表示,因此pdf将在进行nbconversion到latex时存活下来。它可以像这样使用:

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

使用Firefox 33,这将导致 输入图像描述


非常酷!Wand能够从PDF中选择特定页面吗?如果可以,那么一个例子就太好了。 - nealmcb
1
是的,你可以使用 hat.pdf[1] 来访问 hat.pdf 的第二页。这与标准 IM 相同,例如 https://dev59.com/Y2445IYBdhLWcg3wia6W。 - Jakob
如何显示多个页面?例如, hat.pdf[1-5] - Adam Hughes
@AdamHughes 在这种情况下,您想要看到什么?Wand将PDF转换为图像,因此您是否想要所有页面的大图像? - Jakob
啊,嗯,我明白了。从使用情况来看,我想查看几页PDF;所以我猜是一个长图像? - Adam Hughes
1
@AdamHughes 我已更新我的答案,展示了第二种可能性,基于一个嵌入式PDF查看器的iframe。也许这种方法更适合你。如果不是,我建议使用pdfnup创建一个页面上包含所有所需页面的单页PDF,然后创建魔杖图像。 - Jakob

79

要在ipython/jupyter笔记本中显示pdf,可以使用IFrame

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

这是屏幕截图

在ipython / jupyter笔记本中预览pdf


智能解决方案,可用于更多的用途。 - Matthew Turner
你好,我们能否将存储在Github仓库中的文件链接放置并像这样嵌入吗?我尝试过了,但似乎不起作用。 - Baktaawar
14
非常重要的提示:目标 PDF 文件必须位于运行 Jupyter 笔记本的目录的子目录中。 - ijoseph
1
即使PDF文件在子文件夹中,目前在Safari浏览器中无法正常工作。但在Firefox和Chrome浏览器中可以正常使用。 - Jim

5
除了Jakob的优秀答案推荐使用ImageMagick的魔杖绑定外:
如果您的PDF包含矢量图形,请使用resolution关键字来控制呈现图像的大小。ImageMagick的默认值为72 dpi。较高的值会产生更多的像素。
from wand.image import Image as WImage
img = WImage(filename='hat.pdf', resolution=100) # bigger
img

4
假设有一个名为Rplots.pdf的多图pdf文件。
以下内容适用于jupyter笔记本单元格。我使用以下安装方式:
pip install Wand

这段代码可粘贴到单元格中

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 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接