Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python reportlab.platypus-以模板标题中的右对齐图像为背景呈现模板_Python_Django_Pdf Generation_Django Views_Reportlab - Fatal编程技术网

Python reportlab.platypus-以模板标题中的右对齐图像为背景呈现模板

Python reportlab.platypus-以模板标题中的右对齐图像为背景呈现模板,python,django,pdf-generation,django-views,reportlab,Python,Django,Pdf Generation,Django Views,Reportlab,我正在尝试使用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.

我正在尝试使用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;
在这一点上,我得到了以下错误:

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


删除该部分代码即可工作。有什么帮助吗?

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

我正试图实现这一点。根据目前的情况,我提出了以下解决方案:

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类中添加此参数。

现在看起来已经存在了

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)

欢迎来到StackOverflow。虽然这段代码可以解决这个问题,但如何以及为什么解决这个问题将真正有助于提高您的帖子质量,并可能导致更多的投票。请记住,你是在将来回答读者的问题,而不仅仅是现在提问的人。请编辑您的答案,添加解释,并说明适用的限制和假设。
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')
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)