new feature: indentation for InvoiceText
Bernd Wurst

Bernd Wurst commited on 2024-02-14 18:07:50
Zeige 4 geänderte Dateien mit 23 Einfügungen und 5 Löschungen.

... ...
@@ -12,10 +12,11 @@ class InvoiceImage(object):
12 12
 
13 13
 
14 14
 class InvoiceText(object):
15
-    def __init__(self, content, urgent=False, headline=None):
15
+    def __init__(self, content, urgent=False, headline=None, indent=None):
16 16
         self.paragraphs = [content]
17 17
         self.urgent = urgent
18 18
         self.headline = headline
19
+        self.indent = indent
19 20
         self.fontsize = 0  # relative Schriftgröße ggü default
20 21
 
21 22
     def addParagraph(self, content):
... ...
@@ -588,6 +588,12 @@ class PDF(object):
588 588
                 my_font_size = font_size + part.fontsize  # Relative Schriftgröße beachten
589 589
                 self.canvas.setFont(self.font, my_font_size)
590 590
                 left, right = self.leftcontent, self.rightcontent
591
+                indent = 0
592
+                if part.indent:
593
+                    if isinstance(part.indent, bool):
594
+                        indent = 2 * cm
595
+                    else:
596
+                        indent = part.indent * cm
591 597
                 firsttime = True
592 598
                 headlines = []
593 599
                 if part.urgent:
... ...
@@ -596,7 +602,7 @@ class PDF(object):
596 602
                 if part.headline:
597 603
                     headlines = self._splitToWidth(part.headline, right - left, self.font, my_font_size)
598 604
                 for para in part.paragraphs:
599
-                    lines = self._splitToWidth(para, right - left, self.font, my_font_size)
605
+                    lines = self._splitToWidth(para, right - left - indent, self.font, my_font_size)
600 606
                     if part.urgent:
601 607
                         need_height = len(lines) * self._lineHeight(my_font_size)
602 608
                         if len(headlines) > 0:
... ...
@@ -616,7 +622,7 @@ class PDF(object):
616 622
                         self.y -= self.line_padding
617 623
                         self.canvas.setFont(self.font, my_font_size)
618 624
                     for line in lines:
619
-                        self.canvas.drawString(left, self.y - self.font_height, line)
625
+                        self.canvas.drawString(left + indent, self.y - self.font_height, line)
620 626
                         self.y -= self._lineHeight(my_font_size)
621 627
                     self.y -= self.line_padding * 3
622 628
             elif isinstance(part, InvoiceImage):
... ...
@@ -149,8 +149,17 @@ def InvoiceTableToText(invoiceTable: InvoiceTable):
149 149
 
150 150
 def InvoiceTextToText(invoiceText: InvoiceText):
151 151
     ret = []
152
+    if invoiceText.headline:
153
+        for line in split_to_width(invoiceText.headline, 72):
154
+            ret.append(line)
155
+    indent = 0
156
+    if invoiceText.indent:
157
+        if isinstance(invoiceText.indent, bool):
158
+            indent = 2
159
+        else:
160
+            indent = invoiceText.indent
152 161
     for par in invoiceText.paragraphs:
153
-        for s in split_to_width(par, 72):
154
-            ret.append(s)
162
+        for s in split_to_width(par, 72 - indent):
163
+            ret.append(' ' * indent + s)
155 164
         ret.append('')
156 165
     return '\n'.join(ret)
... ...
@@ -156,6 +156,8 @@ if __name__ == '__main__':
156 156
     text = InvoiceText('Wir danken Ihnen, dass Sie unser Angebot in Anspruch genommen haben und hoffen weiterhin auf eine gute Zusammenarbeit. Dieser Rechnung liegen die Allgemeinen Geschäftsbedingungen zum Zeitpunkt des Rechnungsdatums zugrunde, die Sie unter https://www.schokokeks.org/agb abrufen können.')
157 157
     invoice.parts.append(text)
158 158
 
159
+    invoice.parts.append(InvoiceText('Das ist ein eingerückter Absatz mit etwas Text zum Testen der Line-Wrap-Funktion. Er hat auch eine Überschrift, um auch das zu zeigen.', headline='Schlussbemerkung', indent=2))
160
+
159 161
     textdata = InvoiceToText(invoice)
160 162
     pdfdata = InvoiceToPDF(invoice)
161 163
     xmldata = InvoiceToXML(invoice)
162 164