2012-04-09 45 views
2

我試圖使用Reportlab在簡單的Django應用程序上輸出發票。做這樣簡單的事情似乎相當困難。這裏是我的代碼:reportlab.platypus - 以模板標題中的右對齊圖像爲背景呈現模板

def print_pdf(fattura, soggetto, buffer=None): 

import time 
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_RIGHT, TA_JUSTIFY 
from reportlab.lib.pagesizes import letter 
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image, ParagraphAndImage 
from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet 
from reportlab.lib.units import inch 

static_files_dir_path = settings.SITE_ROOT+'/'+settings.CURRENT_APP_NAME+settings.STATIC_URL+'user/images/'; 
img_file = 'Logo_effetti.jpg' 
img_height = 75 
img_width = 99 

str_data_fatt = (fattura.data).strftime('%d/%m/%Y') 
fattura_file_name = str('fattura_'+str_data_fatt+'_'+str(fattura.soggetto)+'.pdf') 

img = Image(static_files_dir_path+img_file, img_width, img_height) 

styles = getSampleStyleSheet() 
normalStyle = styles["Normal"] 

nfattura_ptext = 'numero fattura: '+str(fattura.numerofattura) 

if buffer: 
    doc = SimpleDocTemplate(buffer, pagesize=letter) 
else: 
    doc = SimpleDocTemplate(fattura_file_name, pagesize=letter) 
elems = [] 

intestazione_studio_ptext = 'Studio AAA<br/>Via XXX 99<br/> 20202 DDDDDDD' 
prestazioni = [] 

elems.append(Paragraph(intestazione_studio_ptext, styles["Normal"])) 
elems.append(Spacer(1,12)) 
elems.append(Spacer(1,12)) 
elems.append(Spacer(1,12)) 

elems.append(Paragraph(nfattura_ptext, styles["Normal"])) 
cliente_ptext = soggetto.nome+" "+soggetto.cognome+"<br/>"+soggetto.indirizzo+", "+soggetto.cap+" "+soggetto.citta+"<br/>C.F.: "+soggetto.codfisc 
if(soggetto.is_privato): 
    cliente_ptext += "P.IVA: "+soggetto.piva 

prezzo = Prezzo.objects.get(pk=1) 

if fattura.riabmot > 0: 
    prestazioni.append({'nome':'Rieducazione motoria','qta': fattura.riabmot,'p_unit': prezzo.riabmot, 
         'p_finale': fattura.riabmot * prezzo.riabmot,'id':'riabmot'}) 
if fattura.riabacq > 0: 
    prestazioni.append({'nome':'Riabilitazione in acqua','qta': fattura.riabacq,'p_unit': prezzo.riabacq, 
         'p_finale': fattura.riabacq * prezzo.riabacq,'id':'riabacq'}) 
if fattura.riabdom > 0: 
    prestazioni.append({'nome':'Riabilitazione domiciliare','qta': fattura.riabdom,'p_unit': prezzo.riabdom, 
         'p_finale':fattura.riabdom * prezzo.riabdom,'id':'riabdom'}) 
if fattura.osteo > 0: 
    prestazioni.append({'nome':'Osteopatia','qta': fattura.osteo,'p_unit': prezzo.osteo, 
         'p_finale':fattura.osteo * prezzo.osteo,'id':'osteo'}) 
if fattura.masso > 0: 
    prestazioni.append({'nome':'Massoterapia','qta': fattura.masso,'p_unit': prezzo.masso, 
         'p_finale':fattura.masso * prezzo.masso,'id':'masso'}) 
if fattura.diate > 0: 
    prestazioni.append({'nome':'Diatermia','qta': fattura.diate,'p_unit': prezzo.diate, 
          'p_finale':fattura.diate * prezzo.diate,'id':'diate'}) 
if fattura.laser > 0: 
    prestazioni.append({'nome':'Laserterapia','qta': fattura.laser,'p_unit': prezzo.laser, 
          'p_finale':fattura.laser * prezzo.laser,'id':'laser'}) 
if fattura.usman > 0: 
    prestazioni.append({'nome':'US Manuale','qta': fattura.usman,'p_unit': prezzo.usman, 
          'p_finale':fattura.usman * prezzo.usman,'id':'usman'}) 
if fattura.usacq > 0: 
    prestazioni.append({'nome':'US in acqua','qta': fattura.usacq,'p_unit': prezzo.usacq, 
          'p_finale':fattura.usacq * prezzo.usacq,'id':'usacq'}) 
if fattura.tens > 0: 
    prestazioni.append({'nome':'TENS','qta': fattura.tens,'p_unit': prezzo.tens, 
          'p_finale':fattura.tens * prezzo.tens,'id':'usacq'}) 
if fattura.ets > 0: 
    prestazioni.append({'nome':'Elettroterapia stimolante','qta': fattura.ets,'p_unit': prezzo.ets, 
          'p_finale': fattura.ets * prezzo.ets,'id':'ets'}) 
if fattura.magneto > 0: 
    prestazioni.append({'nome':'Magnetoterapia','qta': fattura.magneto,'p_unit': prezzo.magneto, 
          'p_finale':fattura.magneto * prezzo.magneto,'id':'magneto'}) 
if fattura.iono > 0: 
    prestazioni.append({'nome':'Ionoforesi','qta': fattura.iono,'p_unit': prezzo.iono, 
          'p_finale':fattura.iono * prezzo.iono,'id':'iono'}) 

totale = 0 
totale += fattura.diate * prezzo.diate 
totale += fattura.ets * prezzo.ets 
totale += fattura.iono * prezzo.iono 
totale += fattura.tens * prezzo.tens 
totale += fattura.laser * prezzo.laser 
totale += fattura.magneto * prezzo.magneto 
totale += fattura.masso * prezzo.masso 
totale += fattura.usacq * prezzo.usacq 
totale += fattura.usman * prezzo.usman 
totale += fattura.osteo * prezzo.osteo 
totale += fattura.riabacq * prezzo.riabacq 
totale += fattura.riabdom * prezzo.riabdom 
totale += fattura.riabmot * prezzo.riabmot 

prestazioni_instestazione_ptext = "Prestazione  N.Sedute  Pr. unitario (euro)  Pr. finale (euro)" 
elems.append(Paragraph(prestazioni_instestazione_ptext, styles["Normal"])) 
elems.append(Spacer(1,12)) 
for p in prestazioni: 
    prestazione_ptext = p['nome']+"  "+str(p['qta'])+"  "+str(p['p_unit'])+"  "+str(p['p_finale']) 
    elems.append(Paragraph(prestazione_ptext, styles["Normal"])) 


elems.append(Spacer(1,12)) 
elems.append(Spacer(1,12)) 
totale_ptext = "Importo totale: "+str(totale)+" euro" 
elems.append(Paragraph(totale_ptext, styles["Normal"])) 

doc.build(elems); 
return buffer; 

使用此代碼,我的頁眉圖像始終呈現在頁面中心。我想在右側插入它(如that),或者更好地在右側顯示圖像,在左側顯示文字。我已經嘗試了很多方法(設置img的hAlign或oAlign propetry,在ParagraphAndImage中插入圖像),但總是出現錯誤或相同的對齊方式。 什麼是正確的方法?

我試着看看Reportlab的文檔,但似乎不是很清楚我和窮人的代碼片段。

TNX給大家,

盧克


感謝您的回覆。我通過這種方式修改了代碼:

def print_fatt_pdf(fattura, soggetto, buffer=None): 

import time 
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_RIGHT, TA_JUSTIFY 
from reportlab.lib.pagesizes import letter 
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer 
from reportlab.platypus.frames import Frame 
from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet 
from reportlab.lib.units import inch, cm 
from PIL import Image 
from reportlab.pdfgen.canvas import Canvas 

static_files_dir_path = settings.SITE_ROOT+'/'+settings.CURRENT_APP_NAME+settings.STATIC_URL+'user/images/'; 
img_file = 'Logo_effetti.jpg' 
img_height = 75 
img_width = 98 
elems = [] 


str_data_fatt = (fattura.data).strftime('%d/%m/%Y') 
fattura_file_name = str('fattura_'+str_data_fatt+'_'+str(fattura.soggetto)+'.pdf') 
print 'fattura_file_name',fattura_file_name 

f = Frame(1.5*cm, 1.5*cm, 6*inch, 9*inch) 
p = Canvas(buffer); 

# adding flowables 
styles = getSampleStyleSheet() 
normalStyle = styles["Normal"] 

nfattura_ptext = 'numero fattura: '+str(fattura.numerofattura) 
intestazione_studio_ptext = 'Studio Fisiodel<br/>Via Sant\'Isaia 99<br/>20012 Mantegazza di Vanzago (MI)' 
print 'intestazione_studio_ptext type: ',type(intestazione_studio_ptext) 
elems.append(Paragraph(intestazione_studio_ptext, normalStyle)) 
elems.append(Spacer(1,12)) 
elems.append(Spacer(1,12)) 
elems.append(Spacer(1,12)) 

elems.append(Paragraph(nfattura_ptext, styles["Normal"])) 
cliente_ptext = soggetto.nome+" "+soggetto.cognome+"<br/>"+soggetto.indirizzo+", "+soggetto.cap+" "+soggetto.citta+"<br/>C.F.: "+soggetto.codfisc 
if(soggetto.is_privato): 
    cliente_ptext += "P.IVA: "+soggetto.piva 

prezzo = Prezzo.objects.get(pk=1) 

prestazioni = [] 
if fattura.riabmot > 0: 
    prestazioni.append({'nome':'Rieducazione motoria','qta': fattura.riabmot,'p_unit': prezzo.riabmot, 
         'p_finale': fattura.riabmot * prezzo.riabmot,'id':'riabmot'}) 
if fattura.riabacq > 0: 
    prestazioni.append({'nome':'Riabilitazione in acqua','qta': fattura.riabacq,'p_unit': prezzo.riabacq, 
         'p_finale': fattura.riabacq * prezzo.riabacq,'id':'riabacq'}) 
if fattura.riabdom > 0: 
    prestazioni.append({'nome':'Riabilitazione domiciliare','qta': fattura.riabdom,'p_unit': prezzo.riabdom, 
         'p_finale':fattura.riabdom * prezzo.riabdom,'id':'riabdom'}) 
if fattura.osteo > 0: 
    prestazioni.append({'nome':'Osteopatia','qta': fattura.osteo,'p_unit': prezzo.osteo, 
         'p_finale':fattura.osteo * prezzo.osteo,'id':'osteo'}) 
if fattura.masso > 0: 
    prestazioni.append({'nome':'Massoterapia','qta': fattura.masso,'p_unit': prezzo.masso, 
         'p_finale':fattura.masso * prezzo.masso,'id':'masso'}) 
if fattura.diate > 0: 
    prestazioni.append({'nome':'Diatermia','qta': fattura.diate,'p_unit': prezzo.diate, 
          'p_finale':fattura.diate * prezzo.diate,'id':'diate'}) 
if fattura.laser > 0: 
    prestazioni.append({'nome':'Laserterapia','qta': fattura.laser,'p_unit': prezzo.laser, 
          'p_finale':fattura.laser * prezzo.laser,'id':'laser'}) 
if fattura.usman > 0: 
    prestazioni.append({'nome':'US Manuale','qta': fattura.usman,'p_unit': prezzo.usman, 
          'p_finale':fattura.usman * prezzo.usman,'id':'usman'}) 
if fattura.usacq > 0: 
    prestazioni.append({'nome':'US in acqua','qta': fattura.usacq,'p_unit': prezzo.usacq, 
          'p_finale':fattura.usacq * prezzo.usacq,'id':'usacq'}) 
if fattura.tens > 0: 
    prestazioni.append({'nome':'TENS','qta': fattura.tens,'p_unit': prezzo.tens, 
          'p_finale':fattura.tens * prezzo.tens,'id':'usacq'}) 
if fattura.ets > 0: 
    prestazioni.append({'nome':'Elettroterapia stimolante','qta': fattura.ets,'p_unit': prezzo.ets, 
          'p_finale': fattura.ets * prezzo.ets,'id':'ets'}) 
if fattura.magneto > 0: 
    prestazioni.append({'nome':'Magnetoterapia','qta': fattura.magneto,'p_unit': prezzo.magneto, 
          'p_finale':fattura.magneto * prezzo.magneto,'id':'magneto'}) 
if fattura.iono > 0: 
    prestazioni.append({'nome':'Ionoforesi','qta': fattura.iono,'p_unit': prezzo.iono, 
          'p_finale':fattura.iono * prezzo.iono,'id':'iono'}) 

totale = 0 
totale += fattura.diate * prezzo.diate 
totale += fattura.ets * prezzo.ets 
totale += fattura.iono * prezzo.iono 
totale += fattura.tens * prezzo.tens 
totale += fattura.laser * prezzo.laser 
totale += fattura.magneto * prezzo.magneto 
totale += fattura.masso * prezzo.masso 
totale += fattura.usacq * prezzo.usacq 
totale += fattura.usman * prezzo.usman 
totale += fattura.osteo * prezzo.osteo 
totale += fattura.riabacq * prezzo.riabacq 
totale += fattura.riabdom * prezzo.riabdom 
totale += fattura.riabmot * prezzo.riabmot 

prestazioni_instestazione_ptext = "Prestazione  N.Sedute  Pr. unitario (euro)  Pr. finale (euro)" 
elems.append(Paragraph(prestazioni_instestazione_ptext, normalStyle)) 
elems.append(Spacer(1,12)) 
for p in prestazioni: 
    prestazione_ptext = str(p['nome']+"  "+str(p['qta'])+"  "+str(p['p_unit'])+"  "+str(p['p_finale'])) 
    print 'prestazione_ptext type : ',type(prestazione_ptext) 
    elems.append(Paragraph(prestazione_ptext, styles["Normal"])) 

elems.append(Spacer(1,12)) 
elems.append(Spacer(1,12)) 
totale_ptext = "Importo totale: "+str(totale)+" euro" 
print 'totale_ptext: ',totale_ptext 
elems.append(Paragraph(totale_ptext, styles["Normal"])) 


f.addFromList(elems,p) 
p.drawImage(static_files_dir_path+img_file,450,730,img_width,img_height) 
p.save() 
return buffer 

但它仍然不起作用。這個問題似乎是在本節:

for p in prestazioni: 
    prestazione_ptext = str(p['nome']+"  "+str(p['qta'])+"  "+str(p['p_unit'])+"  "+str(p['p_finale'])) 
    print 'prestazione_ptext type : ',type(prestazione_ptext) 
    elems.append(Paragraph(prestazione_ptext, styles["Normal"])) 

上,我得到了以下錯誤:在/ fattura/PDF

AttributeError的/ '字典' 對象有沒有屬性 'saveState和'

刪除代碼工作的部分。任何幫助?

回答

4

如果您使用鴨嘴獸,您需要在頁面上設置框架。然後,您可以指定將特定內容放入頁面的框架。在你的情況下,它會像設置一個框架來包含圖像,然後框架來包含內容。然後,您可以在框架外創建頁面模板,並在生成這些頁面模板時將這些頁面模板應用於特定頁面。這是用Platypus在ReportLab中進行復雜佈局的一般模式。

2

我正在努力實現。縱觀目前source code,我已經提出了以下解決方案:

from reportlab.platypus import Image 

class AlignedImage(Image): 
    def __init__(self, filename, hAlign='CENTER', **kwargs): 
     Image.__init__(self, filename, **kwargs) 
     self.hAlign = hAlign 

# simply use it like this ('LEFT' can also be used): 
my_image = AlignedImage('/foo/bar.png', hAlign='RIGHT') 

所需的所有代碼已經在這裏;我有reported the issue直接在Image類中添加此參數。