【问题标题】:How to achieve text wrapping and word seperation inside python reportlab platypus frames?如何在 python reportlab 鸭嘴兽框架内实现文本换行和分词?
【发布时间】:2020-12-27 17:29:01
【问题描述】:

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

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

但由于给定文本似乎有某种换行操作,我相信这也可以在框架边界内工作..

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

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

下面的这个脚本会生成以下 pdf 文件 sn-p:

感谢任何帮助。 问候

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.x reportlab platypus


    【解决方案1】:

    您可以使用 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 
    

    【讨论】:

      【解决方案2】:
      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, 0, 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[0]-A4[2]/3, A4[2]-100-(100+(A4[2]*1/3)), leftPadding=6, bottomPadding=6, rightPadding=6, topPadding=6, showBoundary=1) #ingredients
      blw_pic_frame = Frame(0, 100+(A4[2]*1/3), A4[2]*(1/3), A4[2]/3-100, leftPadding=6, bottomPadding=6, rightPadding=6, topPadding=6, showBoundary=1)
      facts_frame = Frame(0, 0,100,100+(A4[2]*1/3), leftPadding=6, bottomPadding=6, rightPadding=6, topPadding=6, showBoundary=1)
      todo_frame = Frame(100, 0,A4[0]-100,100+(A4[2]*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_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()
      

      【讨论】:

        猜你喜欢
        • 2012-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-30
        • 1970-01-01
        • 1970-01-01
        • 2012-01-01
        • 1970-01-01
        相关资源
        最近更新 更多