如何知道一个框架的结尾来创建一个新的报告实验室
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)
我使用 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)