首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >reportlab.platypus -以模板头中对齐的图像作为背景呈现模板

reportlab.platypus -以模板头中对齐的图像作为背景呈现模板
EN

Stack Overflow用户
提问于 2012-04-09 20:10:15
回答 3查看 6.3K关注 0票数 2

我打算使用Reportlab在一个简单的Django应用程序上输出发票。像这样简单的事情似乎很难做。这是我的密码:

代码语言:javascript
复制
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文档,但在我看来不太清楚,代码片段也不多。

对每个人来说,

LuKe

谢谢你的答复。我用这样的方式修改了代码:

代码语言:javascript
复制
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

但还是没用。这一问题似乎在本节:

代码语言:javascript
复制
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"]))

在此,我得到了以下错误:

AttributeError at /fattura/pdf/“dict”对象没有属性“saveState”

删除该部分代码就能工作了。有什么帮助吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-10 20:44:29

如果您使用的是Platypus,则需要在页面上设置框架。然后,您可以指定要在页面上放置特定内容的框架。在您的示例中,它将类似于设置一个框架以包含图像,然后设置一个包含内容的框架。然后,您可以根据框架构建页面模板,并在生成特定页面时将这些页面模板应用于特定页面。这是在ReportLab中使用Platypus执行复杂布局的一般模式。

票数 4
EN

Stack Overflow用户

发布于 2014-12-09 14:37:13

我在努力实现这个目标。看看当前的源代码,我想出了以下解决方案:

代码语言:javascript
复制
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中添加这个参数。

票数 2
EN

Stack Overflow用户

发布于 2020-11-27 09:00:30

看上去现在就在那里!

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10079152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档