Advertisement
ALEXANDAR_GEORGIEV

balance_3

Jul 10th, 2022
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 18.26 KB | None | 0 0
  1. from reportlab.lib.pagesizes import A4,landscape, portrait
  2. from reportlab.lib.units import mm
  3. from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
  4. from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY
  5. from reportlab.lib import colors
  6. from reportlab.pdfgen import *
  7. from reportlab.pdfgen.canvas import Canvas
  8. from reportlab.platypus import *
  9. from reportlab.platypus import Paragraph, Frame, Table, TableStyle, KeepInFrame, BaseDocTemplate, PageTemplate
  10. from reportlab.platypus import SimpleDocTemplate
  11. from reportlab.platypus import flowables
  12. from reportlab.platypus.paragraph import ParagraphStyle
  13. # from tkinter.font import *
  14. # font = Font(family= , size= , weight= , slant= , underline= , overstrike= )
  15. from reportlab.pdfbase.ttfonts import TTFont
  16. from reportlab.pdfbase import pdfmetrics
  17. from lib_data import data_table_a, list_style_a, data_table_p, text_antec, style_antec
  18. # Vertical elements size
  19. # -------------------------------------------
  20. styles = getSampleStyleSheet() #
  21. styleN = styles['BodyText']
  22. styleN.alignment = TA_LEFT
  23. styleBH = styles["Normal"]
  24. styleBH.alignment = TA_CENTER
  25. pdfmetrics.registerFont(TTFont('Times','Times.ttf', 'UTF-8'))
  26. pdfmetrics.registerFont(TTFont('Timesbd','Timesbd.ttf', 'UTF-8'))
  27. pdfmetrics.registerFont(TTFont('Timesi','Timesi.ttf', 'UTF-8'))
  28. pdfmetrics.registerFont(TTFont('Timesbi','Timesbi.ttf', 'UTF-8'))
  29. #pdfmetrics.registerFont(TTFont('Verdana', 'Verdana.ttf', 'UTF-8'))
  30. st = styles['Normal']
  31. styleTB = styles['BodyText']
  32.  
  33. extra = []
  34.  
  35.  
  36.  
  37. # -------------------------------------------
  38. def append_empty_row(empty_row, extra_row = None):
  39.     if len_active > len_passive:    # Добави diff_rows в пасива
  40.         for i in range(1, diff_rows + 1):
  41.             data_table_p2.append(['', '', ''])
  42.             extra.append({'span': 'rows', "bgcolor": "gray"})
  43.  
  44.     elif len_active < len_passive:  # Добави diff_rows в актива
  45.         for i in range(1, diff_rows + 1):
  46.             data_table_a2.append(['', '', ''])
  47.             extra.append({'span': 'rows', "bgcolor": "gray"})
  48.  
  49.     else:
  50.         return
  51.  
  52.  
  53. def margins():    # Line coordinates
  54.     balance_3.setLineWidth(0.01)  # Дебелина на линията
  55.     balance_3.setStrokeColor('greenyellow')  # Цвят на линията
  56.     balance_3.line(left_m, bottom_m, left_m, A4[1] - top_m)  # Left margin
  57.     balance_3.line(left_m, A4[1] - top_m, A4[0] - right_m, A4[1] - top_m)  # Top margin
  58.     balance_3.line(A4[0] - right_m, A4[1] - top_m, A4[0] - right_m, bottom_m)  # Right margin
  59.     balance_3.line(A4[0] - right_m, bottom_m, left_m, bottom_m)  # Bottom margin
  60.     balance_3.setStrokeColor('red')  # Цвят на линията
  61.  
  62.  
  63. def frames(x0, y0, width, height, bound, id, story=None):
  64.     if story is None:
  65.         story = []
  66.     frame = Frame(x0, y0, width, height, showBoundary=bound, bottomPadding=0,
  67.                   topPadding=0, leftPadding=0, rightPadding=0)
  68.     frame.addFromList(story, balance_3)  # Показва frame
  69.     return frame
  70.  
  71.  
  72. top_m = 25*mm   #
  73. top_f = A4[1] * 0.1
  74. bottom_f_h = A4[1] * 0.1
  75. end_f_h = A4[1] * 0.122
  76. bottom_m = 25*mm    #
  77. balance_f = A4[1] - top_m - top_f - bottom_f_h - end_f_h - bottom_m
  78. # Horizontal elements size
  79. left_m = 25*mm   # 25mm / 210mm =  0.119
  80. right_m = 25*mm
  81. w_antec = A4[0] - left_m - right_m      # Широчина на антетката 453.54330708661416
  82. h_antec = 5 * 5 * mm
  83.  
  84. col_0 = col_3 = w_antec / 2 - 29 - 29     # 337.54330708661416 337.54330708661416
  85. print(w_antec)
  86. print(col_0, col_3)
  87.  
  88. h_active = (A4[1] - top_m - top_f - h_antec - bottom_f_h - end_f_h - bottom_m)    # h_Aктива
  89. w_active = w_passive = w_antec / 2    #A4[0] * 0.38
  90.  
  91. top_f_l_width = (w_antec) / 3
  92.  
  93. # Top_frame_right + coordinates
  94. top_f_r_width = top_f_l_width
  95.  
  96. # Bottom_frame_left
  97. bottom_f_l = top_f_r_width
  98. # Bottom_frame_right
  99. bottom_f_r = top_f_r_width
  100. # End_frame
  101. end_f_w = (w_antec) * 0.6
  102.  
  103. balance_3 = Canvas('Balance_3.pdf', pagesize=A4)    # Balance_3.pdf
  104. # Margins
  105. margins()
  106. # Top frame left
  107. story = []
  108. story.append(Paragraph('"<font face=Timesbd>ОФИС ГЕОРГИЕВ ЕООД</font>"'))
  109. story.append(Paragraph('<font face=Times>4230 Асеновград, ул. "Княз Александър Батенберг", № 24</font>'))
  110. story.append(Paragraph('<br/><br/><font face=Times>Дата на съставяне:</font> <font face=Timesbd>19.06.2022 г.</font>'))
  111. frames(left_m, A4[1] - top_m - top_f, top_f_l_width, top_f, 0, 'top_frame_left', story)
  112. # Top frame right
  113. story = []
  114. story.append(Paragraph('<font face=Timesbd>ПРИЛОЖЕНИЕ</font><font face=Times> 1 към НСС 1</font>'))
  115. story.append(Paragraph('<font face=Timesbd>ЕИК:</font><font face=Times> 825 613 327</font>'))
  116. story.append(Paragraph('<font face=Timesbd>КИД:</font><font face=Times> 4120</font>'))
  117. story.append(Paragraph('<font face=Timesbd>Наименование:</font><font face=Times> Строителство на жилищни'
  118.                        ' и нежилищни сгради</font>'))
  119. frames(A4[0] - right_m - top_f_r_width, A4[1] - top_m - top_f, top_f_r_width, top_f, 0, 'top_frame_right', story)
  120.  
  121. title = 'СЧЕТОВОДЕН БАЛАНС'
  122. pdfmetrics.registerFont((TTFont('Timesbd', 'timesbd.ttf')))
  123. text_len = balance_3.stringWidth(title, "Timesbd", 9)
  124. balance_3.setFont('Timesbd', 9, leading=100)
  125. balance_3.drawString(left_m + w_active - text_len / 2, A4[1] - top_m - top_f + 20, title)
  126. # print(text_len)
  127. data_balance = 'към 31.12.2021г.'
  128. pdfmetrics.registerFont((TTFont('Times', 'times.ttf')))
  129. text_len = balance_3.stringWidth(data_balance, "Times", 9)  # Дава широчината на стринга
  130. balance_3.setFont('Times', 9, leading=100)
  131. balance_3.drawString(left_m + w_active - text_len / 2, A4[1] - top_m - top_f + 8, data_balance)
  132.  
  133. # АНТЕТКА
  134. # Антетка - Таблица
  135. t_antec = Table(
  136.     text_antec,
  137.     colWidths=[col_0, 29, 29, col_3, 29, 29],    # 234.13779527559058
  138.     rowHeights=5*mm
  139.     )
  140. # Story Антетка
  141. story_antec = []
  142. t_antec.setStyle(style_antec)
  143. story_antec.append(t_antec)
  144. # Антетка - Frame
  145. x1 = left_m                         # x начало на Balance_frame_left
  146. y1 = A4[1] - top_m - top_f - h_antec      # y начало на Balance_frame_left
  147. frames(x1, y1, w_antec, h_antec, 1, 'antec_frame', story_antec)
  148.  
  149. # ДЪЛЖИНА НА БАЛАНСА
  150. max_num_data_rows = 45
  151.     # Активи
  152. num_dat_rows = len(data_table_a)
  153. data_table_a1 = data_table_a
  154.  
  155. odit = True
  156. # if odit:
  157. #     if total_rows > 39:
  158. #         sheet_2 = True
  159. data_table_a2 = []  # Таблица за страница 2        
  160. if num_dat_rows > max_num_data_rows:
  161.     data_table_a1 = data_table_a[0: max_num_data_rows - 1]  # от 0 до 44 = общо 45
  162.     data_table_a2 = data_table_a[max_num_data_rows:]  # от 45 до края
  163.     # Пасиви
  164. num_dat_rows_p = len(data_table_p)
  165. data_table_p1 = data_table_p
  166.  
  167. data_table_p2 = []  # Таблица за страница 2
  168. if num_dat_rows_p > max_num_data_rows:
  169.     data_table_p1 = data_table_p[0: max_num_data_rows - 1]  # от 0 до 44 = общо 45
  170.     data_table_p2 = data_table_p[max_num_data_rows:]  # от 45 до края
  171. # БАЛАНС АКТИВИ
  172. ta = Table(
  173.     data_table_a1,
  174.     colWidths=[(w_active - 58), 29, 29],    # 234.13779527559058
  175.     rowHeights=4*mm,
  176.     )
  177. w, h = ta.wrap(0, 0)    # Дава размерите на таблицата
  178. # print(w, ' ', h)    # 240.94488188976382   419.52755905511816
  179. story_a = []
  180. ta.setStyle(list_style_a)
  181. story_a.append(ta)
  182. # ----------------------------------------
  183. # Брой редове в таблицата на Balance_frame_left
  184. count_data_rows = len(data_table_a)
  185. # print(count_data_rows)  # 37
  186. # Balance frame left
  187. x1 = left_m                         # x начало на Balance_frame_left
  188. y1 = A4[1] - top_m - top_f - h_antec - h      # y начало на Balance_frame_left
  189. balance_frame_left_height = h
  190. frames(x1, y1, w_active, balance_frame_left_height, 1, 'balance_frame_left', story_a)
  191. # БАЛАНС ПАСИВИ
  192. tp = Table(
  193.     data_table_p1,
  194.     colWidths=[(w_passive - 58), 29, 29],    # 234.13779527559058
  195.     rowHeights=4*mm,
  196.     )
  197. w_p, h_p = ta.wrap(0, 0)    # Дава размерите на таблицата
  198. # print(w_p, ' ', h_p)    # 240.94488188976382   419.52755905511816
  199. story_p = []
  200. tp.setStyle(list_style_a)
  201. story_p.append(tp)
  202. # ----------------------------------------
  203. # Брой редове в таблицата на Balance_frame_passive
  204. count_data_rows_p = len(data_table_p)
  205. # print(count_data_rows)  # 37
  206. # Balance frame passive
  207. x1_r_f = left_m + w_passive
  208. balance_frame_right_height = h_p
  209. frames(x1_r_f, y1, w_passive, balance_frame_right_height, 1, 'balance_frame_right', story_p)
  210.  
  211. if count_data_rows > 45:
  212.     page_num = balance_3.getPageNumber()
  213.     end_page = 'Страница 1 от 2'
  214.     pdfmetrics.registerFont((TTFont('Timesbs', 'timesbi.ttf')))
  215.     text_len = balance_3.stringWidth(end_page, "Timesbi", 10)
  216.     balance_3.setFont('Timesbi', 9, leading=100)
  217.     balance_3.drawString(left_m + w_active - text_len / 2, y1 - 40, f'Страница {page_num} от 2')
  218.     balance_3.showPage()
  219.     margins()
  220.     # ------------------------------------------------
  221.     pdfmetrics.registerFont(TTFont('Times', 'Times.ttf', 'UTF-8'))
  222.     pdfmetrics.registerFont(TTFont('Timesbd', 'Timesbd.ttf', 'UTF-8'))
  223.     pdfmetrics.registerFont(TTFont('Timesi', 'Timesi.ttf', 'UTF-8'))
  224.     pdfmetrics.registerFont(TTFont('Timesbi', 'Timesbi.ttf', 'UTF-8'))
  225.     # pdfmetrics.registerFont(TTFont('Verdana', 'Verdana.ttf', 'UTF-8'))
  226.     st = styles['Normal']
  227.     # ------------------------------------------------
  228.     # Top frame left
  229.     story = []
  230.     story.append(Paragraph('"<font face=Timesbd>ОФИС ГЕОРГИЕВ ЕООД</font>"'))
  231.     story.append(Paragraph('<font face=Times>4230 Асеновград, ул. "Княз Александър Батенберг", № 24</font>'))
  232.     story.append(
  233.         Paragraph('<br/><br/><font face=Times>Дата на съставяне:</font> <font face=Timesbd>19.06.2022 г.</font>'))
  234.     frames(left_m, A4[1] - top_m - top_f, top_f_l_width, top_f, 0, 'top_frame_left', story)
  235.     # Top frame right
  236.     story = []
  237.     story.append(Paragraph('<font face=Timesbd>ПРИЛОЖЕНИЕ</font><font face=Times> 1 към НСС 1</font>'))
  238.     story.append(Paragraph('<font face=Timesbd>ЕИК:</font><font face=Times> 825 613 327</font>'))
  239.     story.append(Paragraph('<font face=Timesbd>КИД:</font><font face=Times> 4120</font>'))
  240.     story.append(Paragraph(
  241.         '<font face=Timesbd>Наименование:</font><font face=Times> Строителство на жилищни и нежилищни сгради</font>'))
  242.     frames(A4[0] - right_m - top_f_r_width, A4[1] - top_m - top_f, top_f_r_width, top_f, 0, 'top_frame_right', story)
  243.     title = 'СЧЕТОВОДЕН БАЛАНС'
  244.     pdfmetrics.registerFont((TTFont('Timesbd', 'timesbd.ttf')))
  245.     text_len = balance_3.stringWidth(title, "Timesbd", 9)
  246.     balance_3.setFont('Timesbd', 9, leading=100)
  247.     balance_3.drawString(left_m + w_active - text_len / 2, A4[1] - top_m - top_f + 20, title)
  248.     # print(text_len)
  249.  
  250.     data_balance = 'към 31.12.2021г.'
  251.     pdfmetrics.registerFont((TTFont('Times', 'times.ttf')))
  252.     text_len = balance_3.stringWidth(data_balance, "Times", 9)  # Дава широчината на стринга
  253.     balance_3.setFont('Times', 9, leading=100)
  254.     balance_3.drawString(left_m + w_active - text_len / 2, A4[1] - top_m - top_f + 8, data_balance)
  255.     # АНТЕТКА 2
  256.     # Антетка - Таблица
  257.     t_antec_2 = Table(
  258.         text_antec,
  259.         colWidths=[col_0, 29, 29, col_3, 29, 29],  # 234.13779527559058
  260.         rowHeights=5 * mm
  261.     )
  262.     # Story Антетка
  263.     story_antec = []
  264.     t_antec_2.setStyle(style_antec)
  265.     story_antec.append(t_antec_2)
  266.     # Антетка - Frame
  267.     x1 = left_m  # x начало на Balance_frame_left
  268.     y1 = A4[1] - top_m - top_f - h_antec  # y начало на Balance_frame_left
  269.     frames(x1, y1, w_antec, h_antec, 1, 'antec_frame', story_antec)
  270.  
  271.     # Таблица Актив стр. 2
  272.     ta2 = Table(
  273.         data_table_a2,
  274.         colWidths=[(w_active - 58), 29, 29],  # 234.13779527559058
  275.         rowHeights=4 * mm,
  276.     )
  277.     w, h = ta2.wrap(0, 0)  # Дава размерите на таблицата
  278.     # print(w, ' ', h)  # 240.94488188976382   419.52755905511816
  279.     story_a_2 = []
  280.     ta2.setStyle(list_style_a)
  281.     story_a_2.append(ta2)
  282.     # Balance frame left
  283.     x1 = left_m  # x начало на Balance_frame_left
  284.     y1 = A4[1] - top_m - top_f - h_antec - h  # y начало на Balance_frame_left
  285.     balance_frame_left_height = h
  286.     frames(x1, y1, w_active, balance_frame_left_height, 1, 'balance_frame_left_2', story_a_2)
  287.  
  288.  
  289.  
  290.     # Таблица Пасив стр. 2
  291.     tp2 = Table(
  292.         data_table_p2,
  293.         colWidths=[(w_passive - 58), 29, 29],  # 234.13779527559058
  294.         rowHeights= 4 * mm
  295.     )
  296.     w_p, h_p = tp2.wrap(0, 0)  # Дава размерите на таблицата
  297.     # print(w_p, ' ', h_p)  # 240.94488188976382   419.52755905511816
  298.     story_p_2 = []
  299.     tp2.setStyle(list_style_a)
  300.     story_p_2.append(tp2)
  301.     # Balance frame passive
  302.    # x1 = left_m  # x начало на Balance_frame_left
  303.     y1_p = A4[1] - top_m - top_f - h_antec - h_p  # y начало на Balance_frame_right
  304.     balance_frame_right_height = h_p
  305.     frames(x1_r_f, y1_p, w_passive, balance_frame_right_height, 1, 'balance_frame_passive_2', story_p_2)
  306.  
  307.     len_active = len(data_table_a2)
  308.     len_passive = len(data_table_p2)
  309.     diff_rows = abs(len_active - len_passive)
  310.     print(len_active)
  311.     print(len_passive)
  312.     if len_active > len_passive:
  313.         print('Добави diff_rows в пасива')
  314.     elif len_active < len_passive:
  315.         print('Добави diff_rows в актива')
  316.  
  317.     if len_active > len_passive:
  318.         y1 = A4[1] - top_m - top_f - h_antec - balance_frame_left_height - bottom_f_h - 10 * mm
  319.     else:
  320.         y1 = A4[1] - top_m - top_f - h_antec - h_p - bottom_f_h - 10 * mm
  321.  
  322.     # Изравнява Актива и Пасива
  323.     append_empty_row()
  324.  
  325.  
  326.     # Bottom frame left
  327.     story = []
  328.     story.append(Paragraph('<font face=Timesbd>Ръководител: .......................</font>'))
  329.     story.append(Paragraph('<font face=Times>АЛЕКСАНДЪР ГЕОРГИЕВ ГЕОРГИЕВ</font>'))
  330.     #y1 = A4[1] - top_m - top_f - h_antec - balance_frame_left_height - bottom_f_h - 10 * mm
  331.     frames(x1, y1, w_active, bottom_f_h, 0, 'bottom_frame_left', story)
  332.     # # Bottom frame right
  333.     story = []
  334.     story.append(Paragraph('<font face=Timesbd>Съставител: .......................</font>'))
  335.     story.append(Paragraph('<font face=Times>СП "ОФИС ГЕОРГИЕВ ЕООД"</font>'))
  336.     story.append(Paragraph('<font face=Times>4230 Асеновград, ул."Цар Иван Асен II, № 47"</font>'))
  337.     story.append(Paragraph('<font face=Times>ЕИК: 115 882 107</font>'))
  338.     story.append(Paragraph('<font face=Timesbd>Представляващ: .......................</font>'))
  339.     story.append(Paragraph('<font face=Times>АЛЕКСАНДЪР ГЕОРГИЕВ ГЕОРГИЕВ</font>'))
  340.     x1 = left_m + w_active
  341.     frames(x1, y1, w_passive, bottom_f_h, 0, 'bottom_frame_right', story)
  342.     # Записки на одитора end_frame
  343.     story = []
  344.     story.append(Paragraph('<font face=Times>Годишният финансов отчет е одобрен (утвърден) и подписан от ръководството'
  345.                            ' с протокол на съвета на директорите от 24.06.2022 година.</font>'))
  346.     story.append(Paragraph('<font face=Times>Пояснителните бележки изложени в Приложението от стр. 1 до стр. 21, са'
  347.                            ' неразделна част от този годишен финансов отчет."</font>'))
  348.     story.append(Paragraph('<font face=Times>Заверил съгласно одиторски доклад с немодифицирано (неквалифицирано)'
  349.                            ' мнение с § за внимание, издаден на 2.04.2022 година."</font>'))
  350.     story.append(Paragraph('<font face=Times>Регистриран одитор: 0423 Костадин Арнаудов</font>'))
  351.     # # End frame
  352.     frames(left_m, bottom_m + 70, w_antec, end_f_h, 1, 'bottom_frame_right', story)
  353.  
  354.     # Страница 2 от 2
  355.     page_num = balance_3.getPageNumber()
  356.     end_page = 'Страница 1 от 2'
  357.     pdfmetrics.registerFont((TTFont('Timesbs', 'timesbi.ttf')))
  358.     text_len = balance_3.stringWidth(end_page, "Timesbi", 10)
  359.     balance_3.setFont('Timesbi', 9, leading=100)
  360.     balance_3.drawString(left_m + w_antec / 2 - text_len / 2, bottom_m + 50, f'Страница {page_num} от 2')
  361.  
  362. else:
  363.     #Bottom frame left
  364.     story = []
  365.     story.append(Paragraph('<font face=Timesbd>Ръководител: .......................</font>'))
  366.     story.append(Paragraph('<font face=Times>АЛЕКСАНДЪР ГЕОРГИЕВ ГЕОРГИЕВ</font>'))
  367.     y1 = A4[1] - top_m - top_f - balance_frame_left_height - bottom_f_h - 10 * mm
  368.     frames(x1, y1, w_active, bottom_f_h, 0, 'bottom_frame_left', story)
  369.     # # Bottom frame right
  370.     story = []
  371.     story.append(Paragraph('<font face=Timesbd>Съставител: .......................</font>'))
  372.     story.append(Paragraph('<font face=Times>СП "ОФИС ГЕОРГИЕВ ЕООД"</font>'))
  373.     story.append(Paragraph('<font face=Times>4230 Асеновград, ул."Цар Иван Асен II, № 47"</font>'))
  374.     story.append(Paragraph('<font face=Times>ЕИК: 115 882 107</font>'))
  375.     story.append(Paragraph('<font face=Timesbd>Представляващ: .......................</font>'))
  376.     story.append(Paragraph('<font face=Times>АЛЕКСАНДЪР ГЕОРГИЕВ ГЕОРГИЕВ</font>'))
  377.  
  378.     x1_b_f_r, y1_b_f_r = left_m + w_active, A4[1] - top_m - top_f - balance_f - bottom_f_h
  379.     frames(x1_b_f_r, y1, w_passive, bottom_f_h, 0, 'bottom_frame_right', story)
  380.  
  381. balance_3.showPage()  # saves current page
  382. balance_3.save()  # stores the file and close the canvas
  383.  
  384.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement