Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.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 Django和reportlab动态报告问题_Python_Django_Reportlab - Fatal编程技术网

Python Django和reportlab动态报告问题

Python Django和reportlab动态报告问题,python,django,reportlab,Python,Django,Reportlab,我正在使用django和reportlab工具生成动态PDF报告。报告中的所有数据都来自数据库 我正在使用reportlab生成动态PDF报告,它由数据库中的数据组成。我的问题是,每当我重新启动Apache服务器时,我的PDF报告数据都在更改。生成的报告使用Django查询来显示数据。但当我重新启动apache服务器时,正确的数据并没有出现在报告中 我检查了我在django视图中编写的所有查询。我还注意到,每次重启Apache服务器都会显示不同的结果。所以我不认为这是django查询的问题。这个

我正在使用django和reportlab工具生成动态PDF报告。报告中的所有数据都来自数据库

我正在使用reportlab生成动态PDF报告,它由数据库中的数据组成。我的问题是,每当我重新启动Apache服务器时,我的PDF报告数据都在更改。生成的报告使用Django查询来显示数据。但当我重新启动apache服务器时,正确的数据并没有出现在报告中

我检查了我在django视图中编写的所有查询。我还注意到,每次重启Apache服务器都会显示不同的结果。所以我不认为这是django查询的问题。这个问题有什么解决办法吗

如果我重新启动apache服务器,已经生成的报告的数据将发生变化,这个问题的原因是什么,有什么解决方案吗

还是因为apache服务器

这是源代码。我认为StringIO的位置不对

buffer = StringIO()

def analysis_report(request, sample_no, contact_person):

"""
This function generates the analysis report by using the
client information, transformer details, sample data and
test results of respective analysis.
"""

response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment;filename=ANALYSIS_REPORT.pdf'

doc = SimpleDocTemplate(buffer)

document = []
doc.sample_no = sample_no
doc.contact_person = contact_person

image = Paragraph(stamp_image, STYLES['NORMAL_RIGHT'])

document.append(image)

# BUILTIN FUNCTION TO GENERATE THE DOCUMENT.

doc.build(document, onLaterPages=header_footer)

pdf = buffer.getvalue()

response.write(pdf) 

return response

提前感谢

首先,在您的情况下,一个巨大的问题可能是
buffer=StringIO()
不在函数范围内,但您在函数中使用它

我不知道你到底在做什么-你给我们的代码是整个PDF工作中最微小的片段-但这里有一个家伙的几点建议,他刚刚为django项目做了两个非常大的PDF包:

  • 编写一个类来创建和封装PDF文档对象
    • 我写的第一个PDF文档的范围不断扩大——视图中的所有逻辑都变得难以管理
    • 类应该有一个函数来构建每个页面模板
    • 如果您的页面模板使用回调
      onPage=
      ,那么这些回调中的每一个都应该在您的类中单独定义
    • 数据的每个独特部分都应该有自己的功能(在我的例子中:第1页、第2页和披露,每个部分都有一个功能,因为它们是逻辑上不同的数据块)
下面是一个示例views.py:

@check_requirments
def pdf(request) :
    """
    Download a PDF
    """
    response = HttpResponse(mimetype='application/pdf')
    response['Content-Disposition'] = 'attachment; filename=new.pdf'

    pdf = MyPdf(response)
    pdf.add_first_page()
    pdf.add_second_page()
    pdf.add_disclosures()
    pdf.build()

    return response
还有一个我的Pdf类示例:

# Page Setup
PAGE_WIDTH, PAGE_HEIGHT = landscape(letter)

class MyPdf():
    """
    My PDF
    """
    document            = None

    def __init__(self, file_like_handle=None):
        self.document = BaseDocTemplate(file_like_handle, pagesize=landscape(letter))

        self.build_templates()

    def build_templates(self):

        first_page_frames = []

        #First Page Title Frame
        frame_title = Frame(.25*inch, PAGE_HEIGHT-(1.75*inch), PAGE_WIDTH-(inch*.5), inch*.5, id="frame_title", showBoundary=0)
        first_page_frames.append(frame_title)

        # First Page Body Frames
        frame_body = Frame(.5*inch, PAGE_HEIGHT-(8*inch), PAGE_WIDTH-(inch), inch*6.25, id="frame_body", showBoundary=0)
        first_page_frames.append(frame_body)

        # Second Page Body Frame
        frame_body_full = Frame(.5*inch, PAGE_HEIGHT-(8*inch), PAGE_WIDTH-(inch), inch*7, id="frame_body_full", showBoundary=0)

        templates = []
        templates.append(PageTemplate(frames=first_page_frames, id="first_page", onPage=self.first_page))
        templates.append(PageTemplate(frames=[frame_body_full], id="child_pages", onPage=self.child_pages))
        templates.append(PageTemplate(frames=[frame_body_full], id="child_pages", onPage=self.last_page))
        self.document.addPageTemplates(templates)


    def first_page(self, canvas, doc):
        """
        First page has an image header and footer
        """
        canvas.saveState()
        canvas.drawInlineImage(settings.MEDIA_ROOT + "../static/pdf-header-landscape.png", inch*.25, PAGE_HEIGHT-(1.25 * inch), PAGE_WIDTH-(.5*inch), ((11/8)*inch))
        canvas.drawInlineImage(settings.MEDIA_ROOT + "../static/pdf-footer-landscape.png", inch*.25, inch*.25, PAGE_WIDTH-(.5*inch), (.316*inch))
        canvas.restoreState()


    def child_pages(self, canvas, doc): 
        """
        Second page has a smaller header and the same footer
        """
        canvas.saveState()  
        canvas.setFillColor(HexColor("#f4f3f1"))
        canvas.rect(inch*.25, PAGE_HEIGHT-(.25 * inch), PAGE_WIDTH-(.5*inch), -(.5*inch), fill=1, stroke=0)
        canvas.setFillColor(HexColor("#e5b53b"))
        canvas.setFont('Gotham-Bold', 16)
        canvas.drawString(inch*.5, PAGE_HEIGHT-((.6)*inch), "PAGE")
        canvas.setFillColor(HexColor("#00355f"))
        canvas.drawString(inch*1.75, PAGE_HEIGHT-((.6)*inch), "OVERVIEW")
        canvas.drawInlineImage(settings.MEDIA_ROOT + "../static/pdf-footer-landscape.png", inch*.25, inch*.25, PAGE_WIDTH-(.5*inch), (.316*inch))
        canvas.restoreState()


    def build(self):
        return self.document.build(self.elements)


    def add_first_page(self):

        sample = getSampleStyleSheet()
        style_title = copy.deepcopy(sample['BodyText'])
        style_title.fontSize = 18
        style_title.textColor = HexColor("#00355f")

        style_body  = copy.deepcopy(sample['BodyText'])
        style_body.fontSize = 10
        style_body.alignment = reportlab.lib.enums.TA_LEFT
        style_body.spaceBefore = 25
        style_body.spaceAfter = 15
        style_body.textColor = HexColor("#000000")
        style_body.leading = 14

        self.elements.append(Paragraph("""<font color="#e5b53b">PAGE</font>OVERVIEW""", style_title))
        self.elements.append(FrameBreak())

        self.elements.append(Paragraph("""Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean elementum malesuada euismod. Praesent ut ante risus. Aenean eleifend massa elit, non adipiscing ipsum. Integer et arcu tortor, a bibendum metus. Maecenas eget nulla id sem placerat dignissim sit amet et ligula. Donec vitae mi mauris. Praesent lacinia, mauris at malesuada bibendum, metus eros molestie ipsum, sed consequat dolor diam interdum ipsum. Phasellus consectetur auctor laoreet. Suspendisse vel nisl lacus, vitae auctor dui.""", style_body))

        # ADD A CUSTOM REPORTLAB CANVAS OBJECT
        self.elements.append(SomeGraph())

        self.elements.append(Paragraph("""Our strategic allocations for each strategy are determined by our Dynamic Strategic Asset Allocation process - the Science of Dynamic Investing. Our proprietary mathematical model uses updated Price Matters<super>&reg;</super> capital market assumptions (expected return, risk and correlation figures) to determine the optimal allocation to each asset class to achieve the goals of each strategy within the assigned risk tolerance and time horizon. The Art of Dynamic Investing enables us to adapt to changing economic and political realities as we reposition strategies with tactical tilts to the strategic allocations as we see value and momentum of various asset classes being affected during the year. <font color="#e5b53b">The chart below</font> shows the strategic weightings and the tactical allocations to each asset class as of the close of business on the date cited.""", style_body))

        self.elements.append(NextPageTemplate("child_pages"))
        self.elements.append(PageBreak())       

    def add_second_page(self):
        sample = getSampleStyleSheet()
        style_title = copy.deepcopy(sample['BodyText'])
        style_title.fontSize = 18
        style_title.textColor = HexColor("#00355f")

        style_body  = copy.deepcopy(sample['BodyText'])
        style_body.fontSize = 10
        style_body.alignment = reportlab.lib.enums.TA_LEFT
        style_body.spaceBefore = 25
        style_body.spaceAfter = 15
        style_body.textColor = HexColor("#000000")
        style_body.leading = 14

        self.elements.append(Paragraph("""Morbi posuere erat non nunc faucibus rhoncus. Donec at ante at tellus vehicula gravida. Praesent vulputate viverra neque, ut consectetur turpis vestibulum at. Integer interdum diam sed leo vehicula in viverra mauris venenatis. Morbi tristique pretium nunc vel ultrices. Fusce vitae augue lorem, et feugiat lorem. Donec sit amet nulla eget elit feugiat euismod rutrum ut magna. Pellentesque condimentum, tellus at rutrum egestas, dui neque dapibus risus, malesuada mollis risus eros id ligula. Fusce id cursus nulla. Etiam porttitor vulputate tellus eu blandit. Donec elementum erat sed tellus dapibus eleifend. Pellentesque sagittis, libero ac sodales laoreet, erat turpis fringilla est, vel accumsan nunc nisi eget orci. Integer condimentum libero in tellus lacinia ultricies quis ac odio. Vivamus justo urna, faucibus vitae bibendum dapibus, condimentum et ligula. Nullam interdum velit at orci blandit nec suscipit lorem lobortis. Pellentesque purus nunc, pulvinar vitae ullamcorper id, rhoncus sit amet diam.""", style_body))

    def add_disclosures(self):

        sample = getSampleStyleSheet()
        style_d = copy.deepcopy(sample['BodyText'])
        style_d.fontSize        = 8
        style_d.alignment   = reportlab.lib.enums.TA_LEFT
        style_d.textColor   = HexColor("#9D8D85")

        self.elements.append(NextPageTemplate("last_page"))
        self.elements.append(PageBreak())

        self.elements.append(Paragraph("""Important Disclosures""", style_d))

        self.elements.append(Paragraph("""Copyright 2012 Francis Yaconiello All Rights Reserved.""", style_d))
#页面设置
页宽,页高=横向(字母)
类MyPdf():
"""
我的PDF
"""
文档=无
定义初始化(self,类似文件的句柄=无):
self.document=BaseDocTemplate(类似于句柄的文件,页面大小=横向(字母))
self.build_模板()
def生成模板(自):
第一页\u帧=[]
#第一页标题框
框架标题=框架(.25*英寸,页面高度-(1.75*英寸),页面宽度-(英寸*.5),英寸*.5,id=“框架标题”,显示边界=0)
第一页\框架。追加(框架\标题)
#第一页正文框架
框体=框体(.5*英寸,页高-(8*英寸),页宽-(英寸),英寸*6.25,id=“框体”,显示边界=0)
第一页\框架。附加(框架\正文)
#第二页正文框架
框体满=框(.5*英寸,页高-(8*英寸),页宽-(英寸),英寸*7,id=“框体满”,显示边界=0)
模板=[]
templates.append(页面模板(frames=first\u page\u frames,id=“first\u page”,onPage=self.first\u page))
append(页面模板(frames=[frame\u body\u full],id=“child\u pages”,onPage=self.child\u pages))
追加(页面模板(frames=[frame\u body\u full],id=“child\u pages”,onPage=self.last\u page))
self.document.addPageTemplates(模板)
def第一页(自我、画布、文档):
"""
第一页有一个图像页眉和页脚
"""
canvas.saveState()
canvas.drawInlineImage(settings.MEDIA\u ROOT+”./static/pdf header-scanner.png),英寸*.25,页面高度-(1.25*英寸),页面宽度-(.5*英寸),((11/8)*英寸))
canvas.drawInlineImage(settings.MEDIA_ROOT+“./static/pdf footer scanner.png”,英寸*.25,英寸*.25,页面宽度-(.5*英寸),(.316*英寸))
canvas.restoreState()
def子页面(自我、画布、文档):
"""
第二页的页眉较小,页脚相同
"""
canvas.saveState()
canvas.setFillColor(HexColor(#f4f3f1”))
canvas.rect(英寸*.25,页面高度-(.25*inch),页面宽度-(.5*inch),-(.5*inch),填充=1,笔划=0)
canvas.setFillColor(HexColor(#e5b53b”))
canvas.setFont('Gotham-Bold',16)
帆布.抽绳(英寸*.5,页码高度-(.6)*英寸),“页码”)
canvas.setFillColor(HexColor(“#00355f”))
帆布.抽绳(英寸*1.75,页码高度-(.6)*英寸),“概述”)
canvas.drawInlineImage(settings.MEDIA_ROOT+“./static/pdf footer scanner.png”,英寸*.25,英寸*.25,页面宽度-(.5*英寸),(.316*英寸))
canvas.restoreState()
def生成(自):
返回self.document.build(self.elements)
def添加第一页(自我):
sample=getSampleStyleSheet()
style_title=copy.deepcopy(示例['BodyText'])
style_title.fontSize=18
style_title.textColor=HexColor(#00355f)
style_body=copy.deepcopy(示例['BodyText'])
style_body.fontSize=10
style_body.alignment=reportlab.lib.enums.TA_LEFT
style_body.spaceBefore=25
style_body.spaceAfter=15
style_body.textColor=HexColor(#000000)
样式_body.leading=14
self.elements.append(段落(““PAGEOVERVIEW”,样式标题))
self.elements.append(FrameBreak())
self.elements.append(段落(“”)"知识同一性是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德我们的爱欲是同一个,它包括同一个物体之间的直径。拍卖人laoreet的连续相位。拍卖人dui的生命的悬念
#添加自定义REPORTLAB画布对象
自我要素