3
   def analysis_report(request):

       response = HttpResponse(mimetype='application/pdf')
       response['Content-Disposition'] = 'attachment;filename=ANALYSIS_REPORT.pdf'
       buffer = StringIO()
       doc = SimpleDocTemplate(buffer)
       doc.sample_no = 12345
       document = []
       doc.build(document, onLaterPages=header_footer)

   def header_footer(canvas, doc):
       canvas.saveState()

       canvas.setFont("Times-Bold", 11)
       canvas.setFillColor(gray)
       canvas.setStrokeColor('#5B80B2')
       canvas.drawCentredString(310, 800, 'HEADER ONE GOES HERE')
       canvas.drawString(440, 780, 'Sample No: %s' %doc.sample_no)

       canvas.setFont('Times-Roman', 5)
       canvas.drawString(565, 4, "Page %d" % doc.page)

我上面的代码可以显示页码,但我的问题是如何显示“Y 页 X”,其中 Y 是页数,X 是当前页。

我遵循了这个http://code.activestate.com/recipes/546511-page-x-of-y-with-reportlab/,但他们使用canvasmaker进行了解释,因为我在构建中使用OnlaterPages参数。

我如何使用 canvasmaker 实现上述目标,或者是否有任何使用 OnLaterPages 的解决方案?

4

2 回答 2

4

这是改进的配方http://code.activestate.com/recipes/576832/应该适用于图像。

于 2012-09-02T06:57:19.163 回答
2

另一种可能的解决方法是使用 pyPDF(或任何其他具有功能的 pdf-lib)读取之后的总页数doc.build(),然后通过交换相应Paragraph()的 's. 这种方法可能更hackish,但是没有子类化就可以了。

例子:

from pyPdf import PdfFileReader
[...]
story.append(Paragraph('temp paragraph. this will be exchanged with the total page number'))
post_story = story[:] #copy the story because build consumes it
doc.build(story) #build the pdf with name temp.pdf
temp_pdf = PdfFileReader(file("temp.pdf", "rb"))
total_pages = cert_temp.getNumPages()
post_story[-1] = Paragraph('total pages: ' + str(total_pages))
doc.build(post_story)
于 2014-02-24T12:05:32.917 回答