2012-04-09 59 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类中添加此参数。