如何知道一个框架的结束来创建一个新的reportlab

2024-06-16 13:03:42 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: textfromimport框架pdflib页面font
2条回答

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

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

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

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

^{2}$

您可能需要配置一点,这取决于有多少个单词 放在一页纸上。对于这一点,我只想说每一页都要3个字。在

words_on_page = 3

现在来看看“魔法”。 我们做一个for循环,x将通过文本列表逐级写入 在这个例子中,它从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)

根据reportlabapi,您不应该直接使用Frame,而应该使用Flowable,例如Paragraph,这样可以为您创建和操作框架。例如,您应该使用

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.splitp中提取尽可能多的内容到填充f,然后用一个新框架替换{}。在

相关问题 更多 >