reportlab.platypus呈现模板,模板头中的右对齐图像作为背景

2024-03-29 05:54:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Reportlab在一个简单的Django应用程序上输出发票。做这种简单的事情似乎很难。这是我的代码:

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属性,在段落中插入图像,图像可流动),但总是有错误或相同的对齐方式。 什么是正确的方法?

我试过查看Reportlab文档,但对我来说似乎不太清楚,代码片段也不多。

对每个人来说

卢克


谢谢你的回复。我已经这样修改了代码:

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"]))

我得到了以下错误:

属性错误at/fattura/pdf/ “dict”对象没有属性“saveState”

去掉那部分代码就行了。有什么帮助吗?


Tags: idifunitqtaappendstrnomefattura