【问题标题】:how to know the end of a frame to create a new one reportlab如何知道一帧的结束来创建一个新的reportlab
【发布时间】:2015-03-25 06:31:38
【问题描述】:

我使用reportlab 构建了一个pdf,以便更多地控制页面(颜色-填充-返回行...)我创建了一个框架。

问题是,我的文本来自数据库,它需要不止一页。

我想知道如何判断它是页面/框架的结尾,我应该为其余的文本创建一个新的。

import MySQLdb
import pprint
import sys
import csv
from datetime import *
from reportlab.pdfgen import canvas
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.pagesizes import landscape, letter, A4
from reportlab.lib.units import cm, inch
from reportlab.platypus import Image, Paragraph, Frame, KeepInFrame

styles = getSampleStyleSheet()
styleN = styles['Normal']
styleH = styles['Heading1']
story = []


pdf_file_name = 'report_.pdf'
c = canvas.Canvas(pdf_file_name)
f = Frame(0.5*inch, inch, 7*inch, 10.5*inch, showBoundary=1)

story.append(Paragraph("<font size='12' face='times' color='blue'>>SOME TEXT!</font>",styleN))
story.append(Paragraph("<font size='10' face='times'>SOME TEXT</font>", styleN) )
story.append( Paragraph('MORE TEXT HERE', styleN ) )

f.addFromList(story,c)
del story [:]
c.save()

【问题讨论】:

  • 很久了,但是你运行代码时遇到了什么错误?

标签: python pdf frame reportlab paragraph


【解决方案1】:

根据reportlab API,您不应该直接使用Frame,而应该使用Flowable,例如Paragraph,这将为您创建和操作框架。例如,您应该使用而不是 f.addFromList(story,c)

for p in story:
    while f.add(p, c) == 0:
        f.split(p, c)
        f = Frame(0.5*inch, inch, 7*inch, 10.5*inch, showBoundary=1)

这样,f.add 将在成功时返回 1,当它无法将 p 放入其中时返回 0,当这种情况发生时,我们使用 f.split 尽可能多地从 p 中提取到 填充 f 而不是用新框架替换f

【讨论】:

  • 谢谢随机用户名!非常抱歉在赏金结束后这么晚才回复您。我尝试了代码,txt 被下一页文本覆盖。这就是i.imgur.com/E8NCm6g.png?1 的样子你知道如何解决这个问题或者如何创建跳转到我创建的新页面吗?
  • 我想通了!你的回答是最接近的!我会修改你的答案并接受它!非常感谢@randomusername :)
【解决方案2】:

我想你可以这样做,但我不确定这是否是最好的方法。

如果我们首先用数据库中的整个文本声明一个字符串变量

the_text = "Here you would have your sql call, but this is just for demonstration purposes :)"

我们的下一步是创建一个包含所有单词的列表

text_list = the_text.split(' ')

您可能需要稍微配置一下,具体取决于字数 适合一页。为此,我只想说我们希望在每页上显示 3 个字。

words_on_page = 3

现在是“魔法”。 我们创建了一个 for 循环,其中 x 将通过 text_list 逐步迭代 在这种情况下,它从 0 处的第一个单词开始,每个循环向上跳 3 次

然后在循环内部我们有一个从 x 到 (x + 3) 然后对于每 3 个单词,我们用一个空格将它们连接在一起。

然后你可以把它放到你的框架中

for x in range(0, len(text_list), words_on_page):
    page_text = " ".join(text_list[x:x + words_on_page])
    do_something_with_the(page_text)

现在我们有了适合每一页的单词列表。每个页面上都有相同数量的单词。 这可能并不理想,但您可以接受这一点并做出更好的拆分。

代码:

the_text = "Here you would have your sql call, but this is just for demonstration purposes :)"

text_list = the_text.split(' ')

words_on_page = 3

for x in range(0, len(text_list), words_on_page):
    page_text = " ".join(text_list[x:x + words_on_page])
    do_something_with_the(page_text)

【讨论】:

  • 谢谢鹅的回答,很抱歉我花了太长时间才回复你!我所拥有的文本的长度是可变的,因为在行中返回,文本大小也不同,因此行数可能会随着这些因素而变化。
猜你喜欢
  • 2021-05-09
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
相关资源
最近更新 更多