Luc*_*cas 2 python google-app-engine image reportlab
我正在尝试使用App Engine Python上的reportlab生成PDF报告.
但我不知道如何正确附加图像.
图像是静态的.
这是我项目的目录树.

这就是我所做的(在' chipas.py ' 里面)来获取图像:
im = Image('../static/logo.png',1*inch, 1*inch)
story.append(im)
...
Run Code Online (Sandbox Code Playgroud)
我得到的堆栈跟踪:
回溯(最近一次调用最后一次):文件"C:\ Users\Lucas\Dropbox\Desarrollo\Python\windows\AppEngine\google\appengine\ext\webapp_webapp25.py",第701行,在call handler.get(*groups)中文件"C:\ Users\Lucas\Dropbox\Desarrollo\workspace\python\chipas-windows\src\chipas.py",第1035行,在获取doc.build(story)文件"C:\ Users\Lucas\Dropbox\Desarrollo\workspace\python\chipas-windows\src\reportlab\platypus\doctemplate.py",第1117行,在构建BaseDocTemplate.build(self,flowables,canvasmaker = canvasmaker)文件"C:\ Users\Lucas\Dropbox\Desarrollo\workspace\python\chipas-windows\src\reportlab\platypus\doctemplate.py",第880行,在构建self.handle_flowable(flowables)文件"C:\ Users\Lucas\Dropbox\Desarrollo\workspace\python\chipas- windows\src\reportlab\platypus\doctemplate.py",第763行,如果是frame.add,则在handle_flowable中(f,canv,trySplit = self.allowSplitting):文件"C:\ Users\Lucas\Dropbox\Desarrollo\workspace\python\chipas-windows\src\reportlab\platypus\frames.py",第159行,在_add w中,h = flowable.wra p(aW,h)文件"C:\ Users\Lucas\Dropbox\Desarrollo\workspace\python\chipas-windows\src\reportlab\platypus\flowables.py",第408行,在wrap中返回self.drawWidth,self. drawHeight文件"C:\ Users\Lucas\Dropbox\Desarrollo\workspace\python\chipas-windows\src\reportlab\platypus\ flowables.py ",第402行,在getattr self._setup_inner()文件"C:\ Users\Lucas\Dropbox\Desarrollo\workspace\python\chipas-windows\src\reportlab\platypus\flowables.py",第368行,在_setup_inner中img = self._img文件"C:\ Users\Lucas\Dropbox\Desarrollo\workspace\python\chipas-windows\src\reportlab\platypus\ flowables.py ",第398行,在getattr self._img = ImageReader(self._file)文件"C:\ Users\Lucas\Dropbox\Desarrollo\workspace\python\chipas -windows\src\reportlab\lib\utils.py",第541行,在init中, 如果_isPILImage(fileName):文件"C:\ Users\Lucas\Dropbox\Desarrollo\workspace\python\chipas-windows\src\reportlab\lib\utils.py",第521行,在_isPILImage中返回isinstance(im,Image.Image)AttributeError:'NoneType'对象没有attribut e'Image'INFO 2012-02-29 19:54:37,276 dev_appserver.py:4247]"GET/pdf?pedido = ahVkZXZ-Y2hpcGFzLWludGhlY2xvdWRyLwsSBlBlZGlkbyIjMjAxMi0wMi0yOSAxOTo1NDoxOHRlc3RAZXhhbXBsZS5jb20M HTTP/1.1"500 -
在使用reportlab生成的pdf文档中添加图像文件的正确方法是什么?提前谢谢了!
有两种方法可以做到这一点。
canvas.drawInlineImage(APP_ROOT + "/static/footer_image.png", inch*.25, inch*.25, PAGE_WIDTH-(.5*inch), (.316*inch))
Run Code Online (Sandbox Code Playgroud)
(答案取自:http : //www.tylerlesmann.com/2009/jan/28/writing-pdfs-python-adding-images/)
import os
import urllib2
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Image
filename = './python-logo.png'
def get_python_image():
""" Get a python logo image for this example """
if not os.path.exists(filename) :
response = urllib2.urlopen('http://www.python.org/community/logos/python-logo.png')
f = open(filename, 'w')
f.write(response.read())
f.close()
get_python_image()
doc = SimpleDocTemplate("image.pdf", pagesize=letter)
parts = []
parts.append(Image(filename))
doc.build(parts)
Run Code Online (Sandbox Code Playgroud)
小智 7
ReportLab要求PIL用于JPEG以外的图像(PIL在Appengine制作时不可用),但它本身支持JPEG(请参阅下面的注释).因此,在渲染PDF文件时,您需要为ReportLab提供JPEG图像.使用用户提交的图像,我首先使用Appengine的API在渲染之前将图像转换为JPEG.
所以第1步是将徽标从png更改为jpeg.
其次,Appengine不允许您从静态目录中读取文件.如果您尝试,它会出现"文件无法访问"错误.将.jpg切换到/ static /以外的目录.
因此,无论您使用哪种方法来定义文件的相对路径(gfortune的代码都适用于此),要渲染图像,只需使用:
f = open(path_to_file,'rb')
story.append(图片(f))
注意:几年前,ReportLab有一个错误,它仍会尝试访问PIL,即使对于JPEG文件也是如此.我与开发人员通信,他们提供了绕过PIL for JPEG文件的版本.我不确定哪个版本是当前版本,所以请记住这一点.
看起来这篇文章的原始错误是由于 PIL 可能未安装或者旧版本 PIL 中的错误所致。类似情况请参见http://www.openerp.com/forum/topic18147.html 。尝试安装最新版本的 PIL。
另请参阅Appengine - Reportlab(从模型获取照片)接近已接受的解决方案和评论的末尾。
尽管这可能与所提出的问题没有直接关系,但您确定im加载正确吗?请记住,您设置的路径是相对于启动应用程序的目录,而不是相对于当前文件。使用__file__一些技巧来制作相对于假设问题所在的os.path路径。chipas.py如果这不是您现在正在处理的问题,那肯定是您很快就会遇到的问题。
要引用相对于当前文件目录的路径,您可以使用以下内容:
import os.path
def path_relative_to_file(base_file_path, relative_path):
base_dir = os.path.dirname(os.path.abspath(base_file_path))
return os.path.normpath(os.path.join(base_dir, relative_path))
print(__file__)
print(path_relative_to_file(__file__, '../static/logo.png'))
#Breaks if this code is run from a different directory
print(os.path.abspath('../static/logo.png'))
Run Code Online (Sandbox Code Playgroud)
gfortune@gfortune:/var/log$ python /home/gfortune/temp/temp.py
/home/gfortune/temp/temp.py
/home/gfortune/static/logo.png
/var/static/logo.png
Run Code Online (Sandbox Code Playgroud)
请注意,即使我从 /var/log 启动该程序,“../static”的路径仍然有效。另请注意,如果从 /var/log 运行它,盲目地使用带有绝对路径的 ../static 会中断。
您可以通过从相关模块传递该函数来将该函数用作小辅助函数__file__,或者您可以直接使用其中的逻辑chipas.py
| 归档时间: |
|
| 查看次数: |
20499 次 |
| 最近记录: |