2

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'がありません

そのセクションを削除すると、コードが機能します。何か助けはありますか?

4

3 に答える 3

4

カモノハシを使用している場合は、ページにフレームを設定する必要があります。次に、特定のコンテンツをページに配置するフレームを指定できます。あなたの場合、それは画像を含むフレームを設定し、次にコンテンツを含むフレームを設定するようなものです。次に、フレームからページテンプレートを作成し、それらを生成するときにそれらのページテンプレートを特定のページに適用できます。これは、カモノハシを使用してReportLabで複雑なレイアウトを行うための一般的なパターンです。

于 2012-04-10T20:44:29.700 に答える
2

私はそれを達成しようとしていました。現在のソースコードを見て、私は次の解決策を思いついた:

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クラスに直接追加する問題を報告しました。

于 2014-12-09T14:37:13.890 に答える
1

今そこにいるようです!

from reportlab.platypus import SimpleDocTemplate, Paragraph, Image, HRFlowable

ss = reportlab.lib.styles.getSampleStyleSheet() 
p1 = Paragraph("Title", ss['Heading1'])                                                                    
p2 = Paragraph("normal paragraph", ss['BodyText'])                                                         
p3 = HRFlowable(width="100%")  
p4 = Image("/home/usr/Downloads/me.jpg", width=100, height=75, hAlign="LEFT")                  
        
flo = [p4,p3,p1,p3,p2]  
pdf = SimpleDocTemplate("test.pdf") 
pdf.showboundary = 1
pdf.build(flo)
于 2020-11-27T09:00:30.720 に答える