首页 > 解决方案 > 如何在 python reportlab 鸭嘴兽框架内实现文本换行和分词?

问题描述

我想从文本和数据创建一些 pdf 文件。我用鸭嘴兽 reportlab 设置了一些框架,但是当我尝试填充它们时,文本只是写在单个框架中的页边距之外。

使用 ParagraphStyle() 类中的几个选项不会将文本换行在框架的末尾。

但由于给定文本似乎有某种包装操作,我相信这也适用于框架边界。

让我烦恼的另一件事是,我只能在一个框架上写字。使用不同的“故事”可以让我写在所有这些故事上。

有谁知道我为什么面临这些麻烦?

下面的脚本生成以下 pdf 文件片段:

结果pdf_snippet

任何帮助表示赞赏。问候

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.platypus import Paragraph, Frame
from reportlab.lib.colors import Color, black, blue, red
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm


c = canvas.Canvas('platypus_text_to_pdf.pdf', pagesize=(A4))

styles = getSampleStyleSheet() 
fiddle_style = ParagraphStyle('fiddle_style',
                           fontName="Helvetica-Bold",
                           backColor = '#FFFF00',
                           alignment = 0,
                           allowOrphans = 0,
                           allowWidows = 0,
                           borderColor = None,
                           borderPadding = 0,
                           borderRadius = None,
                           borderWidth = 100,
                           bulletAnchor = 'start',
                           bulletFontName = 'Helvetica',
                           bulletFontSize = 10,
                           bulletIndent = 0,
                           embeddedHyphenation = 0,
                           endDots = None,
                           firstLineIndent = 0,
                           fontSize = 10,
                           justifyBreaks = 0,
                           justifyLastLine = 0,
                           leading = 12,
                           leftIndent = 0,
                           linkUnderline = 0,
                           rightIndent = 20,
                           spaceAfter = 0,
                           spaceBefore = 0,
                           spaceShrinkage = 0.05,
                           splitLongWords = 1,
                           strikeGap = 1,
                           strikeOffset = 0.25,
                           strikeWidth =1,
                           textColor = Color(0,0,0,1),
                           textTransform = None,
                           underlineGap = 1,
                           underlineOffset = -0.125,
                           underlineWidth =1,
                           uriWasteReduce = 0,
                           wordWrap = None,
                           parent=styles['Heading2'],
                           )

dn_frame = Frame(A4[1]/3, A4[1]/3+(A4[1]/3)+(A4[1]/3-100),A4[1]*(2/3),100, showBoundary=1) #Dish name and serves
ingr_frame = Frame(A4[1]/3, (A4[1]*2/3)-(A4[1]/3-100),A4[1]*(2/3),2*(A4[1]/3-100), showBoundary=1) #ingredients
blw_pic_frame = Frame(0, (A4[1]*2/3)-(A4[1]/3-100),A4[1]*(1/3),(A4[1]/3-100), showBoundary=1)
facts_frame = Frame(0, 0,100,100+(A4[1]*1/3), showBoundary=1)
todo_frame = Frame(100, 0,A4[0]-100,100+(A4[1]*1/3), showBoundary=1)

text= '''
        „Lorem ipsum dolor sit amet, consectetur adipisici elit, …" ist ein Blindtext, der nichts bedeuten soll, sondern als Platzhalter im Layout verwendet wird, um einen Eindruck vom fertigen Dokument zu erhalten. Die Verteilung der Buchstaben und der Wortlängen des pseudo-lateinischen Textes entspricht in etwa der natürlichen lateinischen Sprache. Der Text ist absichtlich unverständlich, damit der Betrachter nicht durch den Inhalt abgelenkt wird.
    '''
dn_story = []
dn_story.append(Paragraph(text, fiddle_style))

dn_frame.addFromList(dn_story,c)
ingr_frame.addFromList(dn_story,c)
blw_pic_frame.addFromList(dn_story,c)
facts_frame.addFromList(dn_story,c)
todo_frame.addFromList(dn_story,c)

c.save()

标签: python-3.xreportlabplatypus

解决方案


您可以使用 framename._aH 感受剩余的帧空间,您可以使用 floatcontentname.wrap(todo_frame._aW,todo_frame._aH)[1] 了解浮动对象的空间需求

我的 ingr_frame 示例:

#create the frame
ingr_frame = Frame(A4[1]/3, 100+(A4[1]*1/3), A4[0]-A4[1]/3, A4[1]-100-(100+(A4[1]*1/3))-50, showBoundary=0)
#create a text
ingr_text = Paragraph('hello', styleN)
#get text heigth requirement
ingr_text.wrap(ingr_frame._aW,ingr_frame._aH)[1]
#get available frame heigh space
ingr_frame._aH 

推荐阅读