【问题标题】:View pdf image in an iPython Notebook在 iPython Notebook 中查看 pdf 图像
【发布时间】:2013-10-28 12:05:13
【问题描述】:

以下代码允许我在 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

谢谢。

【问题讨论】:

    标签: python pdf ipython-notebook


    【解决方案1】:

    除了 Jakob 为 ImageMagick 推荐 Wand 绑定的出色回答:

    如果您的 PDF 包含矢量图形,请使用 resolution 关键字来控制渲染图像的大小。 ImageMagick 的默认值为 72 dpi。更高的值会产生更多的像素。

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

    【讨论】:

      【解决方案2】:

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

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

      这是截图

      【讨论】:

      • 智能解决方案,还有更多用途
      • 嗨,我们可以将存储在 Github 存储库中的文件的链接并像这样嵌入吗?我试过了,但它似乎不起作用
      • 非常重要的注意事项:目标 PDF 文件必须位于运行目录 jupyter notebook 的子目录中
      • 即使 pdf 位于子文件夹中,它现在也无法在 Safari 中使用。在 Firefox 和 chrome 中它可以工作。
      【解决方案3】:

      假设一个名为 Rplots.pdf 的多图像 pdf

      以下适用于 jupyter notebook 单元格。对于安装,我使用了

      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 
      

      【讨论】:

        【解决方案4】:

        您(和其他人)面临的问题是 PDF 无法直接在浏览器中显示。 获得类似内容的唯一可能方法是使用图像转换器从 PDF 中创建 PNG 或 JPG 并显示此文件。
        这可以通过 imagemagick 和自定义显示功能来完成。

        更新 1

        一个简单的解决方案是使用 wand (http://docs.wand-py.org) 一个 python-imagemagick 绑定。我试过 Ubuntu 13.04:

        文本形式:

        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 也可以在 nbconversion 到 Latex 后继续存在。可以这样使用

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

        对于 Firefox 33,这会导致

        【讨论】:

        • 非常酷!魔杖可以从 pdf 中选择特定页面吗?如果是这样,一个很好的例子。
        • 是的,你可以使用hat.pdf[1]访问hat.pdf的第二页。它与标准 IM 完全相同,例如stackoverflow.com/q/4809314/2870069
        • 如何显示多个页面?即hat.pdf[1-5]
        • @AdamHughes 在这种情况下你想看到什么? Wand 将 pdf 转换为图像,因此您想要所有页面的大图像
        • @AdamHughes 我已经更新了我的答案,以显示基于带有嵌入式 pdf 查看器的 iframe 的第二种可能性。也许这种方法更适合你。如果没有,我建议使用 pdfnup 创建一个单页 pdf,其中所有页面都按需要排列,然后创建魔杖图像。
        猜你喜欢
        • 2013-10-03
        • 1970-01-01
        • 1970-01-01
        • 2018-07-06
        • 1970-01-01
        • 2016-04-08
        • 2014-02-17
        • 1970-01-01
        • 2015-08-31
        相关资源
        最近更新 更多