Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

img = Image.open(fp) AttributeError: class Image has no attribute 'open'

Tags:

python

image

pdf

I want to put the pictures into a PDF file. My code follows...

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 = "[email protected]"  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() 
like image 896
wangling Avatar asked May 25 '12 05:05

wangling


1 Answers

You have a namespace conflict. One of your import statements is masking PIL.Image (which is a module, not a class) with some class named Image.

Instead of ...

from PIL import Image 

try ...

import PIL.Image 

then later in your code...

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

When working with a LOT of imports, beware of namespace conflicts. I'm generally very wary of from some_module import * statements.

Good luck with your project and happy coding.

like image 74
parselmouth Avatar answered Sep 22 '22 00:09

parselmouth