【问题标题】:img = Image.open(fp) AttributeError: class Image has no attribute 'open'img = Image.open(fp) AttributeError: 类 Image 没有属性 'open'
【发布时间】:2012-05-31 16:56:40
【问题描述】:

我想将图片放入 PDF 文件。我的代码如下...

import sys
import xlrd
from PIL import Image
import ImageEnhance
from reportlab.platypus import *
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.rl_config import defaultPageSize
PAGE_HEIGHT=defaultPageSize[1]

styles = getSampleStyleSheet()

Title = "Integrating Diverse Data Sources with Gadfly 2"

Author = "Aaron Watters"

URL = "http://www.chordate.com/"

email = "arw@ifu.net"

from reportlab.lib.units import inch

pageinfo = "%s / %s / %s" % (Author, email, Title)

def myFirstPage(canvas, doc):
    canvas.saveState()
    #canvas.setStrokeColorRGB(1,0,0)
    #canvas.setLineWidth(5)
    #canvas.line(66,72,66,PAGE_HEIGHT-72)
    canvas.setFont('Times-Bold',16)
    canvas.drawString(108, PAGE_HEIGHT-108, Title)
    canvas.setFont('Times-Roman',9)
    canvas.drawString(inch, 0.75 * inch, "First Page / %s" % pageinfo)
    canvas.restoreState()

def myLaterPages(canvas, doc):
    #canvas.drawImage("snkanim.gif", 36, 36)
    canvas.saveState()
    #canvas.setStrokeColorRGB(1,0,0)
    #canvas.setLineWidth(5)
    #canvas.line(66,72,66,PAGE_HEIGHT-72)
    canvas.setFont('Times-Roman',9)
    canvas.drawString(inch, 0.75 * inch, "Page %d %s" % (doc.page, pageinfo))
    canvas.restoreState()

def go():
    Elements.insert(0,Spacer(0,inch))
    doc = SimpleDocTemplate('ss.pdf')
    doc.build(Elements,onFirstPage=myFirstPage, onLaterPages=myLaterPages)

Elements = []

HeaderStyle = styles["Heading1"] # XXXX

def header(txt, style=HeaderStyle, klass=Paragraph, sep=0.3):
    s = Spacer(0.2*inch, sep*inch)
    Elements.append(s)
    para = klass(txt, style)
    Elements.append(para)

ParaStyle = styles["Normal"]

def p(txt):
    return header(txt, style=ParaStyle, sep=0.1)

def open_excel(file= 'exc.xls'):
    try:
        data = xlrd.open_workbook(file)
        return data
    except Exception,e:
        print str(e)

#pre = p # XXX

PreStyle = styles["Code"]

def pre(txt):
    s = Spacer(0.1*inch, 0.1*inch)
    Elements.append(s)
    p = Preformatted(txt, PreStyle)
    Elements.append(p)
p("""\
Relational databases manipulate and store persistent
table structures called relations, such as the following
three tables""")

fp = open("/pdf-ex/downloadwin7.png","rb")
img = Image.open(fp)
img.show()
# HACK
Elements.append(PageBreak())


go()

【问题讨论】:

  • 在这里告诉我们你遇到了困难,并给我们最少的代码来证明这个问题。
  • 你不能通过提供所有这些东西来寻求帮助,尤其是。所有这些不常见的模块!我只有 PIL Image 和打开和显示图像的 2 个语句,没有问题。根据我的经验,当 PIL Image 在其他模块之前导入时,会发生错误 "class Image has no attribute 'open'",例如Tkinter(可能存在一些冲突)。最后尝试导入它。

标签: python pdf image


【解决方案1】:

您有命名空间冲突。您的导入语句之一是使用名为 Image 的类来屏蔽 PIL.Image(这是一个模块,而不是类)。

而不是...

from PIL import Image

试试...

import PIL.Image

然后在您的代码中...

fp = open("/pdf-ex/downloadwin7.png","rb")
img = PIL.Image.open(fp)
img.show()

处理大量导入时,请注意命名空间冲突。我通常对from some_module import * 声明非常警惕。

祝你的项目好运,编码愉快。

【讨论】:

  • 感谢您的评论。运行程序没有错,但是图片打不开。
  • @wangling 我给出的解决方案解决了您帖子标题所描述的问题。至于将图像添加到 .pdf 文件的整体问题,我无法回答,因为回答所需的信息远远超出了帖子中提供的信息。但是,根据我对reportlab 的粗略了解,我认为您走在正确的轨道上。继续努力,很快就会解决。
  • 我在主文件中导入from PIL import Image, ImageTk 时遇到了这个问题,在导入到主文件的辅助文件中导入from PIL import Image 时遇到了这个问题。在各自的文件中将导入指定为 import PIL.Image, PIL.ImageTkimport PIL.Image 解决了此答案中描述的问题。评论因为我不知道命名空间冲突可能源于在两个文件中导入相同的类/模块,其中一个导入另一个。
【解决方案2】:

我在单个文件中遇到了与 TKInter 类似的问题:

我变了:

from PIL import ImageTk, Image
from tkinter import *

到:

from tkinter import *
from PIL import ImageTk, Image

问题就解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 2022-12-12
    相关资源
    最近更新 更多