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;
このコードでは、ヘッダー画像は常にページ中央にレンダリングされます。私はそれを右側に挿入したい(そのように)、またはさらに良いのは右側に画像、左側にテキストを配置したいです。私はさまざまな方法で試しましたが(imgのhAlignまたはoAlignプロパティを設定し、ParagraphAndImageフローアブルに画像を挿入します)、常にエラーまたは同じ配置が発生しました。正しい方法は何ですか?
Reportlabのドキュメントを調べてみましたが、あまり明確ではなく、コードスニペットが不十分なようです。
みんなにtnx、
LuKe
お返事をありがとうございます。私はこの方法でコードを変更しました:
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'dict'オブジェクトに属性'saveState'がありません
そのセクションを削除すると、コードが機能します。何か助けはありますか?