如何知道一个框架的结尾来创建一个新的报告实验室

how to know the end of a frame to create a new one reportlab

我使用 reportlab 构建了一个 pdf,以便对页面进行更多控制(颜色-填充-return 到线条...)我创建了一个框架。

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

我想知道如何判断 page/frame 的结尾,我应该为其余文本创建一个新的。

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()

根据报告实验室 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 将 return 成功时为 1,当无法容纳 p 时为 0,当发生这种情况时,我们使用 f.split 来提取尽可能从 p 填充 f 而不是用新框架替换 f

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

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

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

现在 "magic"。 我们创建一个 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)