微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在python reportlab platypus框架内实现文本换行和分词?

如何解决如何在python reportlab platypus框架内实现文本换行和分词?

我想从文本和数据创建一些 pdf 文件。 我使用 platypus reportlab 设置了一些框架,但是当我尝试填充它们时,文本只是在单个框架中超出了页边距。

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

但是由于给定文本似乎存在某种换行操作,我相信这也适用于框架边界..

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

有谁知道我为什么会遇到这些麻烦?

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

resultpdf_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,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),2*(A4[1]/3-100),showBoundary=1) #ingredients
blw_pic_frame = Frame(0,A4[1]*(1/3),(A4[1]/3-100),showBoundary=1)
facts_frame = Frame(0,100+(A4[1]*1/3),showBoundary=1)
todo_frame = Frame(100,A4[0]-100,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()

解决方法

你可以用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 
,
  1. 我无法在所有框架上书写,因为我的文字不能正确地放在框架上
  2. 文本换行不起作用,因为(这是一个猜测)我在创建框架时弄乱了正确的宽度值,也没有设置明确的边距填充。

以下代码现在生成此 PDF 作为示例: https://imgur.com/Yu7r1QG

现在,有什么办法可以感觉到框架中的剩余空间吗? 我想根据此剩余空间检查减小文本大小,因为我必须将尝试生成的任何配方留在一个 DIN A4 页面上

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.platypus import Paragraph,Frame,Spacer
from reportlab.lib.colors import Color
from reportlab.lib.styles import getSampleStyleSheet,ParagraphStyle
from reportlab.lib.units import cm
from reportlab.lib.enums import TA_JUSTIFY,TA_LEFT,TA_CENTER


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

styles = getSampleStyleSheet() 

styleN = styles["BodyText"]
styleN.alignment = TA_LEFT 

styleH = styles["Heading2"]
styleH.alignment = TA_LEFT


#Recipe Image
recipie_image = "recipe_images/Rote Beete Carpaccio mit Walnüssen und Pinienkernen.png"
c.drawImage(recipie_image,A4[2]*2/3,A4[2]/3,A4[2]/3)
                                                      

dn_frame = Frame(A4[2]/3,A4[2]-100,A4[0]-A4[2]/3,100,leftPadding=6,bottomPadding=6,rightPadding=6,topPadding=6,showBoundary=1) #Dish name and serves
ingr_frame = Frame(A4[2]/3,100+(A4[2]*1/3),A4[2]-100-(100+(A4[2]*1/3)),showBoundary=1) #ingredients
blw_pic_frame = Frame(0,A4[2]*(1/3),A4[2]/3-100,showBoundary=1)
facts_frame = Frame(0,showBoundary=1)
todo_frame = Frame(100,A4[0]-100,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_text = Paragraph('Rote Beete Carpaccio mit Walnüssen und Pinienkernen',styleH)
dn_subtext = Paragraph('Rezept für 4 Portionen',styleN)     
dn_story = []
dn_story.append(dn_text)
dn_story.append(Spacer(1,0.2*cm))
dn_story.append(dn_subtext)
dn_frame.addFromList(dn_story,c)

ingr_story = []
ingr_text = Paragraph(text,styleN)
ingr_story.append(Paragraph('Zutaten',styleH))
ingr_story.append(ingr_text)
ingr_story.append(Spacer(1,0.2*cm))
ingr_story.append(ingr_text)
ingr_story.append(Spacer(1,0.2*cm))
ingr_story.append(ingr_text)
ingr_frame.addFromList(ingr_story,c)

blw_pic_story = []
blw_pic_text = Paragraph(text,styleN)
blw_pic_story.append(Paragraph('Health Data',styleH))
blw_pic_story.append(blw_pic_text)
blw_pic_story.append(Spacer(1,0.2*cm))
blw_pic_frame.addFromList(blw_pic_story,c)

facts_story = []
s=0
while s < 4:
    facts_story.append(Paragraph("Preis $$$\n Kochzeit: 40 min",styleN))
    facts_story.append(Paragraph('Hier kommt ein Bild',styleH))
    facts_story.append(Paragraph("Why so serious?",styleN))
    s=s+1
facts_frame.addFromList(facts_story,c)

todo_story = []
j=0
while j < 4:
    todo_story.append(Paragraph('Schritt: '+str(j+1)+'\n',styleH))
    todo_story.append(Paragraph(10* "Schütteln sie den Salat ",styleN))
    j=j+1
todo_frame.addFromList(todo_story,c)

c.save()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。