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のように)それを挿入したい、または右の画像と左のテキストを持つことがさらに良い。私は多くの方法で(ParagraphAndImage Flowableで画像を挿入する、imgのhAlignまたはoAlign propetryを設定する)試みましたが、常にエラーまたは同じ位置合わせがあります。 正しい方法は何ですか?
私は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
まだ動作しません。問題は、このセクションにあるように思わ: '辞書' オブジェクトが属性 'ステートセーブ'
を持っていないfattura/PDF/ /ではAttributeError:私は次のエラーを得た
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"]))
れています
このセクションを削除すると、コードが機能します。どんな助け?