我试图使用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和'
删除代码工作的部分。任何帮助?