簡體   English   中英

在AppEngine Python上使用Reportlab生成的PDF文檔中添加圖像文件的正確方法

[英]Proper way to add an image file inside a PDF document generated with Reportlab on AppEngine Python

我正在嘗試使用App Engine Python上的reportlab生成PDF報告。

但我不知道如何正確附加圖像。

圖像是靜態的。

這是我項目的目錄樹。

在此輸入圖像描述

這是我做的(內部“chipas.py”)來獲得圖像:

im = Image('../static/logo.png',1*inch, 1*inch)
story.append(im)
...

我得到的堆棧跟蹤:

回溯(最近通話最后一個):文件“C:\\用戶\\盧卡斯\\ Dropbox的\\ DESARROLLO \\ Python的\\ WINDOWS \\ AppEngine上\\谷歌\\ AppEngine上\\分機\\ webapp_webapp25.py”,線路701, 呼叫 handler.get(*組)文件“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-窗戶\\ SRC \\ ReportLab的\\鴨嘴獸\\ doctemplate.py “線路763,在handle_flowable如果frame.add(F,canv,trySplit = self.allowSplitting):文件” C:\\用戶\\盧卡斯\\收存箱\\ DESARROLLO \\工作空間\\蟒\\ 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:\\用戶\\盧卡斯\\收存箱\\ DESARROLLO \\工作空間\\蟒\\ chipas窗口\\ SRC \\ ReportLab的\\鴨嘴獸\\ flowables.py”,線路402,在GETATTR self._setup_inner()文件“C:\\用戶\\盧卡斯\\收存箱\\ DESARROLLO \\工作空間\\蟒\\ chipas窗口\\ SRC \\ ReportLab的\\鴨嘴獸\\ flowables.py “線路368,在_setup_inner IMG = self._img文件” C:\\用戶\\盧卡斯\\收存箱\\ DESARROLLO \\工作空間\\蟒\\ chipas窗口\\ SRC \\ ReportLab的\\鴨嘴獸\\ flowables.py “線路398,在GETATTR self._img =的ImageReader(self._file)文件” C:\\用戶\\盧卡斯\\收存箱\\ DESARROLLO \\工作空間\\蟒\\ chipas -Windows \\ SRC \\ ReportLab的\\ lib中\\ utils.py “線路541,在初始化如果_isPILImage(文件名):文件” C:\\用戶\\盧卡斯\\收存箱\\ DESARROLLO \\工作空間\\蟒\\ chipas窗口\\ 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文檔中添加圖像文件的正確方法是什么? 提前謝謝了!

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來創建相對於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'))

產量

gfortune@gfortune:/var/log$ python /home/gfortune/temp/temp.py
/home/gfortune/temp/temp.py
/home/gfortune/static/logo.png
/var/static/logo.png

請注意,即使我從/ var / log啟動了程序,'../static'的路徑仍然有效。 另請注意,如果從/ var / log運行它,盲目地使用../static和abspath會中斷。

您可以通過從有問題的模塊傳遞__file__來將該函數用作小輔助函數,或者您可以直接在chipas.py使用它的邏輯。

有兩種方法可以做到這一點。

如果您只是使用畫布:

canvas.drawInlineImage(APP_ROOT + "/static/footer_image.png", inch*.25, inch*.25, PAGE_WIDTH-(.5*inch), (.316*inch))

或者,如果你使用鴨嘴獸和流動的

(答案來自: 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)

嘗試這個簡單的功能:這為我工作....

def PrintImage(request):
    response = HttpResponse(content_type='application/pdf')
    doc = SimpleDocTemplate(response,topMargin=2)

    doc.pagesize = landscape(A6)
    elements = []
    I = Image('http://demoschoolzen.educationzen.com/images/tia.png')
    I.drawHeight =  0.7*inch
    I.drawWidth = 0.7*inch
    elements.append(I)
    doc.build(elements) 
    return response

並從您的網址中調用它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM