Advertisement
ALEXANDAR_GEORGIEV

pdf_dna_assets

Jan 4th, 2023
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 24.48 KB | Source Code | 0 0
  1. import subprocess
  2. from reportlab.lib import colors, fonts
  3. from reportlab.lib.pagesizes import A4,landscape, portrait
  4. from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Frame, PageBreak
  5. from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
  6. from reportlab.lib.units import mm
  7. from reportlab.pdfbase.ttfonts import TTFont
  8. from reportlab.pdfbase import pdfmetrics
  9. from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY
  10. from cells_table import Cells
  11. from json_file_io import JsonFileIo
  12. from Opiti.from_excel.classes.global_inc import registry
  13.  
  14.  
  15. class DaPdfReport:
  16.     def __init__(self):
  17.         self.setup_fonts()
  18.         self.normal_para_style = ParagraphStyle('blabla', fontName="Times", fontSize=7, leading=7, alignment=TA_CENTER)
  19.         self.da_print = self.get_da_print()
  20.         print("self.da_print А", self.da_print)
  21.         self.cell_formats = self.getCellFormats()
  22.         self.s = {
  23.             "pagesize": landscape(A4),
  24.             "margin-left": 15 * mm,
  25.             "margin-right": 15 * mm,
  26.             "margin-top": 18 * mm,
  27.             "margin-bottom": 15 * mm,
  28.         }
  29.         self.s["width"] = self.s["pagesize"][0]
  30.         self.s["height"] = self.s["pagesize"][1]
  31.  
  32.         self.doc = SimpleDocTemplate("landscape.pdf", pagesize=self.s["pagesize"],
  33.                                 rightMargin=self.s["margin-right"], leftMargin=self.s["margin-left"],
  34.                                 topMargin=self.s["margin-top"], bottomMargin=self.s["margin-bottom"])
  35.  
  36.         self.elements = []
  37.         self.elements.append(self.getRekwizitsTable())
  38.         self.elements.extend(self.getTitles())
  39.  
  40.         tables = self.getTables()
  41.         if (len(tables) < 2):
  42.             print("Достатъчна е 1 страница, вмъкваме 1 таблица")
  43.             self.elements.append(tables[0])
  44.             print("Вмъкваме подписите")
  45.             self.elements.append(self.getPodpisiTable())
  46.         else:
  47.             print("Нужни са 2 страници")
  48.             print("Вмъкваме таблица 1")
  49.             self.elements.append(tables[0])
  50.             self.elements.extend(self.getPageOfN(1))
  51.             print("Минаваме на нова страница")
  52.             self.elements.append(PageBreak())
  53.             print("Вмъкваме таблица 2")
  54.             self.elements.append(tables[1])
  55.             print("Вмъкваме подписите")
  56.             self.elements.append(self.getPodpisiTable())
  57.             self.elements.extend(self.getPageOfN(2))
  58.  
  59.         self.doc.build(self.elements)
  60.         subprocess.Popen(['landscape.pdf'], shell=True)
  61.  
  62.     def getPodpisiTableHeight(self):
  63.         return sum(self.getPodpisiRightRowHeights())
  64.  
  65.     def getPodpisiTable(self):
  66.         print("Подписи")
  67.         left = self.getPodpisiLeftTable()
  68.         right = self.getPodpisiRightTable()
  69.         table_data = [[left, "", right]]
  70.         free_width = self.getFreeWidth()
  71.         left_width = 50 * mm
  72.         right_width = 100 * mm
  73.         middle_width = A4[1] - self.s["margin-left"] - self.s["margin-right"] - left_width - right_width - free_width
  74.         col_widths = [left_width, middle_width, right_width]
  75.         table_height = self.getPodpisiTableHeight()
  76.         row_heights = [table_height]
  77.         table = Table(table_data, colWidths=col_widths, rowHeights=row_heights)
  78.         table.setStyle(TableStyle([
  79.             ('TEXTFONT', (0, 0), (-1, -1), 'Times'),
  80.             ('FONTNAME', (0, 0), (-1, -1), 'Times'),
  81.             ('FONT', (0, 0), (-1, -1), 'Times', 6, 7),
  82.             ('LEFTPADDING', (0, 0), (-1, -1), 0),
  83.             ('RIGHTPADDING', (0, 0), (-1, -1), 0),
  84.             ('TOPPADDING', (0, 0), (-1, -1), 0),
  85.             ('BOTTOMPADDING', (0, 0), (-1, -1), 0),
  86.             ('VALIGN', (0, 0), (-1, -1), "TOP"),
  87.             ('ALIGN', (0, 0), (-1, -1), "RIGHT"),
  88.         ]))
  89.         return table
  90.  
  91.     def getPodpisiLeftTable(self):
  92.         print("Подписи ляво")
  93.         table_data = [
  94.             ['Ръководител: .............'],
  95.             ['ДИМИТЪР ГЕОРГИЕВ ДЖАМБАЗОВ'],
  96.         ]
  97.         col_widths = [50 * mm]
  98.         row_heights = [5 * mm, 5 * mm]     # = 18
  99.         table = Table(table_data, colWidths=col_widths, rowHeights=row_heights)
  100.         table.setStyle(TableStyle([
  101.             ('FONT', (0, 0), (0, 0), 'Timesbd', 8, 7), # Ръководител
  102.             ('FONT', (0, 1), (0, 1), 'Times', 6, 7), # (Името)
  103.         ]))
  104.         return table
  105.  
  106.     def getPodpisiRightRowHeights(self):
  107.         return [5 * mm, 5 * mm, 3 * mm, 3 * mm, 5 * mm]
  108.     def getPodpisiRightTable(self):
  109.         print("Подписи дясно")
  110.         table_data = [
  111.             ['Съставител: .............'],
  112.             ['СП ОФИС ГЕОРГИЕВ ЕООД, Асеновград'],
  113.             ['ЕИК: 115 882 107'],
  114.             ['Представляващ: .............'],
  115.             ['АЛЕКСАНДЪР ГЕОРГИЕВ ГЕОРГИЕВ']
  116.         ]
  117.         col_widths = [50 * mm]
  118.         row_heights = self.getPodpisiRightRowHeights()     # = 18
  119.         table = Table(table_data, colWidths=col_widths, rowHeights=row_heights)
  120.         table.setStyle(TableStyle([
  121.             ('FONT', (0, 0), (0, 0), 'Timesbd', 8, 7), # Ръководител
  122.             ('FONT', (0, 1), (0, -1), 'Times', 6, 7), # (Името)
  123.             ('FONT', (0, 3), (0, 3), 'Timesbd', 8, 7), # Ръководител
  124.         ]))
  125.         return table
  126.  
  127.     def getEffSpan(self, o_c_1, o_r_1, o_c_2, o_r_2, da_print):  # ('SPAN', (15, 0), (15, 1)),
  128.         r = 0
  129.         e_c_1 = None; e_r_1 = None
  130.         e_c_2 = None; e_r_2 = None
  131.         for row_idx in da_print:
  132.             o_r = int(row_idx.replace("row_", ""))  # напр. 5
  133.             c = 0
  134.             for col_idx in da_print[row_idx]:
  135.                 o_c = int(col_idx.replace("col_", ""))
  136.  
  137.                 if o_r_1 <= o_r <= o_r_2 and o_c_1 <= o_c <= o_c_2:
  138.                     if e_c_1 is None:
  139.                         e_c_1 = c; e_c_2 = c
  140.                         e_r_1 = r; e_r_2 = r
  141.                     else:
  142.                         e_c_2 = c
  143.                         e_r_2 = r
  144.                 c += 1
  145.             r += 1
  146.  
  147.         if e_c_1 is None:
  148.             return None
  149.  
  150.         return [e_c_1, e_r_1, e_c_2, e_r_2]
  151.  
  152.     def getTables(self):
  153.         podpisiTableHeight = self.getPodpisiTableHeight()
  154.         row_heights = self.getRowHeights()
  155.         # Под реквизиттите се побират точно пърите 27 реда [0..26] на пълната таблица
  156.         height_limit = sum(row_heights[0:26:])
  157.         page_x_of_y = 10 * mm
  158.         # Очаквана височината на таблицата
  159.         total_height = 0
  160.         for row_idx in self.da_print:
  161.             r = int(row_idx.replace("row_", "")) # напр. 5
  162.             height = row_heights[r]
  163.             total_height += height
  164.         one_page_only = False
  165.         if podpisiTableHeight + total_height <= height_limit:
  166.             one_page_only = True
  167.  
  168.         max_table_height_page_1 = height_limit - page_x_of_y
  169.  
  170.         if one_page_only:
  171.             print("Достатъчна е 1 страница")
  172.         else:
  173.             print("Нужни са 2 страници")
  174.  
  175.         groups = {}
  176.         groups["dna"] = {
  177.             "start_row_idx": "row_4",
  178.             "end_row_idx": "row_9",
  179.             "fits_on_page_1": None
  180.         }
  181.         groups["dma"] = {
  182.             #"start_row": 10,
  183.             #"end_row": 20,
  184.             "start_row_idx": "row_10",
  185.             "end_row_idx": "row_20",
  186.             "fits_on_page_1": None
  187.         }
  188.         groups["dfa"] = {
  189.             "start_row_idx": "row_21",
  190.             "end_row_idx": "row_29",
  191.             "fits_on_page_1": None
  192.         }
  193.         groups["tax"] = {
  194.             "start_row_idx": "row_30",
  195.             "end_row_idx": "row_30",
  196.             "fits_on_page_1": None
  197.         }
  198.         groups["total"] = {
  199.             "start_row_idx": "row_31",
  200.             "end_row_idx": "row_31",
  201.             "fits_on_page_1": None
  202.         }
  203.  
  204.         # Фитлтрира групита така че да останат само тези, които реално присъстват
  205.         groups = {g_idx: g for g_idx, g in groups.items() if g["start_row_idx"] in self.da_print}
  206.         if one_page_only:
  207.             for g_idx in groups:
  208.                 groups[g_idx]["fits_on_page_1"] = True
  209.         else:
  210.             for g_idx in groups:
  211.                 #start_row_idx = groups[g_idx]["start_row_idx"] # Изглежда ненужен
  212.                 end_row_idx = groups[g_idx]["end_row_idx"]
  213.  
  214.                 groups[g_idx]["fits_on_page_1"] = False
  215.  
  216.                 height = 0
  217.                 for row_idx in self.da_print:
  218.                     r = int(row_idx.replace("row_", "")) # напр. 5
  219.                     height += row_heights[r]
  220.                     if height > max_table_height_page_1:
  221.                         break
  222.                     if row_idx == end_row_idx:
  223.                         groups[g_idx]["fits_on_page_1"] = True
  224.  
  225.             groups_on_page1 = {g_idx: g for g_idx, g in groups.items() if g["fits_on_page_1"]}
  226.             groups_count_total = len(groups)
  227.             groups_count_page1 = len(groups_on_page1)
  228.  
  229.             if groups_count_total == groups_count_page1:
  230.                 last_group_idx = list(groups.keys())[-1]  #напр "tax" или "dfa"
  231.                 groups[last_group_idx]["fits_on_page_1"] = False
  232.  
  233.         max_row_idx_page1 = 0
  234.         for g_idx in groups:
  235.             if groups[g_idx]["fits_on_page_1"]:
  236.                 max_row_idx_page1 = groups[g_idx]["end_row_idx"]
  237.         max_row_page1 = int(max_row_idx_page1.replace("row_", ""))
  238.         antetka_row_keys = ["row_0", "row_1", "row_2"]
  239.         da_print_page1 = {}
  240.         da_page1 = []
  241.         row_heights_page1 = []
  242.         da_print_page2 = {}
  243.         da_page2 = []
  244.         row_heights_page2 = []
  245.         for r_idx in self.da_print:
  246.             r = int(r_idx.replace("row_", ""))
  247.             da_row = []
  248.             for c_idx in self.da_print[r_idx]:
  249.                 c = int(c_idx.replace("col_", ""))
  250.                 v_idx = c_idx.replace("col_", "val_")
  251.                 val = self.da_print[r_idx][c_idx][v_idx]
  252.                 try:
  253.                     val = int(val)
  254.                     val = f"{val:,d}".replace(',', ' ')
  255.                 except:
  256.                     pass
  257.                 da_row.append(self.getCellParagraph(r, c, val))
  258.  
  259.             if r_idx in antetka_row_keys:
  260.                 da_print_page1[r_idx] = self.da_print[r_idx].copy()
  261.                 da_page1.append(da_row)
  262.                 row_heights_page1.append(row_heights[r])
  263.                 if one_page_only:
  264.                     pass # Няма нужда от стр 2
  265.                 else:
  266.                     da_print_page2[r_idx] = self.da_print[r_idx].copy()
  267.                     da_page2.append(da_row)
  268.                     row_heights_page2.append(row_heights[r])
  269.             else:
  270.                 if r <= max_row_page1:
  271.                     da_print_page1[r_idx] = self.da_print[r_idx].copy()
  272.                     da_page1.append(da_row)
  273.                     row_heights_page1.append(row_heights[r])
  274.                 else:
  275.                     if one_page_only:
  276.                         pass  # Няма нужда от стр 2
  277.                     else:
  278.                         da_print_page2[r_idx] = self.da_print[r_idx].copy()
  279.                         da_page2.append(da_row)
  280.                         row_heights_page2.append(row_heights[r])
  281.  
  282.         col_widths = [42 * mm]
  283.         col_widths.extend([15 * mm] * 15)
  284.  
  285.         orig_spans = [
  286.             ('SPAN', (0, 0), (0, 1)),
  287.             ('SPAN', (1, 0), (7, 0)),
  288.             ('SPAN', (8, 0), (14, 0)),
  289.             ('SPAN', (15, 0), (15, 1)),
  290.             ('SPAN', (0, 3), (15, 3)),
  291.             ('SPAN', (5, 7), (6, 7)),
  292.             ('SPAN', (5, 8), (6, 8)),
  293.             ('SPAN', (8, 7), (14, 7)),
  294.             ('SPAN', (8, 8), (14, 8)),
  295.             ('SPAN', (0, 10), (15, 10)),
  296.             ('SPAN', (8, 12), (14, 12)),
  297.             ('SPAN', (5, 18), (6, 18)),
  298.             ('SPAN', (5, 19), (6, 19)),
  299.             ('SPAN', (8, 18), (14, 18)),
  300.             ('SPAN', (8, 19), (14, 19)),
  301.             ('SPAN', (0, 21), (15, 21)),
  302.             ('SPAN', (8, 22), (14, 22)),
  303.             ('SPAN', (8, 23), (14, 23)),
  304.             ('SPAN', (8, 24), (14, 24)),
  305.             ('SPAN', (8, 25), (14, 25)),
  306.             ('SPAN', (8, 27), (14, 27)),
  307.             ('SPAN', (8, 28), (14, 28)),
  308.             ('SPAN', (8, 30), (14, 30)),
  309.         ]
  310.         table_page1 = Table(da_page1, colWidths=col_widths, rowHeights=row_heights_page1)
  311.         table_styles_page1 = [
  312.             ('GRID', (0, 0), (-1, -1), 0.5, colors.black),
  313.             ('BACKGROUND', (0, 0), (-1, 1), colors.lightgreen),
  314.             ('ALIGN', (1, 4), (-1, -1), "RIGHT"),
  315.             ('LEFTPADDING', (1, 1), (-1, 1), 2),
  316.             ('RIGHTPADDING', (0, 0), (-1, -1), 2),
  317.             ('TOPPADDING', (0, 0), (-1, -1), 2),
  318.             ('BOTTOMPADDING', (0, 0), (-1, -1), 2),
  319.             ('FONT', (0, 0), (-1, -1), 'Times', 7, 7),
  320.             ('VALIGN', (0, 0), (-1, -1), "MIDDLE"),
  321.             ('RIGHTPADDING', (1, 4), (-1, -1), 5),
  322.         ]
  323.         for os in orig_spans:
  324.             es_raw = self.getEffSpan(os[1][0], os[1][1], os[2][0], os[2][1], da_print_page1)
  325.             if es_raw:
  326.                 es = ("SPAN", (es_raw[0], es_raw[1]), (es_raw[2], es_raw[3]))
  327.                 table_styles_page1.append(es)
  328.         table_page1.setStyle(TableStyle(table_styles_page1))
  329.  
  330.         if one_page_only:
  331.             return [table_page1]
  332.  
  333.         table_page2 = Table(da_page2, colWidths=col_widths, rowHeights=row_heights_page2)
  334.         table_styles_page2 = [
  335.             ('GRID', (0, 0), (-1, -1), 0.5, colors.black),
  336.             ('BACKGROUND', (0, 0), (-1, 1), colors.lightgreen),
  337.             ('ALIGN', (1, 4), (-1, -1), "RIGHT"),
  338.             ('LEFTPADDING', (1, 1), (-1, 1), 2),
  339.             ('RIGHTPADDING', (0, 0), (-1, -1), 2),
  340.             ('TOPPADDING', (0, 0), (-1, -1), 2),
  341.             ('BOTTOMPADDING', (0, 0), (-1, -1), 2),
  342.             ('FONT', (0, 0), (-1, -1), 'Times', 6, 7),
  343.             ('VALIGN', (0, 0), (-1, -1), "MIDDLE"),
  344.             ('RIGHTPADDING', (1, 4), (-1, -1), 5),
  345.         ]
  346.         for os in orig_spans:
  347.             es_raw = self.getEffSpan(os[1][0], os[1][1], os[2][0], os[2][1], da_print_page2)
  348.             if es_raw:
  349.                 es = ("SPAN", (es_raw[0], es_raw[1]), (es_raw[2], es_raw[3]))
  350.                 print(f"os {os} =?= es {es}")
  351.                 table_styles_page2.append(es)
  352.         table_page2.setStyle(TableStyle(table_styles_page2))
  353.         return [table_page1, table_page2]
  354.  
  355.     def getTitles(self):
  356.         titles = []
  357.         ps = ParagraphStyle('blabla', fontName="Timesbd", fontSize=8, leading=12, alignment=TA_CENTER)
  358.         titles.append(Paragraph("СПРАВКА ЗА НЕТЕКУЩИТЕ (ДЪЛГОТРАЙНИ) АКТИВИ", ps))
  359.         ps = ParagraphStyle('blabla', fontName="Timesbd", fontSize=8, alignment=TA_CENTER)
  360.         p = Paragraph("към 31.12.2022 година", ps)
  361.         ps = ParagraphStyle('blabla', fontName="Timesi", fontSize=8, alignment=TA_RIGHT)
  362.         right_p = Paragraph("(хил. лева)", ps)
  363.         table_data = [["", p, right_p]]
  364.         left_width = 50 * mm
  365.         right_width = 50 * mm
  366.         free_width = self.getFreeWidth()
  367.         middle_width = A4[1] - self.s["margin-left"] - self.s["margin-right"] - left_width - right_width - free_width
  368.         col_widths = [left_width, middle_width, right_width]
  369.         table_height = 3 * mm
  370.         row_heights = [table_height]
  371.         table = Table(table_data, colWidths=col_widths, rowHeights=row_heights)
  372.         table.setStyle(TableStyle([
  373.             ('RIGHTPADDING', (0, 0), (-1, -1), 0),
  374.             ('BOTTOMPADDING', (0, 0), (-1, -1), -1),
  375.         ]))
  376.         titles.append(table)
  377.  
  378.         return titles
  379.  
  380.     def getPageOfN(self, page_number):
  381.         items = []
  382.         ps = ParagraphStyle('blabla', fontName="Timesbd", fontSize=5, leading=5, alignment=TA_CENTER)
  383.         items.append(Paragraph("&nbsp;", ps))  # &nbsp; е HTML код за "непренебрегваем" интервал
  384.         ps = ParagraphStyle('blabla', fontName="Timesbd", fontSize=8, alignment=TA_CENTER, textColor='green')
  385.         items.append(Paragraph(f"Страница {page_number} от 2", ps))
  386.  
  387.         return items
  388.  
  389.     def getRekwizitsTable(self):
  390.         print("Реквизити")
  391.         leftRekwizit = self.getDanniFirmaLeftTable()
  392.         rightRekwizit = self.getDanniFirmaRightTable()
  393.         table_data = [[leftRekwizit, "", rightRekwizit]]
  394.         free_width = self.getFreeWidth()
  395.         left_width = 50 * mm
  396.         right_width = 100 * mm
  397.         middle_width = A4[1] - self.s["margin-left"] - self.s["margin-right"] - left_width - right_width - free_width
  398.         col_widths = [left_width, middle_width, right_width]
  399.         row_heights = [22 * mm]
  400.         table = Table(table_data, colWidths=col_widths, rowHeights=row_heights)
  401.         table.setStyle(TableStyle([
  402.             ('TEXTFONT', (0, 0), (-1, -1), 'Times'),
  403.             ('FONTNAME', (0, 0), (-1, -1), 'Times'),
  404.             ('FONT', (0, 0), (-1, -1), 'Times', 6, 7),
  405.             ('LEFTPADDING', (0, 0), (-1, -1), 0),
  406.             ('RIGHTPADDING', (0, 0), (-1, -1), 0),
  407.             ('TOPPADDING', (0, 0), (-1, -1), 0),
  408.             ('BOTTOMPADDING', (0, 0), (-1, -1), 0),
  409.             ('VALIGN', (0, 0), (-1, -1), "TOP"),
  410.             ('ALIGN', (0, 0), (-1, -1), "RIGHT"),
  411.         ]))
  412.         return table
  413.  
  414.     def getFreeWidth(self):
  415.         single_data_cell_width = self.getSingleDataCellWidth()
  416.         da_print_data_cols_cnt = len(self.da_print['row_3'])
  417.         free_width = (16 - da_print_data_cols_cnt) * single_data_cell_width
  418.  
  419.         return free_width
  420.  
  421.     def getDanniFirmaLeftTable(self):
  422.         print("Реквизити ляво")
  423.         table_data = [
  424.             ["ОФИС ГЕОРГИЕВ ЕООД"],
  425.             ["(предприятие)"],
  426.             ["4230 Асеновград, \nул. Цар Иван Асен II 47"],
  427.             ["(седалище и адрес на управление)"],
  428.         ]
  429.         col_widths = [50 * mm]
  430.         row_heights = [5 * mm, 3 * mm, 7 * mm, 3 * mm]     # = 18
  431.         table = Table(table_data, colWidths=col_widths, rowHeights=row_heights)
  432.         table.setStyle(TableStyle([
  433.             ('BOX', (0, 0), (0, 3), 0.25, colors.blueviolet),
  434.             # ('BACKGROUND', (0, 0), (0, 3), colors.powderblue),
  435.             ('FONT', (0, 0), (0, 0), 'Timesbd', 8, 7), # ОФИС ГЕОРГИЕВ ЕООД
  436.             ('FONT', (0, 1), (0, 1), 'Timesi', 6, 7), # (предприятие)
  437.             ('VALIGN', (0, 1), (0, 1), "TOP"), # (предприятие)
  438.             ('TOPPADDING', (0, 1), (0, 1), 0), # (предприятие)
  439.             ('FONT', (0, 2), (0, 2), 'Timesbd', 8, 9),  # Ул Цар Иван Асен II 47
  440.             ('FONT', (0, 3), (0, 3), 'Timesi', 6, 7),  # седалище и адрес на управление)
  441.             ('VALIGN', (0, 3), (0, 3), "TOP"),  # (седалище и адрес на управление)
  442.             ('TOPPADDING', (0, 3), (0, 3), 0),  # (седалище и адрес на управление)
  443.             ('FONT', (0, 4), (0, 4), 'Timesbd', 8, 7),  # data)
  444.         ]))
  445.         return table
  446.  
  447.     def getDanniFirmaRightTable(self):
  448.         print("Реквизити дясно")
  449.         table_data = [
  450.             [      "ПРИЛОЖЕНИЕ:", "№ 5 към НСС 1"],
  451.             [             "ЕИК:", "115 882 107"  ],
  452.             ["Код на дейността:", "2512"         ],
  453.             ['Дата на съставяне:', '06.06.2022г.'],
  454.         ]
  455.         col_widths = [28 * mm, 22 * mm]
  456.         row_heights = [5 * mm] * 4
  457.         table = Table(table_data, colWidths=col_widths, rowHeights=row_heights)
  458.         table.setStyle(TableStyle([
  459.             ('FONT', (0, 0), (0, -1), 'Timesbd', 8, 7),
  460.             ('ALIGN', (0, 0), (0, -1), 'RIGHT'),
  461.             ('FONT', (1, 0), (1, -1), 'Times', 8, 7),
  462.             ('BOX', (0, 0), (-1, 2), 0.25, colors.blueviolet),
  463.  
  464.         ]))
  465.         return table
  466.  
  467.     def setup_fonts(self):
  468.         print("Настройване шрифтове")
  469.         pdfmetrics.registerFont(TTFont('Times', 'Times.ttf', 'UTF-8'))
  470.         pdfmetrics.registerFont(TTFont('Timesbd', 'Timesbd.ttf', 'UTF-8'))
  471.         pdfmetrics.registerFont(TTFont('Timesi', 'Timesi.ttf', 'UTF-8'))
  472.         pdfmetrics.registerFont(TTFont('Timesbi', 'Timesbi.ttf', 'UTF-8'))
  473.  
  474.     def getCellFormats(self):
  475.         f = Cells()
  476.  
  477.         for r in [0, 2]:
  478.             for c in range(0, 15+1):
  479.                 f.setItem(r, c, {
  480.                     "fontName": "Timesbd",
  481.                     "alignment": TA_CENTER,
  482.                 })
  483.  
  484.         for r in [1]:
  485.             for c in range(0, 15+1):
  486.                 f.setItem(r, c, {
  487.                     "fontName": "Times",
  488.                     "alignment": TA_CENTER,
  489.                 })
  490.  
  491.         for r in [1]:
  492.             for c in [1, 4, 7, 8, 11, 14, 15]:
  493.                 f.setItem(r, c, {
  494.                     "fontName": "Timesbd",
  495.                     "alignment": TA_CENTER,
  496.                 })
  497.         for r in range(4, 31+1):
  498.             for c in range(1, 15 + 1):
  499.                 f.setItem(r, c, {
  500.                     "fontName": "Times",
  501.                     "alignment": TA_RIGHT,
  502.                 })
  503.         for r in range(4, 31+1):
  504.             for c in [1, 4, 7, 8, 11, 14, 15]:
  505.                 f.setItem(r, c, {
  506.                     "fontName": "Timesbd",
  507.                     "alignment": TA_RIGHT,
  508.                 })
  509.         for r in [3, 9, 10, 20, 21, 29, 31]:
  510.             for c in range(0, 15 + 1):
  511.                 cell_format = f.getItem(r, c)
  512.                 if cell_format:
  513.                     # Вероятно винаги влизаме тук
  514.                     cell_format["fontName"] = "Timesbd"
  515.                     f.setItem(r, c, cell_format)
  516.                 else:
  517.                     # Не очакваме да влезе тука
  518.                     f.setItem(r, c, {
  519.                         "fontName": "Timesbd",
  520.                     })
  521.         for r in [9, 20, 29]:
  522.             for c in [0]:
  523.                 cell_format = f.getItem(r, c)
  524.                 if cell_format:
  525.                     # Вероятно винаги влизаме тук
  526.                     cell_format["alignment"] = TA_RIGHT
  527.                     f.setItem(r, c, cell_format)
  528.                 else:
  529.                     # Не очакваме да влезе тука
  530.                     f.setItem(r, c, {
  531.                         "alignment": TA_RIGHT,
  532.                     })
  533.         return f
  534.  
  535.     def getCellParagraph(self, r, c, text):
  536.         cell_format = self.cell_formats.getItem(r, c)
  537.         fontName = "Times"
  538.         alignment = TA_LEFT
  539.         if cell_format:
  540.             if "fontName" in cell_format: fontName = cell_format["fontName"]
  541.             if "alignment" in cell_format: alignment = cell_format["alignment"]
  542.         ps = ParagraphStyle('blabla', fontName=fontName, fontSize=7, leading=7, alignment=alignment)
  543.         return Paragraph(text, ps)
  544.  
  545.     def get_da_print(self):
  546.         da_print = {}
  547.         try:
  548.             json_file_io = JsonFileIo(file_name=registry["da_print_combobox_test_file_name"])
  549.             tmp_da_print = json_file_io.read_content()
  550.             da_print = tmp_da_print
  551.         except:
  552.             print("File not found, giving up")
  553.             quit()
  554.  
  555.         return da_print
  556.  
  557.     def getRowHeights(self):
  558.         row_heights = [5 * mm, 8 * mm]
  559.         h = 3.8
  560.         row_heights.extend([h * mm, h * mm, h * mm, 9 * mm, h * mm, 9 * mm])
  561.         row_heights.extend([h * mm, h * mm, h * mm, 6 * mm, h * mm, h * mm])
  562.         row_heights.extend([h * mm, 6 * mm, h * mm, h * mm, 9 * mm, h * mm])
  563.         row_heights.extend([h * mm, h * mm, 6 * mm, 6 * mm, 6 * mm, 6 * mm])
  564.         row_heights.extend([6 * mm, h * mm, h * mm, h * mm, h * mm, 6 * mm])
  565.  
  566.         return row_heights
  567.  
  568.     def getSingleDataCellWidth(self):
  569.         return 15 * mm
  570.  
  571.     def getLeadingCellWidth(self):
  572.         return 42 * mm
  573.  
  574.  
  575. if __name__ == "__main__":
  576.     # Създаваме обект, при което автоматично се изпълнява __init__(), която прави всичко
  577.     DaPdfReport()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement