2012-04-09 9 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のように)それを挿入したい、または右の画像と左のテキストを持つことがさらに良い。私は多くの方法で(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"])) 

れています

このセクションを削除すると、コードが機能します。どんな助け?

答えて

4

Platypusを使用している場合は、ページにフレームを設定する必要があります。次に、特定のコンテンツをページに配置するフレームを指定することができます。あなたの場合は、イメージを格納するフレームを設定した後、コンテンツを格納するフレームに設定します。フレームからページテンプレートを作成し、生成したページテンプレートを特定のページに適用することができます。これは、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') 

必要なすべてのコードがすでにここにあります。 Imageクラスに直接このパラメータを追加するにはreported the issueがあります。