草庐IT

Python Reportlab 分页符

coder 2023-08-18 原文

我正在尝试使用 python 中的 reportlab 生成 pdf 报告。

我的目标是让我的 pdf 文件的第一页只有一个简单的标题和一个没有实际内容的表格。实际内容将从第二页开始。

在浏览了一些 SO 帖子后,我发现 afterPage() 命令可以用来分页。所以,我想到了这样的事情:

from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer,KeepTogether,tables
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.rl_config import defaultPageSize
from reportlab.lib.pagesizes import A4,landscape
from reportlab.lib.units import inch,cm,mm
from reportlab.pdfgen import canvas

PAGE_HEIGHT = defaultPageSize[1]
PAGE_WIDTH = defaultPageSize[0]
styles = getSampleStyleSheet()
style = styles["Normal"]

def myFirstPage(canvas, doc):
    canvas.saveState()
    canvas.setFont('Times-Bold',15)
    canvas.drawCentredString(PAGE_WIDTH/2.0, PAGE_HEIGHT-38, 'Title 1')
    canvas.drawCentredString(PAGE_WIDTH/2.0, PAGE_HEIGHT-58, 'Title 2')

    NormalStyle = tables.TableStyle([
        ('BOX',(0,0),(-1,-1),0.45,colors.blue),
        ('ALIGN',(0,0),(-1,-1),'LEFT'),
        ('BACKGROUND',(0,0),(-1,-1),colors.lightblue)
        ])

    mytable = tables.Table([('test','test'),('test2','test2'),('test3','test3')],
    colWidths = 1* inch,rowHeights= 0.25 *inch,style = NormalStyle)

    mytable.wrapOn(canvas,PAGE_WIDTH ,PAGE_HEIGHT)
    mytable.drawOn(canvas,(doc.width/2)-20,700)

    doc.afterPage()
    canvas.restoreState()

def myLaterPages(canvas, doc):
    canvas.saveState()
    canvas.setFont('Times-Roman', 9)
    canvas.restoreState()

doc = SimpleDocTemplate("myreport.pdf",
                        leftMargin = 0.75*inch,
                        rightMargin = 0.75*inch,
                        topMargin = 1*inch,
                        bottomMargin = 1*inch)

data = "".join(['this is a test' for i in range(200)])
mydata = Paragraph(data,style)
Story = [Spacer(2.5,0.75*inch)]
Story.append(mydata)

doc.build(Story, onFirstPage=myFirstPage, onLaterPages=myLaterPages)

但是我的所有标题、表格和内容都绘制在第一页上,afterPage() 函数似乎对我的文档内容没有任何实际影响。

如何更改我的代码以便内容(代码中的数据)从第二页开始?

最佳答案

为此,您可以使用 Page Break()。只需插入 Story.append(Page Break()) 并将其从 reportlab.platypus.

关于Python Reportlab 分页符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23422773/

有关Python Reportlab 分页符的更多相关文章

  1. ruby - 每个页面上的 Jekyll 分页 - 2

    据我们所知,Jekyll默认分页仅支持index.html,我想创建blog.html并在那里包含分页。有什么解决办法吗? 最佳答案 如果您创建一个名为/blog的目录并在其中放置一个index.html文件,那么您可以向_config.yml表示paginate_path:"blog/page:num"。不是使用根文件夹中的默认index.html作为分页器模板,而是使用/blog/index.html。分页器将根据需要生成类似/blog/page2/和/blog/page3/的页面。这将使您到达yourwebsite.com/b

  2. ruby - 使用 Her、Faraday 在 API 中进行 Rails 分页 - 2

    我一整天都在想办法解决这个问题,这让我发疯了。我有两个Rails应用程序,ServerApp和ClientApp。ClientApp使用Hergem通过API从ServerApp获取数据。一切都很好,直到我需要分页信息。这是我用来获取订单的方法(使用kamainari进行分页,使用ransack进行搜索):#ServerAppdefsearch@search=Order.includes(:documents,:client).order('iddesc').search(params[:q])@orders=@search.result(distinct:true).page(par

  3. Ruby SSH 禁用分页 - 2

    有什么方法可以禁用或设置ruby​​Net-SSH连接的页面长度,这样我们就不必更改远程设备上的设置了吗?在Cisco路由器中,我们将使用参数“terminallength0”来完成此操作,但在其他服务器上,我们不能使用任何类似的命令。这可以通过Net-SSHlib设置吗? 最佳答案 假设远程端有一个shell,那么终端高度在LINES环境变量中设置。您可以尝试这样设置:Net::SSH.start('hostname','user')do|ssh|ssh.exec!('LINES=50your-command-here')end如

  4. ruby - 不需要的表单参数被附加到分页链接 - 2

    我有一个页面,用于通过使用提供的表格提交数据来搜索列表。表单参数通过ajax(post请求)提交,在搜索表中创建一条新记录,然后通过show显示列表(动态地,在提交表单的同一页面上)此记录的操作。结果有kaminari提供的分页链接,如下所示:{:controller=>'searches',#Ihavetospecifytheidbecausemysearchesarestoredinthedatabase:action=>'show',:id=>search.id},:remote=>true%>请注意,分页链接是动态包含在页面中的。因此,当我进行新搜索并获得新列表时,服务器会重新

  5. Elasticsearch7.8.0版本入门—— 分页查询文档(高级查询) - 2

    目录一、初始化文档数据二、分页查询文档2.1、概述2.2、示例一、初始化文档数据在Postman中,向ES服务器发POST请求:http://localhost:9200/user/_doc/1,请求体内容为:{"name":"zhangsan","age":20,"sex":"男"}在Postman中,向ES服务器发POST请求:http://localhost:9200/user/_doc/2,请求体内容为:{"name":"zhangsan1","age":21,"sex":"男"}在Postman中,向ES服务器发POST请求:http://localhost:9200/user/_d

  6. ruby-on-rails - 在 Kaminari 中对多个模型进行分页 - 2

    我正在创建一个搜索页面,该页面将对用户、帖子和评论进行应用程序范围内的搜索。我目前有:#POST/searchdefindexquery=params[:query]@users=User.search(query).page(params[:page])@posts=Post.search(query).page(params[:page])@comments=Comment.search(query).page(params[:page])respond_todo|format|format.htmlendend不过,我真的想把所有结果混合在一起然后分页。像这样进行分页搜索有哪些策

  7. ruby-on-rails - Kaminari & Rails 分页 - 未定义的方法 `current_page' - 2

    我搜索了又搜索,但没有解决我的问题。这是我的Controller:defshow@topic=Topic.find(params[:id])@topic.posts=@topic.posts.page(params[:page]).per(2)#2fordebuggingend这很好用,因为主题View被缩减为两个帖子。但是,当我将其添加到show.html.erb时:我收到这个错误:undefinedmethod`current_page'for# 最佳答案 尝试:defshow@topic=Topic.find(params[:

  8. ruby-on-rails - 使用 will_paginate 在 Ruby 中对数组进行分页 - 2

    我有一个数组@level1,看起来像这样:[[3.0,4,2],[2.0,48,3],[2.1,56,4],............]我想在这个数组上应用分页,这样每个页面一次只显示几行。我试过这个:@temp1=@level1.paginate(:page=>params[:page])但它抛出以下错误:undefinedmethod`paginate'for[[3.0,4,2],[2.0,48,3],[2.1,56,4]]:Array如何使用will_paginate对此执行分页? 最佳答案 参见https://github.c

  9. 开发者工具network里请求pending状态耗时长是为什么?(项目部分页面的请求) - 2

    前言:本文主要是提问,后文有一个解决办法,但仅供参考目录问题排查过程解决办法(仅供参考)提问:问题        在开发一个数字化大屏项目的时候遇到问题:某个大屏接口请求10多秒才能拿到响应数据,其他大屏页面接口响应很快。排查过程    发现主要是接口status状态为pending的时间很长(如下图)        进一步发现是”排队等待“时间长(如下图),网上搜索了以上pending状态和和排队时间的解释,也不是很明白。queueing优化_从Timing看HTTP请求的优化方向_weixin_39933082的博客-CSDN博客1,背景在Chrome开发者工具中,有一个Timing菜单,

  10. javascript - 一起使用 Jquery 分页和历史插件的最有效方式 - 2

    在我的ASP.NETMVC3应用程序中,我想使用Jquery的pagination插件来制作我的论坛...所以我想用Ajax完成所有页面更改,并想使用history插件来处理浏览器的后退和下一步按钮...最有效的javascript/jquery代码是什么?我一个月前写了这段代码,但现在看来我很丑..检查一下$(document).ready(function(){$.history.init(function(hash){if(hash!=""){NavigateToPage(hash.substring(0,hash.indexOf("page")),hash.substring(

随机推荐