コード例 #1
0
    def create_payment_summary(self):
        """"""
        ptext = '<font size=26>Your payment summary</font>'
        p = Paragraph(ptext, self.styles["Normal"])
        self.elements.append(p)
        self.elements.append(Spacer(1, 20))

        colWidths = [75, 125, 50, 125, 50, 150]
        plan_title = Paragraph('<font size=8>Your plan paid</font>',
                               self.styles["Normal"])
        owe_title = Paragraph('<font size=8>You owe or already paid</font>',
                              self.styles["Normal"])

        data = [['', '', '', plan_title, '', owe_title],
                [
                    self.create_text('Patient', bold=True),
                    self.create_text('Provider', bold=True),
                    self.create_text('Amount', bold=True),
                    self.create_text('Sent to', bold=True),
                    self.create_text('Date', bold=True),
                    self.create_text('Amount', bold=True),
                ]]
        self.elements.append(Indenter(left=60))
        table = Table(data, colWidths=colWidths)
        self.elements.append(table)
        self.elements.append(Indenter(left=-60))
コード例 #2
0
    def create_payment_summary(self):
        """"""
        ptext = '<font size=26>Your payment summary</font>'
        p = Paragraph(ptext, self.styles["Normal"])
        self.elements.append(p)
        self.elements.append(Spacer(1, 25))

        colWidths = [75, 125, 50, 125, 50, 125]
        table_style = TableStyle([
            ('INNERGRID', (0, 0), (-1, -1), 0.25,
             colors.black),  # Add grid to cells
            ('BOX', (0, 0), (-1, -1), 0.25, colors.black),  # add outer border
            ('BACKGROUND', (0, 0), (-1, 0), colors.black),
        ])

        plan_title = Paragraph(
            '<font color=white size=8><b>Your plan paid</b></font>',
            self.styles["Normal"])
        owe_title = Paragraph(
            '<font color=white size=8><b>You owe or already paid</b></font>',
            self.styles["Normal"])

        data = [['', '', '', plan_title, '', owe_title],
                [
                    self.create_text('Patient', bold=True),
                    self.create_text('Provider', bold=True),
                    self.create_text('Amount', bold=True),
                    self.create_text('Sent to', bold=True),
                    self.create_text('Date', bold=True),
                    self.create_text('Amount', bold=True),
                ]]
        self.elements.append(Indenter(left=30))
        table = Table(data, colWidths=colWidths)
        table.setStyle(table_style)
        self.elements.append(table)
        self.elements.append(Indenter(left=-30))
コード例 #3
0
def form_03(request_data):
    """
    Форма - титульный лист для Профосомтров амбулаторной карты
    """
    ind_card = Card.objects.get(pk=request_data["card_pk"])
    patient_data = ind_card.get_data_individual()

    hospital: Hospitals = request_data["hospital"]

    hospital_name = hospital.safe_short_title
    hospital_address = hospital.safe_address
    hospital_kod_ogrn = hospital.safe_ogrn

    if sys.platform == 'win32':
        locale.setlocale(locale.LC_ALL, 'rus_rus')
    else:
        locale.setlocale(locale.LC_ALL, 'ru_RU.UTF-8')

    pdfmetrics.registerFont(
        TTFont('PTAstraSerifBold',
               os.path.join(FONTS_FOLDER, 'PTAstraSerif-Bold.ttf')))
    pdfmetrics.registerFont(
        TTFont('PTAstraSerifReg',
               os.path.join(FONTS_FOLDER, 'PTAstraSerif-Regular.ttf')))

    buffer = BytesIO()
    if FORM_100_08_A4_FORMAT:
        doc = SimpleDocTemplate(buffer,
                                pagesize=portrait(A4),
                                leftMargin=25 * mm,
                                rightMargin=5 * mm,
                                topMargin=6 * mm,
                                bottomMargin=6 * mm,
                                allowSplitting=1,
                                title="Форма {}".format("Профосомотры"))
    else:
        doc = SimpleDocTemplate(buffer,
                                pagesize=landscape(A5),
                                leftMargin=25 * mm,
                                rightMargin=5 * mm,
                                topMargin=6 * mm,
                                bottomMargin=6 * mm,
                                allowSplitting=1,
                                title="Форма {}".format("Профосомотры"))
    styleSheet = getSampleStyleSheet()
    style = styleSheet["Normal"]
    style.fontName = "PTAstraSerifReg"
    style.fontSize = 12 if FORM_100_08_A4_FORMAT else 10
    style.leading = 12
    style.spaceAfter = 0.5 * mm
    styleBold = deepcopy(style)
    styleBold.fontName = "PTAstraSerifBold"
    styleCenter = deepcopy(style)
    styleCenter.alignment = TA_CENTER
    styleCenter.fontSize = 12
    styleCenter.leading = 15
    styleCenter.spaceAfter = 1 * mm
    styleCenterBold = deepcopy(styleBold)
    styleCenterBold.alignment = TA_CENTER
    styleCenterBold.fontSize = 12
    styleCenterBold.leading = 15
    styleCenterBold.face = 'PTAstraSerifBold'
    styleCenterBold.borderColor = black
    styleJustified = deepcopy(style)
    styleJustified.alignment = TA_JUSTIFY
    styleJustified.spaceAfter = 4.5 * mm
    styleJustified.fontSize = 12
    styleJustified.leading = 4.5 * mm

    objs = []

    styleT = deepcopy(style)
    styleT.alignment = TA_LEFT
    styleT.fontSize = 10
    styleT.leading = 4.5 * mm
    styleT.face = 'PTAstraSerifReg'

    print_district = ''
    if SettingManager.get("district", default='True', default_type='b'):
        if ind_card.district is not None:
            print_district = 'Уч: {}'.format(ind_card.district.title)

    opinion = [
        [
            Paragraph(
                '<font size=11>{}<br/>Адрес: {}<br/>ОГРН: {} <br/><u>{}</u> </font>'
                .format(hospital_name, hospital_address, hospital_kod_ogrn,
                        print_district), styleT),
            Paragraph('', styleT),
        ],
    ]

    tbl = Table(opinion, 2 * [90 * mm])
    tbl.setStyle(
        TableStyle([
            ('GRID', (0, 0), (-1, -1), 0.75, colors.white),
            ('LEFTPADDING', (1, 0), (-1, -1), 80),
            ('VALIGN', (0, 0), (-1, -1), 'TOP'),
        ]))

    objs.append(tbl)
    space_symbol = '&nbsp;'
    if patient_data['age'] < SettingManager.get(
            "child_age_before", default='15', default_type='i'):
        patient_data['serial'] = patient_data['bc_serial']
        patient_data['num'] = patient_data['bc_num']
    else:
        patient_data['serial'] = patient_data['passport_serial']
        patient_data['num'] = patient_data['passport_num']

    p_phone = ''
    if patient_data['phone']:
        p_phone = 'тел. ' + ", ".join(patient_data['phone'])

    p_number_poliklinika = ''
    if patient_data['number_poliklinika']:
        p_number_poliklinika = "" + patient_data['number_poliklinika']

    card_num_obj = patient_data['card_num'].split(' ')
    p_card_num = card_num_obj[0]
    if len(card_num_obj) == 2:
        p_card_type = '(' + str(card_num_obj[1]) + ')'
    else:
        p_card_type = ''
    content_title = [
        Indenter(left=0 * mm),
        Spacer(1, 1 * mm),
        Paragraph(
            'МЕДИЦИНСКАЯ КАРТА ПАЦИЕНТА, <br/> ПОЛУЧАЮЩЕГО МЕДИЦИНСКУЮ ПОМОЩЬ В АМБУЛАТОРНЫХ УСЛОВИЯХ',
            styleCenter),
        Paragraph(
            '{}<font size=14>№</font><font fontname="PTAstraSerifBold" size=17> {}</font><font size=14> {}</font> {}{}'
            .format(3 * space_symbol, p_card_num, p_card_type,
                    40 * space_symbol, p_number_poliklinika),
            styleCenter,
        ),
        Spacer(1, 2 * mm),
        Paragraph(
            '1.Дата заполнения медицинской карты: {}'.format(
                pytils.dt.ru_strftime(u"%d %B %Y",
                                      inflected=True,
                                      date=datetime.datetime.now())), style),
        Paragraph(
            "2. Фамилия, имя, отчество:&nbsp;  <font size=11.7 fontname ='PTAstraSerifBold'> {} </font> "
            .format(patient_data['fio']), style),
        Paragraph(
            '3. Пол: {} {} 4. Дата рождения: {}'.format(
                patient_data['sex'], 3 * space_symbol, patient_data['born']),
            style),
        Paragraph(
            '5. Место регистрации: {}'.format(patient_data['main_address']),
            style),
        Paragraph('{}'.format(p_phone), style),
        Paragraph('6. Местность: городская — 1, сельская — 2', style),
        Paragraph(
            '7. Полис ОМС: серия {} №: {} {}'
            '8. СНИЛС: {}'.format(patient_data['oms']['polis_serial'],
                                  patient_data['oms']['polis_num'],
                                  13 * space_symbol, patient_data['snils']),
            style),
        Paragraph(
            '9. Наименование страховой медицинской организации: {}'.format(
                patient_data['oms']['polis_issued']), style),
        Paragraph(
            '10. Документ: {} &nbsp; серия: {} &nbsp;&nbsp; №: {}'.format(
                patient_data['type_doc'], patient_data['serial'],
                patient_data['num']), style),
    ]

    objs.extend(content_title)

    work_p = patient_data['work_place_db'] if patient_data[
        'work_place_db'] else patient_data['work_place']
    if FORM_100_08_A4_FORMAT:
        objs.append(
            Paragraph(
                f'11. Место работы: <font fontname="PTAstraSerifBold" size=12> {work_p}</font>',
                style))
    else:
        objs.append(Paragraph(f"11. Место работы: {work_p}", style))
    objs.append(
        Paragraph(f"12. Должность: {patient_data['work_position']}", style))
    objs.append(
        Paragraph(f"13. Вредность: {patient_data['harmful_factor']}", style))

    opinion = [
        [
            Paragraph('14. Прикрепление', style),
            InteractiveTextField(width=140 * mm, fontsize=10, height=5 * mm)
        ],
    ]
    tbl = Table(opinion, colWidths=(40 * mm, 140 * mm), spaceBefore=0 * mm)
    tbl.setStyle(
        TableStyle([
            ('GRID', (0, 0), (-1, -1), 0.75, colors.white),
            ('LEFTPADDING', (1, 0), (-1, -1), 0),
            ('BOTTOMPADDING', (0, 0), (0, 0), 4.5),
            ('VALIGN', (0, 0), (-1, -1), 'BOTTOM'),
        ]))
    objs.append(tbl)
    objs.append(Spacer(1, 7 * mm))
    objs.append(InteractiveListBoxField())
    objs.append(Spacer(1, 10 * mm))
    objs.append(InteractiveListTypeMedExam())

    def first_pages(canvas, document):
        canvas.saveState()
        canvas.restoreState()

    def later_pages(canvas, document):
        canvas.saveState()
        canvas.restoreState()

    doc.build(objs, onFirstPage=first_pages, onLaterPages=later_pages)

    pdf = buffer.getvalue()
    buffer.close()

    return pdf
コード例 #4
0
def form_02(request_data):
    """
    Форма 025/у - титульный лист амбулаторной карты
    Приказ Минздрава России от 15.12.2014 N 834н (ред. от 09.01.2018)
    http://docs.cntd.ru/document/436733768) Об утверждении критериев оценки качества медицинской помощи
    ПРИКАЗ Минздрава России от 10 мая 2017 года N 203н https://minjust.consultant.ru/documents/35361
    """
    ind_card = Card.objects.get(pk=request_data["card_pk"])
    patient_data = ind_card.get_data_individual()
    hospital: Hospitals = request_data["hospital"]

    hospital_name = hospital.safe_short_title
    hospital_address = hospital.safe_address
    hospital_kod_ogrn = hospital.safe_ogrn

    if sys.platform == 'win32':
        locale.setlocale(locale.LC_ALL, 'rus_rus')
    else:
        locale.setlocale(locale.LC_ALL, 'ru_RU.UTF-8')

    pdfmetrics.registerFont(
        TTFont('PTAstraSerifBold',
               os.path.join(FONTS_FOLDER, 'PTAstraSerif-Bold.ttf')))
    pdfmetrics.registerFont(
        TTFont('PTAstraSerifReg',
               os.path.join(FONTS_FOLDER, 'PTAstraSerif-Regular.ttf')))

    buffer = BytesIO()
    doc = SimpleDocTemplate(buffer,
                            pagesize=A4,
                            leftMargin=25 * mm,
                            rightMargin=5 * mm,
                            topMargin=6 * mm,
                            bottomMargin=6 * mm,
                            allowSplitting=1,
                            title="Форма {}".format("025/у"))
    width, height = portrait(A4)
    styleSheet = getSampleStyleSheet()
    style = styleSheet["Normal"]
    style.fontName = "PTAstraSerifReg"
    style.fontSize = 10
    style.leading = 12
    style.spaceAfter = 0.5 * mm
    styleBold = deepcopy(style)
    styleBold.fontName = "PTAstraSerifBold"
    styleCenter = deepcopy(style)
    styleCenter.alignment = TA_CENTER
    styleCenter.fontSize = 12
    styleCenter.leading = 15
    styleCenter.spaceAfter = 1 * mm
    styleCenterBold = deepcopy(styleBold)
    styleCenterBold.alignment = TA_CENTER
    styleCenterBold.fontSize = 12
    styleCenterBold.leading = 15
    styleCenterBold.face = 'PTAstraSerifBold'
    styleCenterBold.borderColor = black
    styleJustified = deepcopy(style)
    styleJustified.alignment = TA_JUSTIFY
    styleJustified.spaceAfter = 4.5 * mm
    styleJustified.fontSize = 12
    styleJustified.leading = 4.5 * mm

    objs = []

    styleT = deepcopy(style)
    styleT.alignment = TA_LEFT
    styleT.fontSize = 10
    styleT.leading = 4.5 * mm
    styleT.face = 'PTAstraSerifReg'

    print_district = ''
    if SettingManager.get("district", default='True', default_type='b'):
        if ind_card.district is not None:
            print_district = 'Уч: {}'.format(ind_card.district.title)

    opinion = [
        [
            Paragraph(
                '<font size=11>{}<br/>Адрес: {}<br/>ОГРН: {} <br/><u>{}</u> </font>'
                .format(hospital_name, hospital_address, hospital_kod_ogrn,
                        print_district), styleT),
            Paragraph(
                '<font size=9 >Код формы по ОКУД:<br/>Код организации по ОКПО: 31348613<br/>'
                'Медицинская документация<br/>Учетная форма № 025/у</font>',
                styleT),
        ],
    ]

    tbl = Table(opinion, 2 * [90 * mm])
    tbl.setStyle(
        TableStyle([
            ('GRID', (0, 0), (-1, -1), 0.75, colors.white),
            ('LEFTPADDING', (1, 0), (-1, -1), 80),
            ('VALIGN', (0, 0), (-1, -1), 'TOP'),
        ]))

    objs.append(tbl)
    space_symbol = '&nbsp;'
    if patient_data['age'] < SettingManager.get(
            "child_age_before", default='15', default_type='i'):
        patient_data['serial'] = patient_data['bc_serial']
        patient_data['num'] = patient_data['bc_num']
    else:
        patient_data['serial'] = patient_data['passport_serial']
        patient_data['num'] = patient_data['passport_num']

    p_phone = ''
    if patient_data['phone']:
        p_phone = 'тел. ' + ", ".join(patient_data['phone'])

    card_num_obj = patient_data['card_num'].split(' ')
    p_card_num = card_num_obj[0]
    if len(card_num_obj) == 2:
        p_card_type = '(' + str(card_num_obj[1]) + ')'
    else:
        p_card_type = ''
    content_title = [
        Indenter(left=0 * mm),
        Spacer(1, 1 * mm),
        Paragraph(
            'МЕДИЦИНСКАЯ КАРТА ПАЦИЕНТА, <br/> ПОЛУЧАЮЩЕГО МЕДИЦИНСКУЮ ПОМОЩЬ В АМБУЛАТОРНЫХ УСЛОВИЯХ',
            styleCenter),
        Paragraph(
            '{}<font size=14>№</font><font fontname="PTAstraSerifBold" size=17> <u>{}</u></font><font size=14> {}</font>'
            .format(3 * space_symbol, p_card_num, p_card_type), styleCenter),
        Spacer(1, 2 * mm),
        Paragraph(
            '1.Дата заполнения медицинской карты: {}'.format(
                pytils.dt.ru_strftime(u"%d %B %Y",
                                      inflected=True,
                                      date=datetime.datetime.now())), style),
        Paragraph(
            "2. Фамилия, имя, отчество:&nbsp;  <font size=11.7 fontname ='PTAstraSerifBold'> {} </font> "
            .format(patient_data['fio']), style),
        Paragraph(
            '3. Пол: {} {} 4. Дата рождения: {}'.format(
                patient_data['sex'], 3 * space_symbol, patient_data['born']),
            style),
        Paragraph(
            '5. Место регистрации: {}'.format(patient_data['main_address']),
            style),
        Paragraph('{}'.format(p_phone), style),
        Paragraph('6. Местность: городская — 1, сельская — 2', style),
        Paragraph(
            '7. Полис ОМС: серия {} №: {} {}'
            '8. СНИЛС: {}'.format(patient_data['oms']['polis_serial'],
                                  patient_data['oms']['polis_num'],
                                  13 * space_symbol, patient_data['snils']),
            style),
        Paragraph(
            '9. Наименование страховой медицинской организации: {}'.format(
                patient_data['oms']['polis_issued']), style),
        Paragraph(
            '10. Код категории льготы: {} {} 11. Документ: {} &nbsp; серия: {} &nbsp;&nbsp; №: {}'
            .format(8 * space_symbol, 25 * space_symbol,
                    patient_data['type_doc'], patient_data['serial'],
                    patient_data['num']),
            style,
        ),
    ]

    objs.extend(content_title)
    if SettingManager.get("dispensary", default='True', default_type='b'):
        objs.append(
            Paragraph(
                '12. Заболевания, по поводу которых осуществляется диспансерное наблюдение:',
                style))
        objs.append(Spacer(1, 2 * mm))

        styleTCenter = deepcopy(styleT)
        styleTCenter.alignment = TA_CENTER
        styleTCenter.leading = 3.5 * mm

        opinion = [
            [
                Paragraph(
                    '<font size=9>Дата начала диспансерного наблюдения </font>',
                    styleTCenter),
                Paragraph(
                    '<font size=9 >Дата прекращения диспансерного наблюдения</font>',
                    styleTCenter),
                Paragraph('<font size=9 >Диагноз</font>', styleTCenter),
                Paragraph('<font size=9 >Код по МКБ-10</font>', styleTCenter),
                Paragraph('<font size=9 >Врач</font>', styleTCenter),
            ],
        ]
        for i in range(0, 5):
            para = ['', '', '', '', '']
            opinion.append(para)

        row_height = []
        for i in opinion:
            row_height.append(6 * mm)

        row_height[0] = None

        tbl = Table(opinion,
                    colWidths=(27 * mm, 30 * mm, 75 * mm, 20 * mm, 27 * mm),
                    rowHeights=row_height)

        tbl.setStyle(
            TableStyle([
                ('GRID', (0, 0), (-1, -1), 1.0, colors.black),
                ('VALIGN', (0, 0), (-1, 0), 'MIDDLE'),
            ]))

        objs.append(tbl)

    def first_pages(canvas, document):
        canvas.saveState()
        canvas.restoreState()

    def later_pages(canvas, document):
        canvas.saveState()
        canvas.restoreState()

    doc.build(objs, onFirstPage=first_pages, onLaterPages=later_pages)

    pdf = buffer.getvalue()
    buffer.close()

    return pdf
コード例 #5
0
ファイル: forms105.py プロジェクト: moodpulse/l2
def form_03(request_data):
    """
    Статистическая форма 066/у Приложение № 5 к приказу Минздрава России от 30 декабря 2002 г. № 413
    """
    num_dir = request_data["dir_pk"]
    direction_obj = Napravleniya.objects.get(pk=num_dir)
    hosp_nums_obj = hosp_get_hosp_direction(num_dir)
    hosp_nums = f"- {hosp_nums_obj[0].get('direction')}"

    ind_card = direction_obj.client
    patient_data = ind_card.get_data_individual()

    hospital: Hospitals = request_data["hospital"]

    hospital_name = hospital.safe_short_title
    hospital_address = hospital.safe_address
    hospital_kod_ogrn = hospital.safe_ogrn

    if sys.platform == 'win32':
        locale.setlocale(locale.LC_ALL, 'rus_rus')
    else:
        locale.setlocale(locale.LC_ALL, 'ru_RU.UTF-8')

    pdfmetrics.registerFont(
        TTFont('PTAstraSerifBold',
               os.path.join(FONTS_FOLDER, 'PTAstraSerif-Bold.ttf')))
    pdfmetrics.registerFont(
        TTFont('PTAstraSerifReg',
               os.path.join(FONTS_FOLDER, 'PTAstraSerif-Regular.ttf')))

    buffer = BytesIO()
    doc = SimpleDocTemplate(buffer,
                            pagesize=A4,
                            leftMargin=25 * mm,
                            rightMargin=5 * mm,
                            topMargin=6 * mm,
                            bottomMargin=10 * mm,
                            allowSplitting=1,
                            title="Форма {}".format("066/у-02"))
    width, height = portrait(A4)
    styleSheet = getSampleStyleSheet()
    style = styleSheet["Normal"]
    style.fontName = "PTAstraSerifReg"
    style.fontSize = 12
    style.leading = 15
    style.spaceAfter = 0.5 * mm
    styleBold = deepcopy(style)
    styleBold.fontName = "PTAstraSerifBold"
    styleCenter = deepcopy(style)
    styleCenter.alignment = TA_CENTER
    styleCenter.fontSize = 12
    styleCenter.leading = 15
    styleCenter.spaceAfter = 1 * mm
    styleCenterBold = deepcopy(styleBold)
    styleCenterBold.alignment = TA_CENTER
    styleCenterBold.fontSize = 12
    styleCenterBold.leading = 15
    styleCenterBold.face = 'PTAstraSerifBold'
    styleCenterBold.borderColor = black
    styleJustified = deepcopy(style)
    styleJustified.alignment = TA_JUSTIFY
    styleJustified.spaceAfter = 4.5 * mm
    styleJustified.fontSize = 12
    styleJustified.leading = 4.5 * mm

    objs = []

    styleT = deepcopy(style)
    styleT.alignment = TA_LEFT
    styleT.fontSize = 10
    styleT.leading = 4.5 * mm
    styleT.face = 'PTAstraSerifReg'

    print_district = ''
    if SettingManager.get("district", default='True', default_type='b'):
        if ind_card.district is not None:
            print_district = 'Уч: {}'.format(ind_card.district.title)

    opinion = [
        [
            Paragraph(
                '<font size=11>{}<br/>Адрес: {}<br/>ОГРН: {} <br/><u>{}</u> </font>'
                .format(hospital_name, hospital_address, hospital_kod_ogrn,
                        print_district), styleT),
            Paragraph(
                '<font size=9 >Код формы по ОКУД:<br/>Код организации по ОКПО: 31348613<br/>'
                'Медицинская документация<br/>форма № 066/у-02</font>',
                styleT),
        ],
    ]

    tbl = Table(opinion, 2 * [90 * mm])
    tbl.setStyle(
        TableStyle([
            ('GRID', (0, 0), (-1, -1), 0.75, colors.white),
            ('LEFTPADDING', (1, 0), (-1, -1), 80),
            ('VALIGN', (0, 0), (-1, -1), 'TOP'),
        ]))

    objs.append(tbl)
    space_symbol = '&nbsp;'
    if patient_data['age'] < SettingManager.get(
            "child_age_before", default='15', default_type='i'):
        patient_data['serial'] = patient_data['bc_serial']
        patient_data['num'] = patient_data['bc_num']
    else:
        patient_data['serial'] = patient_data['passport_serial']
        patient_data['num'] = patient_data['passport_num']

    card_num_obj = patient_data['card_num'].split(' ')
    p_card_num = card_num_obj[0]

    sex = patient_data['sex']
    if sex == 'м':
        sex = f'{sex} - 1'
    if sex == 'ж':
        sex = f'{sex} - 2'

    doc_patient = f"{patient_data['type_doc']}, {patient_data['serial']} - {patient_data['num']}"
    polis_data = f"{patient_data['oms']['polis_serial']} {patient_data['oms']['polis_num']}"

    ############################################################################################################
    # Получить данные из первичного приема (самого первого hosp-направления)
    hosp_first_num = hosp_nums_obj[0].get('direction')
    primary_reception_data = primary_reception_get_data(hosp_first_num)

    hospitalized = ''
    if primary_reception_data[
            'what_time_hospitalized'] and primary_reception_data[
                'plan_hospital']:
        if primary_reception_data['what_time_hospitalized'].lower().replace(
                ' ', '') == 'впервые':
            hospitalized = "первично - 1"
        if primary_reception_data['what_time_hospitalized'].lower().replace(
                ' ', '') == 'повторно':
            hospitalized = "повторно - 2"
        if primary_reception_data['plan_hospital'].lower().replace(' ',
                                                                   '') == 'да':
            hospitalized = f"{hospitalized}; в плановом порядке -4"
        if primary_reception_data['extra_hospital'].lower().replace(
                ' ', '') == 'да':
            hospitalized = f"{hospitalized}; по экстренным показаниям - 3"

    # Получить отделение - из названия услуги или самого главного направления
    hosp_depart = hosp_nums_obj[0].get('research_title')

    # взять самое последнее направленеие из hosp_dirs
    hosp_last_num = hosp_nums_obj[-1].get('direction')
    # 'Время выписки', 'Дата выписки', 'Основной диагноз (описание)', 'Осложнение основного диагноза (описание)', 'Сопутствующий диагноз (описание)'
    date_value, time_value, outcome, result_hospital = '', '', '', ''
    hosp_extract_data = hosp_extract_get_data(hosp_last_num)
    days_count = '__________________________'
    doc_fio = ''
    if hosp_extract_data:
        if hosp_extract_data['result_hospital']:
            result_hospital = hosp_extract_data['result_hospital']
        if hosp_extract_data['outcome']:
            outcome = hosp_extract_data['outcome']
        if hosp_extract_data['date_value']:
            date_value = hosp_extract_data['date_value']
        if hosp_extract_data['time_value']:
            time_value = hosp_extract_data['time_value']
        days_count = hosp_extract_data['days_count']
        doc_fio = hosp_extract_data['doc_fio']

    title_page = [
        Indenter(left=0 * mm),
        Spacer(1, 8 * mm),
        Paragraph(
            '<font fontname="PTAstraSerifBold" size=13>СТАТИСТИЧЕСКАЯ КАРТА ВЫБЫВШЕГО ИЗ СТАЦИОНАРА<br/> '
            'круглосуточного пребывания, дневного стационара при больничном<br/> учреждении, дневного стационара при'
            ' амбулаторно-поликлиническом<br/> учреждении, стационара на дому<br/>'
            'N медицинской карты {} {}</font>'.format(p_card_num, hosp_nums),
            styleCenter,
        ),
        Spacer(1, 2 * mm),
        Spacer(1, 2 * mm),
        Spacer(1, 2 * mm),
        Paragraph(
            '1. Код пациента: ________  2. Ф.И.О.: {}'.format(
                patient_data['fio']), style),
        Paragraph(
            '3. Пол: {} {}4. Дата рождения {}'.format(sex, space_symbol * 24,
                                                      patient_data['born']),
            style),
        Paragraph(
            '5. Документ, удостов. личность: (название, серия, номер) {} {}'.
            format(space_symbol * 2, doc_patient), style),
        Paragraph(
            '6. Адрес: регистрация по месту жительства: {}'.format(
                patient_data['main_address']), style),
        Paragraph(
            '7. Код территории проживания: ___ Житель: город - 1; село - 2.',
            style),
        Paragraph('8. Страховой полис (серия, номер):{}'.format(polis_data),
                  style),
        Paragraph('Выдан: {}'.format(patient_data['oms']['polis_issued']),
                  style),
        Paragraph('9. Вид оплаты:______________', style),
        Paragraph(
            '10. Социальный статус: {}'.format(
                primary_reception_data['social_status']), style),
        Paragraph(
            '11. Категория льготности: {}'.format(
                primary_reception_data['category_privilege']), style),
        Paragraph(
            '12. Кем направлен больной: {}'.format(
                primary_reception_data['who_directed']), style),
        Paragraph(
            '13. Кем доставлен: _________________________________ Код______ Номер наряда__________',
            style),
        Paragraph(
            '14. Диагноз направившего учреждения: {}'.format(
                primary_reception_data['diagnos_who_directed']), style),
        Paragraph(
            '14.1 Состояние при поступлении: {}'.format(
                primary_reception_data['state']), style),
        Paragraph(
            '15. Диагноз приемного отделения:{}'.format(
                primary_reception_data['diagnos_entered']), style),
        Paragraph(
            '16. Доставлен в состоянии опьянения: Алкогольного — 1; Наркотического — 2.',
            style),
        Paragraph(
            '17. Госпитализирован по поводу данного заболевания в текущем году: {}'
            .format(hospitalized), style),
        Paragraph(
            '18.Доставлен в стационар от начала заболевания(получения травмы): {}'
            .format(primary_reception_data['time_start_ill']), style),
        Paragraph(
            '19. Травма: {}'.format(primary_reception_data['type_trauma']),
            style),
        Paragraph(
            '20. Дата поступления в приемное отделение:______________ Время__________',
            style),
        Paragraph(
            '21. Название отделения: <u>{}</u>; дата поступления: <u>{}</u>; время: <u>{}</u>'
            .format(hosp_depart, primary_reception_data['date_entered_value'],
                    primary_reception_data['time_entered_value']),
            style,
        ),
        Paragraph(
            'Подпись врача приемного отделения ______________ Код __________',
            style),
        Paragraph(
            '22. Дата выписки (смерти): {}; Время {}'.format(
                date_value, time_value), style),
        Paragraph(
            '23. Продолжительность госпитализации (койко - дней): {}'.format(
                days_count), style),
        Paragraph('24. Исход госпитализации: {}'.format(outcome), style),
        Paragraph('24.1. Результат госпитализации: {}'.format(result_hospital),
                  style),
    ]

    closed_bl_result = closed_bl(hosp_nums_obj[0].get('direction'))
    title_page.append(
        Paragraph(
            f"25. Листок нетрудоспособности: открыт <u>{closed_bl_result['start_date']}</u> закрыт: <u>{closed_bl_result['end_date']}</u>"
            f" к труду: <u>{closed_bl_result['start_work']}</u>",
            style,
        ))
    title_page.append(
        Paragraph(f"25.1. Номере ЛН : <u>{closed_bl_result['num']}</u>",
                  style))
    title_page.append(
        Paragraph(f"25.2. Выдан кому : {closed_bl_result['who_get']}", style))
    title_page.append(
        Paragraph(
            '25.3. По уходу за больным Полных лет: _____ Пол: {}'.format(sex),
            style))
    title_page.append(Paragraph('26. Движение пациента по отделениям:', style))

    objs.extend(title_page)

    styleTB = deepcopy(style)
    styleTB.fontSize = 8.7
    styleTB.alignment = TA_CENTER
    styleTB.leading = 3.5 * mm

    styleTC = deepcopy(style)
    styleTC.fontSize = 9.5
    styleTC.alignment = TA_LEFT

    styleTCright = deepcopy(styleTC)
    styleTCright.alignment = TA_RIGHT

    styleTCcenter = deepcopy(styleTC)
    styleTCcenter.alignment = TA_CENTER

    opinion = [[
        Paragraph('N', styleTB),
        Paragraph('Код отделения', styleTB),
        Paragraph('Профиль коек', styleTB),
        Paragraph('Код врача', styleTB),
        Paragraph('Дата поступления', styleTB),
        Paragraph('Дата выписки, перевода', styleTB),
        Paragraph('Код диагноза по МКБ', styleTB),
        Paragraph('Код медицинского стандарта', styleTB),
        Paragraph('Код прерванного случая', styleTB),
        Paragraph('Вид оплаты', styleTB),
    ]]

    patient_movement = hosp_patient_movement(hosp_nums_obj)
    x = 0
    for i in patient_movement:
        x += 1
        doc_code = ''
        if i['doc_confirm_code']:
            doc_code = str(i['doc_confirm_code'])
        tmp_data = [
            [
                Paragraph(str(x), styleTB),
                Paragraph('', styleTB),
                Paragraph(i['bed_profile_research_title'], styleTB),
                Paragraph(doc_code, styleTB),
                Paragraph(i['date_entered_value'], styleTB),
                Paragraph(i['date_oute'], styleTB),
                Paragraph(i['diagnos_mkb'], styleTB),
                Paragraph('', styleTB),
                Paragraph('', styleTB),
                Paragraph('ОМС', styleTB),
            ],
        ]

        opinion.extend(tmp_data.copy())

    # получить структуру данных для таблицы
    tbl_act = Table(opinion,
                    repeatRows=1,
                    colWidths=(7 * mm, 15 * mm, 30 * mm, 20 * mm, 21 * mm,
                               21 * mm, 20 * mm, 14 * mm, 14 * mm, 20 * mm))

    tbl_act.setStyle(
        TableStyle([
            ('GRID', (0, 0), (-1, -1), 1.0, colors.black),
            ('BOTTOMPADDING', (0, 0), (-1, -1), 1.5 * mm),
            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
        ]))
    objs.append(tbl_act)
    objs.append(Spacer(1, 2 * mm))
    objs.append(
        Paragraph(
            '27. Хирургические операции(обозначить: основную операцию, использование спец.аппаратуры):',
            style), )

    opinion = [[
        Paragraph('Дата, Час', styleTB),
        Paragraph('Код <br/>хирурга', styleTB),
        Paragraph('Код отделения', styleTB),
        Paragraph('наименование операции', styleTB),
        Paragraph('код операции', styleTB),
        Paragraph('наименование осложнения', styleTB),
        Paragraph('Код ослонения', styleTB),
        Paragraph('Анестезия (код врача)', styleTB),
        Paragraph('энд.', styleTB),
        Paragraph('лазер.', styleTB),
        Paragraph('криог.', styleTB),
        Paragraph('Вид оплаты', styleTB),
    ]]

    patient_operation = hosp_get_operation_data(num_dir)
    operation_result = []
    for i in patient_operation:
        operation_template = [''] * 12
        operation_template[0] = Paragraph(
            i['date'] + '<br/>' + i['time_start'] + '-' + i['time_end'],
            styleTB)
        operation_template[1] = Paragraph(str(i['doc_code']), styleTB)
        operation_template[3] = Paragraph(
            f"{i['name_operation']} <br/><font face=\"PTAstraSerifBold\" size=\"8.7\">({i['category_difficult']})</font>",
            styleTB)
        operation_template[4] = Paragraph(
            '{}'.format(i['code_operation'] + '<br/>' + i['plan_operation']),
            styleTB)
        operation_template[7] = Paragraph(
            '{}'.format(i['anesthesia method'] + '<br/> (' +
                        i['code_doc_anesthesia'] + ')'), styleTB)
        operation_template[5] = Paragraph(i['complications'], styleTB)
        operation_template[11] = Paragraph(" ОМС", styleTB)
        operation_result.append(operation_template.copy())

    opinion.extend(operation_result)
    tbl_act = Table(opinion,
                    repeatRows=1,
                    colWidths=(22 * mm, 12 * mm, 11 * mm, 26 * mm, 26 * mm,
                               20 * mm, 10 * mm, 15 * mm, 7 * mm, 7 * mm,
                               7 * mm, 16 * mm))
    tbl_act.setStyle(
        TableStyle([
            ('GRID', (0, 0), (-1, -1), 1.0, colors.black),
            ('BOTTOMPADDING', (0, 0), (-1, -1), 1.5 * mm),
            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
        ]))
    objs.append(tbl_act)
    objs.append(Spacer(1, 2 * mm))
    space_symbol = '&nbsp;'

    objs.append(
        Paragraph('28. Обследован: RW {}  AIDS '.format(space_symbol * 10),
                  style), )
    objs.append(Spacer(1, 2 * mm))
    objs.append(Paragraph('29. Диагноз стационара(при выписке):', style), )

    opinion = [[
        Paragraph('Клинический заключительный', styleTB),
        Paragraph('Основное заболевание', styleTB),
        Paragraph('Код МКБ', styleTB),
        Paragraph('Осложнение', styleTB),
        Paragraph('Код МКБ', styleTB),
        Paragraph('Сопутствующее заболевание', styleTB),
        Paragraph('Код МКБ', styleTB),
    ]]

    hosp_last_num = hosp_nums_obj[-1].get('direction')
    hosp_extract_data = hosp_extract_get_data(hosp_last_num)

    opinion_diagnos = []
    if hosp_extract_data:
        opinion_diagnos = [[
            Paragraph('', styleTB),
            Paragraph(hosp_extract_data['final_diagnos'], styleTB),
            Paragraph(hosp_extract_data['final_diagnos_mkb'], styleTB),
            Paragraph(hosp_extract_data['other_diagnos'], styleTB),
            Paragraph(hosp_extract_data['other_diagnos_mkb'], styleTB),
            Paragraph(
                hosp_extract_data['near_diagnos'].replace('<', '&lt;').replace(
                    '>', '&gt;'), styleTB),
            Paragraph(hosp_extract_data['near_diagnos_mkb'], styleTB),
        ]]

    opinion.extend(opinion_diagnos)
    opinion_pathologist = [[
        Paragraph('Патологоанатомический	', styleTB),
        Paragraph('', styleTB),
        Paragraph('', styleTB),
        Paragraph('', styleTB),
        Paragraph('', styleTB),
        Paragraph('', styleTB),
        Paragraph('', styleTB),
    ]]

    opinion.extend(opinion_pathologist)
    tbl_act = Table(opinion,
                    repeatRows=1,
                    colWidths=(28 * mm, 45 * mm, 15 * mm, 30 * mm, 15 * mm,
                               30 * mm, 15 * mm))
    tbl_act.setStyle(
        TableStyle([
            ('GRID', (0, 0), (-1, -1), 1.0, colors.black),
            ('BOTTOMPADDING', (0, 0), (-1, -1), 1.5 * mm),
            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
            ('SPAN', (0, 0), (0, 1)),
        ]))

    objs.append(tbl_act)
    objs.append(Spacer(1, 2 * mm))
    objs.append(
        Paragraph(
            '30.В случае смерти указать основную причину:______________________________________________________________'
            'Код МКБ', style), )
    objs.append(Spacer(1, 20 * mm))
    objs.append(
        Paragraph(
            '31. Дефекты догоспитального этапа: несвоевременность госпитализации - 1; недостаточный объем клинико - диагностического обследования - 2; '
            'неправильная тактика лечения - 3; несовпадение диагноза - 4.',
            style,
        ), )
    objs.append(Spacer(1, 7 * mm))
    objs.append(
        Paragraph(
            'Подпись лечащего врача ({}) ____________________________'.format(
                doc_fio), style), )
    objs.append(Spacer(1, 7 * mm))
    objs.append(Paragraph('Подпись заведующего отделением', style), )

    def first_pages(canvas, document):
        canvas.saveState()
        canvas.restoreState()

    def later_pages(canvas, document):
        canvas.saveState()
        canvas.restoreState()

    doc.build(objs, onFirstPage=first_pages, onLaterPages=later_pages)
    pdf = buffer.getvalue()
    buffer.close()

    return pdf
コード例 #6
0
ファイル: forms106.py プロジェクト: moodpulse/l2
def form_01(request_data):
    """
    Форма 003/у - cстационарная карта
    """

    num_dir = request_data["dir_pk"]
    direction_obj = Napravleniya.objects.get(pk=num_dir)
    hosp_nums_obj = hosp_get_hosp_direction(num_dir)
    hosp_nums = f"- {hosp_nums_obj[0].get('direction')}"

    ind_card = direction_obj.client
    patient_data = ind_card.get_data_individual()

    hospital: Hospitals = request_data["hospital"]

    hospital_name = hospital.safe_short_title
    hospital_address = hospital.safe_address
    hospital_kod_ogrn = hospital.safe_ogrn

    if sys.platform == 'win32':
        locale.setlocale(locale.LC_ALL, 'rus_rus')
    else:
        locale.setlocale(locale.LC_ALL, 'ru_RU.UTF-8')

    pdfmetrics.registerFont(
        TTFont('PTAstraSerifBold',
               os.path.join(FONTS_FOLDER, 'PTAstraSerif-Bold.ttf')))
    pdfmetrics.registerFont(
        TTFont('PTAstraSerifReg',
               os.path.join(FONTS_FOLDER, 'PTAstraSerif-Regular.ttf')))

    buffer = BytesIO()
    doc = SimpleDocTemplate(buffer,
                            pagesize=A4,
                            leftMargin=20 * mm,
                            rightMargin=12 * mm,
                            topMargin=6 * mm,
                            bottomMargin=4 * mm,
                            allowSplitting=1,
                            title="Форма {}".format("003/у"))
    width, height = portrait(A4)
    styleSheet = getSampleStyleSheet()
    style = styleSheet["Normal"]
    style.fontName = "PTAstraSerifReg"
    style.fontSize = 12
    style.leading = 15
    style.spaceAfter = 0.5 * mm

    styleLead = deepcopy(style)
    styleLead.leading = 12
    styleLead.alignment = TA_JUSTIFY

    styleBold = deepcopy(style)
    styleBold.fontName = "PTAstraSerifBold"
    styleCenter = deepcopy(style)
    styleCenter.alignment = TA_CENTER
    styleCenter.fontSize = 12
    styleCenter.leading = 15
    styleCenter.spaceAfter = 1 * mm
    styleCenterBold = deepcopy(styleBold)
    styleCenterBold.alignment = TA_CENTER
    styleCenterBold.fontSize = 12
    styleCenterBold.leading = 15
    styleCenterBold.face = 'PTAstraSerifBold'
    styleCenterBold.borderColor = black
    styleJustified = deepcopy(style)
    styleJustified.alignment = TA_JUSTIFY
    styleJustified.spaceAfter = 4.5 * mm
    styleJustified.fontSize = 12
    styleJustified.leading = 4.5 * mm

    styleRight = deepcopy(styleJustified)
    styleRight.alignment = TA_RIGHT

    objs = []

    styleT = deepcopy(style)
    styleT.alignment = TA_LEFT
    styleT.fontSize = 10
    styleT.leading = 4.5 * mm
    styleT.face = 'PTAstraSerifReg'

    print_district = ''
    if SettingManager.get("district", default='True', default_type='b'):
        if ind_card.district is not None:
            print_district = 'Уч: {}'.format(ind_card.district.title)

    opinion = [
        [
            Paragraph(
                '<font size=11>{}<br/>Адрес: {}<br/>ОГРН: {} <br/><u>{}</u> </font>'
                .format(hospital_name, hospital_address, hospital_kod_ogrn,
                        print_district), styleT),
            Paragraph(
                '<font size=9 >Код формы по ОКУД:<br/>Код организации по ОКПО: 31348613<br/>'
                'Медицинская документация<br/>форма № 003/у</font>', styleT),
        ],
    ]

    tbl = Table(opinion, 2 * [90 * mm])
    tbl.setStyle(
        TableStyle([
            ('GRID', (0, 0), (-1, -1), 0.75, colors.white),
            ('LEFTPADDING', (1, 0), (-1, -1), 80),
            ('VALIGN', (0, 0), (-1, -1), 'TOP'),
        ]))

    objs.append(tbl)
    space_symbol = '&nbsp;'
    if patient_data['age'] < SettingManager.get(
            "child_age_before", default='15', default_type='i'):
        patient_data['serial'] = patient_data['bc_serial']
        patient_data['num'] = patient_data['bc_num']
    else:
        patient_data['serial'] = patient_data['passport_serial']
        patient_data['num'] = patient_data['passport_num']

    p_phone = ''
    if patient_data['phone']:
        p_phone = 'тел.: ' + ", ".join(patient_data['phone'])

    p_address = patient_data['main_address']
    work_place = patient_data['work_place_db'] if patient_data[
        'work_place_db'] else patient_data['work_place']
    p_work = work_place

    card_num_obj = patient_data['card_num'].split(' ')
    p_card_num = card_num_obj[0]

    # взять самое последнее направленеие из hosp_dirs
    hosp_last_num = hosp_nums_obj[-1].get('direction')
    ############################################################################################################
    # Получение данных из выписки
    # Взять услугу типа выписка. Из полей "Дата выписки" - взять дату. Из поля "Время выписки" взять время
    hosp_extract_data = hosp_extract_get_data(hosp_last_num)

    extrac_date, extract_time, final_diagnos, other_diagnos, near_diagnos, outcome, doc_fio, manager_depart, room_num, depart_extract = '', '', '', '', '', '', '', '', '', ''
    days_count = '__________________________'

    if hosp_extract_data:
        extrac_date = hosp_extract_data['date_value']
        extract_time = hosp_extract_data['time_value']
        final_diagnos = hosp_extract_data['final_diagnos']
        other_diagnos = hosp_extract_data['other_diagnos']
        near_diagnos = hosp_extract_data['near_diagnos']
        days_count = hosp_extract_data['days_count']
        if hosp_extract_data['outcome']:
            outcome = hosp_extract_data['outcome'] + ' (' + hosp_extract_data[
                'result_hospital'] + ')'
        doc_fio = hosp_extract_data['doc_fio']
        manager_depart = hosp_extract_data['manager_depart']
        room_num = hosp_extract_data['room_num']
        iss_last_hosp = Issledovaniya.objects.filter(
            napravleniye__pk=hosp_last_num)[0]
        depart_extract = iss_last_hosp.research.title

    # Получить отделение - из названия услуги или самого главного направления
    hosp_depart = hosp_nums_obj[0].get('research_title')

    ############################################################################################################
    # Получить данные из первичного приема (самого первого hosp-направления)
    hosp_first_num = hosp_nums_obj[0].get('direction')
    primary_reception_data = primary_reception_get_data(hosp_first_num)

    ###########################################################################################################
    # Получение данных группы крови
    fcaction_avo_id = Fractions.objects.filter(
        title='Групповая принадлежность крови по системе АВО').first()
    fcaction_rezus_id = Fractions.objects.filter(title='Резус').first()
    group_blood_avo = get_fraction_result(ind_card.pk,
                                          fcaction_avo_id.pk,
                                          count=1)
    if group_blood_avo:
        group_blood_avo_value = group_blood_avo[0][5]
    else:
        group_blood_avo_value = primary_reception_data['blood_group']
    group_blood_rezus = get_fraction_result(ind_card.pk,
                                            fcaction_rezus_id.pk,
                                            count=1)
    if group_blood_rezus:
        group_rezus_value = group_blood_rezus[0][5].replace('<br/>', ' ')
    else:
        group_rezus_value = primary_reception_data['resus_factor']

    ###########################################################################################################
    # получение данных клинического диагноза
    clinical_diagnos = hosp_get_clinical_diagnos(hosp_nums_obj)

    #####################################################################################################
    # получить даные из переводного эпикриза: Дата перевода, Время перевода, в какое отделение переведен
    # у каждого hosp-направления найти подчиненное эпикриз Перевод*
    transfers_data = hosp_get_transfers_data(hosp_nums_obj)
    transfers = ''
    for i in transfers_data:
        transfers = f"{transfers} в {i['transfer_research_title']} {i['date_transfer_value']}/{i['time_transfer_value']};"

    #####################################################################################################
    title_page = [
        Indenter(left=0 * mm),
        Spacer(1, 8 * mm),
        Paragraph(
            '<font fontname="PTAstraSerifBold" size=15>МЕДИЦИНСКАЯ КАРТА № {} <u>{}</u>, <br/> стационарного больного</font>'
            .format(p_card_num, hosp_nums), styleCenter),
        Spacer(1, 2 * mm),
        Spacer(1, 2 * mm),
        Spacer(1, 2 * mm),
        Paragraph(
            'Дата и время поступления: {} - {}'.format(
                primary_reception_data['date_entered_value'],
                primary_reception_data['time_entered_value']), style),
        Spacer(1, 0.5 * mm),
        Paragraph(
            'Дата и время выписки: {} - {}'.format(extrac_date, extract_time),
            style),
        Spacer(1, 0.5 * mm),
        Paragraph('Отделение: {}'.format(hosp_depart), style),
        Spacer(1, 0.5 * mm),
        Paragraph(f"Палата №: {room_num} {depart_extract}", style),
        Spacer(1, 0.5 * mm),
        Paragraph('Переведен в отделение:', style),
        Spacer(1, 8 * mm),
        Paragraph('Проведено койко-дней: {}'.format(days_count), style),
        Spacer(1, 0.5 * mm),
        Paragraph(
            'Виды транспортировки(на каталке, на кресле, может идти): {}'.
            format(primary_reception_data['type_transport']), style),
        Spacer(1, 0.5 * mm),
        Paragraph(
            'Группа крови: {}. Резус-принадлежность: {}'.format(
                group_blood_avo_value, group_rezus_value), style),
        Spacer(1, 1 * mm),
        Paragraph('Побочное действие лекарств(непереносимость):', style),
        Spacer(1, 12 * mm),
        Paragraph("1. Фамилия, имя, отчество:&nbsp;", style),
        Spacer(1, 2 * mm),
        Paragraph(
            '2. Пол: {} {} 3. Дата рождения: {}'.format(
                patient_data['sex'], 3 * space_symbol, patient_data['born']),
            style),
        Spacer(1, 0.5 * mm),
        Paragraph('4. Постоянное место жительства: ', style),
        Spacer(1, 3.5 * mm),
        Paragraph('5. Место работы, профессия или должность:', style),
        Spacer(1, 0.5 * mm),
        Paragraph('6. Кем направлен больной:', style),
        Spacer(1, 0.5 * mm),
        Paragraph(
            '7. Доставлен в стационар по экстренным показаниям: {}'.format(
                primary_reception_data['extra_hospital']), style),
        Spacer(1, 0.5 * mm),
        Paragraph(
            ' через: {} после начала заболевания, получения травмы; '.format(
                primary_reception_data['time_start_ill']), style),
        Spacer(1, 0.5 * mm),
        Paragraph(
            ' госпитализирован в плановом порядке (подчеркнуть) {}.'.format(
                primary_reception_data['plan_hospital']), style),
        Spacer(1, 0.5 * mm),
        Paragraph('8. Диагноз направившего учреждения:', style),
        Spacer(1, 8 * mm),
        Paragraph('9. Диагноз при поступлении:', style),
        Spacer(1, 10 * mm),
        Paragraph('10. Диагноз клинический:', style),
        PageBreak(),
    ]

    closed_bl_result = closed_bl(hosp_nums_obj[0].get('direction'))
    data_bl = ''
    if closed_bl_result['start_date'] and closed_bl_result[
            'end_date'] and closed_bl_result['num']:
        data_bl = (
            f"<br/>открыт <u>{closed_bl_result['start_date']}</u>{5 * space_symbol}закрыт: <u>{closed_bl_result['end_date']}</u> {3 * space_symbol}"
            f"к труду: <u>{closed_bl_result['start_work']}</u> <br/>Номер ЛН: <u>{closed_bl_result['num']}</u> Выдан кому: {closed_bl_result['who_get']} "
        )

    second_page = [
        Spacer(1, 2 * mm),
        Paragraph('11. Диагноз заключительный клинический:', style),
        Spacer(1, 0.5 * mm),
        Paragraph('а) основной:', style),
        Spacer(1, 45 * mm),
        Paragraph('б) осложнение основного:', style),
        Spacer(1, 18 * mm),
        Paragraph('в) сопутствующий:', style),
        Spacer(1, 19 * mm),
        Paragraph(
            '12. Госпитализирован в данном году по поводу данного заболевания: {}, <br/>'
            'всего  - {} раз.:'.format(
                primary_reception_data['what_time_hospitalized'],
                primary_reception_data['all_hospitalized']),
            styleLead,
        ),
        Spacer(1, 1 * mm),
        Paragraph(
            '13. Хирургические операции, методы обезболивания и послеоперационные осложнения:',
            styleLead),
        Spacer(1, 40 * mm),
        Paragraph(
            '14. Другие виды лечения:___________________________________________',
            styleLead),
        Spacer(1, 0.2 * mm),
        Paragraph('для больных злокачественными новообразованиями.',
                  styleLead),
        Spacer(1, 0.2 * mm),
        Paragraph(
            ' 1.Специальное лечение: хирургическое(дистанционная гамматерапия, рентгенотерапия, быстрые '
            'электроны, контактная и дистанционная гамматерапия, контактная гамматерапия и глубокая '
            'рентгенотерапия); комбинированное(хирургическое и гамматерапия, хирургическое и рентгено - '
            'терапия, хирургическое и сочетанное лучевое); химиопрепаратами, гормональными препаратами.',
            styleLead,
        ),
        Spacer(1, 1 * mm),
        Paragraph('2. Паллиативное', styleLead),
        Spacer(1, 0.2 * mm),
        Paragraph('3. Симптоматическое лечение.', styleLead),
        Spacer(1, 0.2 * mm),
        Paragraph(f"15. Отметка о выдаче листка нетрудоспособности:{data_bl}",
                  styleLead),
        Spacer(1, 1 * mm),
        Paragraph('16. Исход заболевания: {}'.format(outcome), styleLead),
        Spacer(1, 1 * mm),
        Paragraph(
            '17.  Трудоспособность восстановлена полностью, снижена, временно утрачена, стойко утрачена в связи '
            'с данным заболеванием, с другими причинами(подчеркнуть): {}'.
            format(''),
            styleLead,
        ),
        Spacer(1, 1 * mm),
        Paragraph(
            '18. Для поступивших на экспертизу - заключение:___________________',
            styleLead),
        Spacer(1, 1 * mm),
        Paragraph(
            '___________________________________________________________________',
            styleLead),
        Spacer(1, 1 * mm),
        Paragraph('19. Особые отметки', style),
        Spacer(1, 2 * mm),
        Paragraph('Лечащий врач: {}'.format(doc_fio), style),
        Paragraph('Заведующий отделением: {}'.format(manager_depart), style),
    ]
    if primary_reception_data['weight']:
        second_page.append(
            Paragraph(f"Вес: {primary_reception_data['weight']}", styleRight))
    objs.extend(title_page)
    objs.extend(second_page)

    closed_bl_result = closed_bl(hosp_nums_obj[0].get('direction'))

    def first_pages(canvas, document):
        canvas.saveState()
        if closed_bl_result.get('is_closed', None):
            canvas.setFont('PTAstraSerifBold', 12)
            canvas.drawString(7 * mm, 290 * mm, 'ЛН')
        # Переведен
        transfers_text = [Paragraph('{}'.format(transfers), styleJustified)]
        transfers_frame = Frame(27 * mm,
                                206 * mm,
                                175 * mm,
                                7 * mm,
                                leftPadding=0,
                                bottomPadding=0,
                                rightPadding=0,
                                topPadding=0,
                                id='diagnos_frame',
                                showBoundary=0)
        transfers_inframe = KeepInFrame(
            175 * mm,
            12 * mm,
            transfers_text,
            hAlign='LEFT',
            vAlign='TOP',
        )
        transfers_frame.addFromList([transfers_inframe], canvas)

        # Побочное действие лекарств(непереносимость) координаты
        medicament_text = [
            Paragraph(
                '{}'.format(primary_reception_data['medicament_allergy']),
                styleJustified)
        ]
        medicament_frame = Frame(27 * mm,
                                 171 * mm,
                                 175 * mm,
                                 9 * mm,
                                 leftPadding=0,
                                 bottomPadding=0,
                                 rightPadding=0,
                                 topPadding=0,
                                 id='diagnos_frame',
                                 showBoundary=0)
        medicament_inframe = KeepInFrame(
            175 * mm,
            12 * mm,
            medicament_text,
            hAlign='LEFT',
            vAlign='TOP',
        )
        medicament_frame.addFromList([medicament_inframe], canvas)

        # ФИО
        fio_text = [
            Paragraph(
                "<font size=11.7 fontname ='PTAstraSerifBold'> {}</font> ".
                format(patient_data['fio']), style)
        ]
        fio_frame = Frame(77 * mm,
                          159 * mm,
                          125 * mm,
                          8 * mm,
                          leftPadding=0,
                          bottomPadding=0,
                          rightPadding=0,
                          topPadding=0,
                          id='diagnos_frame',
                          showBoundary=0)
        fio_inframe = KeepInFrame(
            175 * mm,
            12 * mm,
            fio_text,
            hAlign='LEFT',
            vAlign='TOP',
        )
        fio_frame.addFromList([fio_inframe], canvas)

        # Постоянное место жительства
        live_text = [Paragraph('{}, {}'.format(p_address, p_phone), style)]
        live_frame = Frame(88 * mm,
                           144 * mm,
                           115 * mm,
                           9 * mm,
                           leftPadding=0,
                           bottomPadding=0,
                           rightPadding=0,
                           topPadding=0,
                           id='diagnos_frame',
                           showBoundary=0)
        live_inframe = KeepInFrame(
            175 * mm,
            12 * mm,
            live_text,
            hAlign='LEFT',
            vAlign='TOP',
        )
        live_frame.addFromList([live_inframe], canvas)

        # Место работы
        work_text = [Paragraph('{}'.format(p_work), style)]
        work_frame = Frame(108 * mm,
                           138.5 * mm,
                           95 * mm,
                           5 * mm,
                           leftPadding=0,
                           bottomPadding=0,
                           rightPadding=0,
                           topPadding=0,
                           id='diagnos_frame',
                           showBoundary=0)
        work_inframe = KeepInFrame(
            175 * mm,
            12 * mm,
            work_text,
            hAlign='LEFT',
            vAlign='TOP',
        )
        work_frame.addFromList([work_inframe], canvas)

        # Кем направлен больной
        who_directed_text = [
            Paragraph('{}'.format(primary_reception_data['who_directed']),
                      style)
        ]
        who_directed_frame = Frame(77 * mm,
                                   129.5 * mm,
                                   126 * mm,
                                   7 * mm,
                                   leftPadding=0,
                                   bottomPadding=0,
                                   rightPadding=0,
                                   topPadding=0,
                                   id='diagnos_frame',
                                   showBoundary=0)
        who_directed_inframe = KeepInFrame(
            175 * mm,
            12 * mm,
            who_directed_text,
            hAlign='LEFT',
            vAlign='TOP',
        )
        who_directed_frame.addFromList([who_directed_inframe], canvas)

        # Диагноз направившего учреждения координаты
        diagnos_directed_text = [
            Paragraph(
                '{}'.format(primary_reception_data['diagnos_who_directed']),
                styleJustified)
        ]
        diagnos_directed_frame = Frame(27 * mm,
                                       98 * mm,
                                       175 * mm,
                                       9 * mm,
                                       leftPadding=0,
                                       bottomPadding=0,
                                       rightPadding=0,
                                       topPadding=0,
                                       id='diagnos_frame',
                                       showBoundary=0)
        diagnos_directed_inframe = KeepInFrame(
            175 * mm,
            10 * mm,
            diagnos_directed_text,
            hAlign='LEFT',
            vAlign='TOP',
        )
        diagnos_directed_frame.addFromList([diagnos_directed_inframe], canvas)

        # Диагноз при поступлении координаты
        diagnos_entered_text = [
            Paragraph('{}'.format(primary_reception_data['diagnos_entered']),
                      styleJustified)
        ]
        diagnos_entered_frame = Frame(27 * mm,
                                      83 * mm,
                                      175 * mm,
                                      10 * mm,
                                      leftPadding=0,
                                      bottomPadding=0,
                                      rightPadding=0,
                                      topPadding=0,
                                      id='diagnos_frame',
                                      showBoundary=0)
        diagnos_entered_inframe = KeepInFrame(
            175 * mm,
            10 * mm,
            diagnos_entered_text,
            hAlign='LEFT',
            vAlign='TOP',
        )
        diagnos_entered_frame.addFromList([diagnos_entered_inframe], canvas)

        # клинический диагноз координаты
        diagnos_text = [
            Paragraph('{}'.format(clinical_diagnos), styleJustified)
        ]
        diagnos_frame = Frame(27 * mm,
                              22 * mm,
                              175 * mm,
                              55 * mm,
                              leftPadding=0,
                              bottomPadding=0,
                              rightPadding=0,
                              topPadding=0,
                              id='diagnos_frame',
                              showBoundary=0)
        diagnos_inframe = KeepInFrame(175 * mm, 55 * mm, diagnos_text)
        diagnos_frame.addFromList([diagnos_inframe], canvas)

        # представитель пациента
        p_agent = None
        agent_status = ''
        agent = ''
        if ind_card.who_is_agent:
            p_agent = getattr(ind_card, ind_card.who_is_agent)
            agent_status = ind_card.get_who_is_agent_display()
        if p_agent:
            agent_data = p_agent.get_data_individual()
            agent_fio = agent_data['fio']
            agent_phone = ','.join(agent_data['phone'])
            agent = f"{agent_status}: {agent_fio}, тел.:{agent_phone}"

        agent_text = [Paragraph('<u>{}</u>'.format(agent), styleRight)]
        agent_frame = Frame(27 * mm,
                            5 * mm,
                            175 * mm,
                            7 * mm,
                            leftPadding=0,
                            bottomPadding=0,
                            rightPadding=0,
                            topPadding=0,
                            id='diagnos_frame',
                            showBoundary=0)
        agent_inframe = KeepInFrame(175 * mm, 10 * mm, agent_text)
        agent_frame.addFromList([agent_inframe], canvas)
        canvas.restoreState()

    # Получить все услуги из категории операции
    styleTO = deepcopy(style)
    styleTO.alignment = TA_LEFT
    styleTO.firstLineIndent = 0
    styleTO.fontSize = 9.5
    styleTO.leading = 10
    styleTO.spaceAfter = 0.2 * mm

    # Таблица для операции
    opinion_oper = [[
        Paragraph('№', styleTO),
        Paragraph('Название операции', styleTO),
        Paragraph('Дата, &nbsp час', styleTO),
        Paragraph('Метод обезболивания', styleTO),
        Paragraph('Осложнения', styleTO),
        Paragraph('Оперировал', styleTO),
    ]]

    hosp_operation = hosp_get_operation_data(num_dir)
    x = 0
    operation_result = []
    for i in hosp_operation:
        operation_template = [''] * 6
        x += 1
        operation_template[0] = Paragraph(str(x), styleTO)
        operation_template[1] = Paragraph(
            f"{i['name_operation']} <br/><font face=\"PTAstraSerifBold\" size=\"8.7\">({i['category_difficult']})</font>",
            styleTO)
        operation_template[2] = Paragraph(
            i['date'] + '<br/>' + i['time_start'] + '-' + i['time_end'],
            styleTO)
        operation_template[3] = Paragraph(i['anesthesia method'], styleTO)
        operation_template[4] = Paragraph(i['complications'], styleTO)
        operation_template[5] = Paragraph(i['doc_fio'], styleTO)
        operation_result.append(operation_template.copy())

    opinion_oper.extend(operation_result)

    t_opinion_oper = opinion_oper.copy()
    tbl_o = Table(
        t_opinion_oper,
        colWidths=(
            7 * mm,
            62 * mm,
            25 * mm,
            30 * mm,
            15 * mm,
            45 * mm,
        ),
    )
    tbl_o.setStyle(
        TableStyle([
            ('GRID', (0, 0), (-1, -1), 1.0, colors.black),
            ('BOTTOMPADDING', (0, 0), (-1, -1), 2.1 * mm),
            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
        ]))

    def later_pages(canvas, document):
        canvas.saveState()
        # Заключительные диагнозы
        # Основной заключительный диагноз
        final_diagnos_text = [
            Paragraph('{}'.format(final_diagnos), styleJustified)
        ]
        final_diagnos_frame = Frame(27 * mm,
                                    230 * mm,
                                    175 * mm,
                                    45 * mm,
                                    leftPadding=0,
                                    bottomPadding=0,
                                    rightPadding=0,
                                    topPadding=0,
                                    showBoundary=0)
        final_diagnos_inframe = KeepInFrame(
            175 * mm,
            50 * mm,
            final_diagnos_text,
            hAlign='LEFT',
            vAlign='TOP',
        )
        final_diagnos_frame.addFromList([final_diagnos_inframe], canvas)

        # Осложнения основного заключительного диагноза
        other_diagnos_text = [
            Paragraph('{}'.format(other_diagnos), styleJustified)
        ]
        other_diagnos_frame = Frame(27 * mm,
                                    205 * mm,
                                    175 * mm,
                                    20 * mm,
                                    leftPadding=0,
                                    bottomPadding=0,
                                    rightPadding=0,
                                    topPadding=0,
                                    showBoundary=0)
        other_diagnos_inframe = KeepInFrame(
            175 * mm,
            20 * mm,
            other_diagnos_text,
            hAlign='LEFT',
            vAlign='TOP',
        )
        other_diagnos_frame.addFromList([other_diagnos_inframe], canvas)

        # Сопутствующие основного заключительного диагноза
        near_diagnos_text = [
            Paragraph(
                '{}'.format(
                    near_diagnos.replace('<', '&lt;').replace('>', '&gt;')),
                styleJustified)
        ]
        near_diagnos_frame = Frame(27 * mm,
                                   181 * mm,
                                   175 * mm,
                                   20 * mm,
                                   leftPadding=0,
                                   bottomPadding=0,
                                   rightPadding=0,
                                   topPadding=0,
                                   showBoundary=0)
        near_diagnos_inframe = KeepInFrame(
            175 * mm,
            20 * mm,
            near_diagnos_text,
            vAlign='TOP',
        )
        near_diagnos_frame.addFromList([near_diagnos_inframe], canvas)

        # Таблица операции
        operation_text = [tbl_o]
        operation_frame = Frame(22 * mm,
                                123 * mm,
                                170 * mm,
                                40 * mm,
                                leftPadding=0,
                                bottomPadding=0,
                                rightPadding=0,
                                topPadding=0,
                                showBoundary=0)
        operation_inframe = KeepInFrame(175 * mm,
                                        40 * mm,
                                        operation_text,
                                        hAlign='CENTRE',
                                        vAlign='TOP',
                                        fakeWidth=False)
        operation_frame.addFromList([operation_inframe], canvas)

        canvas.setFont('PTAstraSerifBold', 8)
        hospital: Hospitals = request_data["hospital"]

        hospital_name = hospital.safe_short_title

        canvas.drawString(55 * mm, 12 * mm, '{}'.format(hospital_name))
        canvas.drawString(
            55 * mm, 9 * mm,
            '№ карты : {}; Номер истории: {}'.format(p_card_num, hosp_nums))
        canvas.drawString(
            55 * mm, 6 * mm, 'Пациент: {} {}'.format(patient_data['fio'],
                                                     patient_data['born']))
        canvas.line(55 * mm, 11.5 * mm, 200 * mm, 11.5 * mm)

        canvas.restoreState()

    doc.build(objs, onFirstPage=first_pages, onLaterPages=later_pages)
    pdf = buffer.getvalue()
    buffer.close()

    return pdf
コード例 #7
0
ファイル: test_paragraphs.py プロジェクト: fbrcosta/reportlab
    def test0(self):
        """Test...

        The story should contain...

        Features to be visually confirmed by a human being are:

            1. ...
            2. ...
            3. ...
        """

        story = []
        SA = story.append

        #need a style
        styNormal = ParagraphStyle('normal')
        styGreen = ParagraphStyle('green',parent=styNormal,textColor=green)
        styDots = ParagraphStyle('styDots',parent=styNormal,endDots='.')
        styDots1 = ParagraphStyle('styDots1',parent=styNormal,endDots=ABag(text=' -',dy=2,textColor='red'))
        styDotsR = ParagraphStyle('styDotsR',parent=styNormal,alignment=TA_RIGHT,endDots=' +')
        styDotsC = ParagraphStyle('styDotsC',parent=styNormal,alignment=TA_CENTER,endDots=' *')
        styDotsJ = ParagraphStyle('styDotsJ',parent=styNormal,alignment=TA_JUSTIFY,endDots=' =')

        istyDots = ParagraphStyle('istyDots',parent=styNormal,firstLineIndent=12,leftIndent=6,endDots='.')
        istyDots1 = ParagraphStyle('istyDots1',parent=styNormal,firstLineIndent=12,leftIndent=6,endDots=ABag(text=' -',dy=2,textColor='red'))
        istyDotsR = ParagraphStyle('istyDotsR',parent=styNormal,firstLineIndent=12,leftIndent=6,alignment=TA_RIGHT,endDots=' +')
        istyDotsC = ParagraphStyle('istyDotsC',parent=styNormal,firstLineIndent=12,leftIndent=6,alignment=TA_CENTER,endDots=' *')
        istyDotsJ = ParagraphStyle('istyDotsJ',parent=styNormal,firstLineIndent=12,leftIndent=6,alignment=TA_JUSTIFY,endDots=' =')

        # some to test
        stySpaced = ParagraphStyle('spaced',
                                   parent=styNormal,
                                   spaceBefore=12,
                                   spaceAfter=12)

        SA(Paragraph("This is a normal paragraph. "+ randomText(), styNormal))
        SA(Paragraph("There follows a paragraph with only \"&lt;br/&gt;\"", styNormal))
        SA(Paragraph("<br/>", styNormal))
        SA(Paragraph("This has 12 points space before and after, set in the style. " + randomText(), stySpaced))
        SA(Paragraph("This is normal. " + randomText(), styNormal))
        SA(Paragraph("""<para spacebefore="12" spaceafter="12">
              This has 12 points space before and after, set inline with
              XML tag.  It works too.""" + randomText() + "</para",
                        styNormal))

        SA(Paragraph("This is normal. " + randomText(), styNormal))
  
        styBackground = ParagraphStyle('MyTitle',
                                       fontName='Helvetica-Bold',
                                       fontSize=24,
                                       leading=28,
                                       textColor=white,
                                       backColor=navy)
        SA(Paragraph("This is a title with a background. ", styBackground))
        SA(Paragraph("""<para backcolor="pink">This got a background from the para tag</para>""", styNormal))
        SA(Paragraph("""<para>\n\tThis has newlines and tabs on the front but inside the para tag</para>""", styNormal))
        SA(Paragraph("""<para>  This has spaces on the front but inside the para tag</para>""", styNormal))
        SA(Paragraph("""\n\tThis has newlines and tabs on the front but no para tag""", styNormal))
        SA(Paragraph("""  This has spaces on the front but no para tag""", styNormal))
        SA(Paragraph("""This has <font color=blue>blue text</font> here.""", styNormal))
        SA(Paragraph("""This has <i>italic text</i> here.""", styNormal))
        SA(Paragraph("""This has <b>bold text</b> here.""", styNormal))
        SA(Paragraph("""This has <u>underlined text</u> here.""", styNormal))
        SA(Paragraph("""This has <font color=blue><u>blue and <font color=red>red</font> underlined text</u></font> here.""", styNormal))
        SA(Paragraph("""<u>green underlining</u>""", styGreen))
        SA(Paragraph("""<u>green <font size=+4><i>underlining</font></i></u>""", styGreen))
        SA(Paragraph("""This has m<super>2</super> a superscript.""", styNormal))
        SA(Paragraph("""This has m<sub>2</sub> a subscript. Like H<sub>2</sub>O!""", styNormal))
        SA(Paragraph("""This has a font change to <font name=Helvetica>Helvetica</font>.""", styNormal))
        #This one fails:
        #SA(Paragraph("""This has a font change to <font name=Helvetica-Oblique>Helvetica-Oblique</font>.""", styNormal))
        SA(Paragraph("""This has a font change to <font name=Helvetica><i>Helvetica in italics</i></font>.""", styNormal))

        SA(Paragraph('''This one uses upper case tags and has set caseSensitive=0: Here comes <FONT FACE="Helvetica" SIZE="14pt">Helvetica 14</FONT> with <STRONG>strong</STRONG> <EM>emphasis</EM>.''', styNormal, caseSensitive=0))
        SA(Paragraph('''The same as before, but has set not set caseSensitive, thus the tags are ignored: Here comes <FONT FACE="Helvetica" SIZE="14pt">Helvetica 14</FONT> with <STRONG>strong</STRONG> <EM>emphasis</EM>.''', styNormal))
        SA(Paragraph('''This one uses fonts with size "14pt" and also uses the em and strong tags: Here comes <font face="Helvetica" size="14pt">Helvetica 14</font> with <Strong>strong</Strong> <em>emphasis</em>.''', styNormal, caseSensitive=0))
        SA(Paragraph('''This uses a font size of 3cm: Here comes <font face="Courier" size="3cm">Courier 3cm</font> and normal again.''', styNormal, caseSensitive=0))
        SA(Paragraph('''This is just a very long silly text to see if the <FONT face="Courier">caseSensitive</FONT> flag also works if the paragraph is <EM>very</EM> long. '''*20, styNormal, caseSensitive=0))

        SA(Paragraph('''Simple paragraph with dots''', styDots))
        SA(Paragraph('''Simple indented paragraph with dots''', istyDots))
        SA(Paragraph('''Simple centred paragraph with stars''', styDotsC))
        SA(Paragraph('''Simple centred indented paragraph with stars''', istyDotsC))
        SA(Paragraph('''Simple right justified paragraph with pluses, but no pluses''', styDotsR))
        SA(Paragraph('''Simple right justified indented paragraph with pluses, but no pluses''', istyDotsR))
        SA(Paragraph('''Simple justified paragraph with equals''', styDotsJ))
        SA(Paragraph('''Simple justified indented paragraph with equals''', istyDotsJ))
        SA(Paragraph('''A longer simple paragraph with dots''', styDots))
        SA(Paragraph('''A longer simple indented paragraph with dots''', istyDots))
        SA(Paragraph('A very much' +50*' longer'+' simple paragraph with dots', styDots))
        SA(Paragraph('A very much' +50*' longer'+' simple indented paragraph with dots', istyDots))
        SA(Paragraph('A very much' +50*' longer'+' centred simple paragraph with stars', styDotsC))
        SA(Paragraph('A very much' +50*' longer'+' centred simple indented paragraph with stars', istyDotsC))
        SA(Paragraph('A very much' +50*' longer'+' right justified simple paragraph with pluses, but no pluses', styDotsR))
        SA(Paragraph('A very much' +50*' longer'+' right justified simple indented paragraph with pluses, but no pluses', istyDotsR))
        SA(Paragraph('A very much' +50*' longer'+' justified simple paragraph with equals', styDotsJ))
        SA(Paragraph('A very much' +50*' longer'+' justified simple indented paragraph with equals', istyDotsJ))
        SA(Paragraph('''Simple paragraph with dashes that have a dy and a textColor.''', styDots1))
        SA(Paragraph('''Simple indented paragraph with dashes that have a dy and a textColor.''', istyDots1))
        SA(Paragraph('''Complex <font color="green">paragraph</font> with dots''', styDots))
        SA(Paragraph('''Complex <font color="green">indented paragraph</font> with dots''', istyDots))
        SA(Paragraph('''Complex centred <font color="green">paragraph</font> with stars''', styDotsC))
        SA(Paragraph('''Complex centred <font color="green">indented paragraph</font> with stars''', istyDotsC))
        SA(Paragraph('''Complex right justfied <font color="green">paragraph</font> with pluses, but no pluses''', styDotsR))
        SA(Paragraph('''Complex right justfied <font color="green">indented paragraph</font> with pluses, but no pluses''', istyDotsR))
        SA(Paragraph('''Complex justfied <font color="green">paragraph</font> with equals''', styDotsJ))
        SA(Paragraph('''Complex justfied <font color="green">indented paragraph</font> with equals''', istyDotsJ))
        SA(Paragraph('''A longer complex <font color="green">paragraph</font> with dots''', styDots))
        SA(Paragraph('''A longer complex <font color="green">indented paragraph</font> with dots''', istyDots))
        SA(Paragraph('A very much' +50*' longer'+' complex <font color="green">paragraph</font> with dots', styDots))
        SA(Paragraph('A very much' +50*' longer'+' complex <font color="green">indented paragraph</font> with dots', istyDots))
        SA(Paragraph('''Complex <font color="green">paragraph</font> with dashes that have a dy and a textColor.''', styDots1))
        SA(Paragraph('''Complex <font color="green">indented paragraph</font> with dashes that have a dy and a textColor.''', istyDots1))
        SA(Paragraph('A very much' +50*' longer'+' centred complex <font color="green">paragraph</font> with stars', styDotsC))
        SA(Paragraph('A very much' +50*' longer'+' centred complex <font color="green">indented paragraph</font> with stars', istyDotsC))
        SA(Paragraph('A very much' +50*' longer'+' right justified <font color="green">complex</font> paragraph with pluses, but no pluses', styDotsR))
        SA(Paragraph('A very much' +50*' longer'+' right justified <font color="green">complex</font> indented paragraph with pluses, but no pluses', istyDotsR))
        SA(Paragraph('A very much' +50*' longer'+' justified complex <font color="green">paragraph</font> with equals', styDotsJ))
        SA(Paragraph('A very much' +50*' longer'+' justified complex <font color="green">indented paragraph</font> with equals', istyDotsJ))

        SA(Indenter("1cm"))
        SA(Paragraph("<para><bullet bulletIndent='-1cm' bulletOffsetY='2'><seq id='s0'/>)</bullet>Indented list bulletOffsetY=2. %s</para>" % randomText(), styNormal))
        SA(Paragraph("<para><bullet bulletIndent='-1cm'><seq id='s0'/>)</bullet>Indented list. %s</para>" % randomText(), styNormal))
        SA(Paragraph("<para><bullet bulletIndent='-1cm'><seq id='s0'/>)</bullet>Indented list. %s</para>" % randomText(), styNormal))
        SA(Indenter("1cm"))
        SA(XPreformatted("<para leftIndent='0.5cm' backcolor=pink><bullet bulletIndent='-1cm'><seq id='s1'/>)</bullet>Indented list.</para>", styNormal))
        SA(XPreformatted("<para leftIndent='0.5cm' backcolor=palegreen><bullet bulletIndent='-1cm'><seq id='s1'/>)</bullet>Indented list.</para>", styNormal))
        SA(Indenter("-1cm"))
        SA(Paragraph("<para><bullet bulletIndent='-1cm'><seq id='s0'/>)</bullet>Indented list. %s</para>" % randomText(), styNormal))
        SA(Indenter("-1cm"))
        SA(Paragraph("<para>Indented list using seqChain/Format<seqChain order='s0 s1 s2 s3 s4'/><seqReset id='s0'/><seqFormat id='s0' value='1'/><seqFormat id='s1' value='a'/><seqFormat id='s2' value='i'/><seqFormat id='s3' value='A'/><seqFormat id='s4' value='I'/></para>", stySpaced))
        SA(Indenter("1cm"))
        SA(Paragraph("<para><bullet bulletIndent='-1cm'><seq id='s0'/>)</bullet>Indented list. %s</para>" % randomText(), styNormal))
        SA(Paragraph("<para><bullet bulletIndent='-1cm'><seq id='s0'/>)</bullet>Indented list. %s</para>" % randomText(), styNormal))
        SA(Paragraph("<para><bullet bulletIndent='-1cm'><seq id='s0'/>)</bullet>Indented list. %s</para>" % randomText(), styNormal))
        SA(Indenter("1cm"))
        SA(XPreformatted("<para backcolor=pink boffsety='-3'><bullet bulletIndent='-1cm'><seq id='s1'/>)</bullet>Indented list bulletOffsetY=-3.</para>", styNormal))
        SA(XPreformatted("<para backcolor=pink><bullet bulletIndent='-1cm'><seq id='s1'/>)</bullet>Indented list.</para>", styNormal))
        SA(Indenter("-1cm"))
        SA(Paragraph("<para><bullet bulletIndent='-1cm'><seq id='s0'/>)</bullet>Indented list. %s</para>" % randomText(), styNormal))
        SA(Indenter("1cm"))
        SA(XPreformatted("<para backcolor=palegreen><bullet bulletIndent='-1cm'><seq id='s1'/>)</bullet>Indented list.</para>", styNormal))
        SA(Indenter("1cm"))
        SA(XPreformatted("<para><bullet bulletIndent='-1cm'><seq id='s2'/>)</bullet>Indented list. line1</para>", styNormal))
        SA(XPreformatted("<para><bullet bulletIndent='-1cm'><seq id='s2'/>)</bullet>Indented list. line2</para>", styNormal))
        SA(Indenter("-1cm"))
        SA(XPreformatted("<para backcolor=palegreen><bullet bulletIndent='-1cm'><seq id='s1'/>)</bullet>Indented list.</para>", styNormal))
        SA(Indenter("-1cm"))
        SA(Indenter("-1cm"))

        template = SimpleDocTemplate(outputfile('test_paragraphs.pdf'),
                                     showBoundary=1)
        template.build(story,
            onFirstPage=myFirstPage, onLaterPages=myLaterPages)
コード例 #8
0
def form_02(request_data):
    """
    Процедурный лист
    """

    num_dir = json.loads(request_data["hosp_pk"])
    ind_card = Napravleniya.objects.get(pk=num_dir)
    patient_data = ind_card.client.get_data_individual()

    if sys.platform == 'win32':
        locale.setlocale(locale.LC_ALL, 'rus_rus')
    else:
        locale.setlocale(locale.LC_ALL, 'ru_RU.UTF-8')

    pdfmetrics.registerFont(
        TTFont('PTAstraSerifBold',
               os.path.join(FONTS_FOLDER, 'PTAstraSerif-Bold.ttf')))
    pdfmetrics.registerFont(
        TTFont('PTAstraSerifReg',
               os.path.join(FONTS_FOLDER, 'PTAstraSerif-Regular.ttf')))

    buffer = BytesIO()
    doc = SimpleDocTemplate(buffer,
                            pagesize=landscape(A4),
                            leftMargin=15 * mm,
                            rightMargin=5 * mm,
                            topMargin=13 * mm,
                            bottomMargin=10 * mm,
                            allowSplitting=1,
                            title="Форма {}".format("Лист процедурный"))
    width, height = landscape(A4)
    styleSheet = getSampleStyleSheet()
    style = styleSheet["Normal"]
    style.fontName = "PTAstraSerifReg"
    style.fontSize = 12
    style.leading = 15
    style.spaceAfter = 0.5 * mm
    styleBold = deepcopy(style)
    styleBold.fontName = "PTAstraSerifBold"
    styleCenter = deepcopy(style)
    styleCenter.alignment = TA_CENTER
    styleCenter.fontSize = 12
    styleCenter.leading = 15
    styleCenter.spaceAfter = 1 * mm
    styleCenterBold = deepcopy(styleBold)
    styleCenterBold.alignment = TA_CENTER
    styleCenterBold.fontSize = 12
    styleCenterBold.leading = 15
    styleCenterBold.face = 'PTAstraSerifBold'
    styleCenterBold.borderColor = black
    styleJustified = deepcopy(style)
    styleJustified.alignment = TA_JUSTIFY
    styleJustified.spaceAfter = 4.5 * mm
    styleJustified.fontSize = 12
    styleJustified.leading = 4.5 * mm

    objs = []

    styleT = deepcopy(style)
    styleT.alignment = TA_LEFT
    styleT.fontSize = 10
    styleT.leading = 3.5 * mm
    styleT.face = 'PTAstraSerifReg'

    styleTtime = deepcopy(styleT)
    styleTtime.fontSize = 8.5
    styleTtime.leading = 2.5 * mm
    styleTtime.spaceAfter = 1.0 * mm

    styleTCBold = deepcopy(style)
    styleTCBold.fontSize = 9
    styleTCBold.fontName = "PTAstraSerifBold"
    space_symbol = '&nbsp;'
    title_page = [
        Indenter(left=0 * mm),
        Spacer(1, 2 * mm),
        Paragraph(
            f'<font fontname="PTAstraSerifBold" size=13>ПРОЦЕДУРНЫЙ ЛИСТ {space_symbol*3} № {num_dir}</font> ',
            styleCenter),
    ]

    objs.extend(title_page)
    objs.append(
        Paragraph(f'{patient_data["fio"]}  {space_symbol*150} Палата______',
                  style))
    objs.append(Spacer(1, 3 * mm))
    objs.append(
        Paragraph('V - выполнено, Х - не выполнено, О - отменено', styleT))
    objs.append(Spacer(1, 1 * mm))
    procedural = json.dumps({'direction': num_dir})
    procedural_obj = HttpRequest()
    procedural_obj._body = procedural
    procedural_obj.user = request_data["user"]
    data = get_procedure_by_dir(procedural_obj)
    results_json = json.loads(data.content.decode('utf-8'))

    timesInDates = results_json['timesInDates']
    unique_dates = sorted(set([k for k in timesInDates.keys()]))
    unique_dates.sort(key=lambda x: datetime.strptime(x, '%d.%m.%Y'))

    count_table = 1
    slice_count = 14
    if len(unique_dates) > slice_count:
        count_table = ceil(len(unique_dates) / slice_count)

    start = 0
    for v_table in range(count_table):
        v_table = []
        end = start + slice_count

        if len(unique_dates) > slice_count:
            dates_record = [[
                Paragraph(f'{date[0:6]}{date[-2:]}', styleTCBold)
            ] for date in unique_dates[start:end]]
        else:
            dates_record = [[
                Paragraph(f'{date[0:6]}{date[-2:]}', styleTCBold)
            ] for date in unique_dates]
        dates_record.insert(0, [Paragraph("Наименование", styleTCBold)])

        v_table.append(dates_record)

        for record in results_json['result']:
            temp_time = [[Paragraph(" ", styleTtime)]
                         for i in range(len(dates_record) - 1)]
            comment = ''
            for date, times in record['dates'].items():
                if len(unique_dates) > slice_count:
                    if date not in unique_dates[start:end]:
                        continue
                    index = unique_dates[start:end].index(date)
                else:
                    index = unique_dates.index(date)
                temp_time_index = temp_time[index]
                for time, value in times.items():
                    strike_o = ""
                    strike_cl = ""
                    if value['empty']:
                        continue
                    status = 'X'
                    if value['cancel']:
                        strike_o = "<strike>"
                        strike_cl = "</strike>"
                        status = 'О'
                    if value['ok']:
                        strike_o = ""
                        strike_cl = ""
                        status = 'V'
                    temp_time_index.append([
                        Paragraph(f"{strike_o}{time}{strike_cl}-{status}",
                                  styleTtime)
                    ])
                    temp_time[index] = temp_time_index.copy()

            if record['comment']:
                comment = record['comment']
            temp_time.insert(0, [
                Paragraph(
                    f"{record['drug']} {record['form_release']} {record['method']} {record['dosage']} "
                    f"{comment}", styleT)
            ])
            v_table.append(temp_time)

        cols_width = [15.5 * mm for i in range(len(dates_record))]
        cols_width[0] = 50 * mm

        tbl = Table(v_table, repeatRows=1, colWidths=cols_width, hAlign='LEFT')
        tbl.setStyle(
            TableStyle([
                ('GRID', (0, 0), (-1, -1), 1.0, colors.black),
                ('BOTTOMPADDING', (0, 0), (-1, -1), 3 * mm),
                ('TOPPADDING', (0, 0), (-1, -1), 1 * mm),
                ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
            ]))

        objs.append(tbl)
        objs.append(Spacer(1, 15 * mm))
        start = end
        end += slice_count

    doc.build(objs)
    pdf = buffer.getvalue()
    buffer.close()
    return pdf
コード例 #9
0
    def buildAddHocPDF(self, Data=None):
        #buat text centered
        BAState = Paragraph("Berita Acara ", self.helper.CENTER_STYLE_H1)
        self.flowables.append(BAState)
        self.flowables.append(Spacer(0, 50))
        ToEmployee = Data[self.main_display_add_hoc[5]]
        Descriptions = Data[self.main_display_add_hoc[7]]
        GoodsName = Data[self.main_display_add_hoc[0]]
        self.canv.setTitle("Goods_Outwards_" + GoodsName)
        self.canv.setTitle("Goods_Outwards_" + GoodsName)
        BrandName = Data[self.main_display_add_hoc[1]]
        Type = Data[self.main_display_add_hoc[3]]
        SerialNumber = Data[self.main_display_add_hoc[2]]
        Kondisi = Data[self.main_display_add_hoc[8]]
        Equipment = Data[self.main_display_add_hoc[6]]
        DateReleased = Data[self.main_display_add_hoc[4]]
        Sender = Data[self.main_display_add_hoc[10]]
        self.flowables.append(
            Paragraph(
                """Telah diserahkan 1 unit barang inventaris kepada Saudara/(Saudari){ToEmployee}, <br/> <br/>
        """.format(ToEmployee=ToEmployee, GoodsName=GoodsName),
                self.helper.LABEL_STYLE))

        self.flowables.append(Spacer(0, 25))

        #self.flowables.ap(Indenter(-90))
        colWidthBarang = [120, 250]

        berupa = Paragraph("<b>Berupa</b>", self.helper.LABEL_STYLE)
        barang = Paragraph(": {GoodsName}".format(GoodsName=GoodsName),
                           self.helper.LABEL_STYLE)

        merk = Paragraph("<b>Merek</b>", self.helper.LABEL_STYLE)
        merkBarang = Paragraph(": {BrandName}".format(BrandName=BrandName),
                               self.helper.LABEL_STYLE)

        LabelType = Paragraph("<b>Type</b>", self.helper.LABEL_STYLE)
        TypeBarang = Paragraph(": {Type}".format(Type=Type),
                               self.helper.LABEL_STYLE)

        LabelSN = Paragraph("<b>SerialNumber/FA NO</b>",
                            self.helper.LABEL_STYLE)
        DataSN = Paragraph(
            ": {SerialNumber}".format(SerialNumber=SerialNumber),
            self.helper.LABEL_STYLE)

        DataBarang = [[berupa, barang], [merk, merkBarang],
                      [LabelType, TypeBarang], [LabelSN, DataSN]]
        tblBarang = Table(DataBarang,
                          colWidthBarang,
                          None,
                          style=TableStyle([('ALIGN', (0, 0), (-1, -1), 'LEFT')
                                            ]),
                          hAlign='LEFT')
        self.flowables.append(tblBarang)

        self.flowables.append(Spacer(0, 20))
        self.flowables.append(
            Paragraph("{Descriptions}".format(Descriptions=Descriptions),
                      self.helper.LABEL_STYLE))

        #self.flowables.append(Paragraph("""<b>Berupa&nbsp;&nbsp;: {GoodsName}<br/>Merek&nbsp;&nbsp;: {BrandName}<br/>Type&nbsp;&nbsp;: {Type}<br/>
        #ServiceTag/FA_Number&nbsp;&nbsp;: {SerialNumber}<br/><br/><br/>
        #Kelengkapan:</b>""" .format(GoodsName=GoodsName,BrandName=BrandName, Type=Type, SerialNumber=SerialNumber), self.helper.LABEL_STYLE))
        self.flowables.append(Spacer(0, 20))
        self.flowables.append(
            Paragraph("Kelengkapan : {}".format(Equipment),
                      self.helper.LABEL_STYLE))  #kelengkapan
        self.flowables.append(Spacer(0, 20))
        if Kondisi == "Bekas":
            EksEmployee = Data[self.main_display_add_hoc[9]]
            self.flowables.append(
                Paragraph(
                    "{GoodsName} ({Conditions} {EksEmployee})".format(
                        GoodsName=GoodsName,
                        Conditions=Kondisi,
                        EksEmployee=EksEmployee), self.helper.LABEL_STYLE))
        elif Kondisi == "Baru":
            self.flowables.append(
                Paragraph(
                    "{GoodsName} {Conditions}".format(GoodsName=GoodsName,
                                                      Conditions=Kondisi),
                    self.helper.LABEL_STYLE))
        self.flowables.append(Spacer(0, 20))
        self.flowables.append(
            Paragraph("Demikian berita acara ini di buat dengan sebenarnya",
                      self.helper.LABEL_STYLE))
        self.flowables.append(Spacer(0, 25))
        self.flowables.append(
            Paragraph(
                "Jakarta, {},".format(
                    parse(str(DateReleased)).strftime('%d %B %Y')),
                self.helper.LABEL_STYLE))
        self.flowables.append(Spacer(0, 160))
        self.flowables.append(Indenter(left=130))
        #create table
        colWidths = [(self.width / 1.8) - 5, (self.width / 2) - 5]
        #self.flowables.append(i)
        Accepter = Paragraph("Yang Menerima", self.helper.LABEL_STYLE)
        Submitter = Paragraph("Yang Menyerahkan", self.helper.LABEL_STYLE)

        Data1 = [[Accepter, Submitter]]
        tbl1 = Table(data=Data1,
                     colWidths=colWidths,
                     style=TableStyle([('ALIGN', (0, 0), (-2, -1), 'LEFT'),
                                       ('ALIGN', (0, 1), (-1, -1), 'RIGHT')]))
        self.flowables.append(tbl1)
        self.flowables.append(Spacer(0, 50))
        Data2 = [[
            Paragraph("(&nbsp;&nbsp;{}&nbsp;&nbsp;)".format(ToEmployee),
                      self.helper.LABEL_STYLE),
            Paragraph("(&nbsp;&nbsp;{}&nbsp;&nbsp;)".format(Sender),
                      self.helper.LABEL_STYLE)
        ]]
        tbl2 = Table(data=Data2,
                     colWidths=colWidths,
                     style=TableStyle([('ALIGN', (0, 0), (-2, -1), 'LEFT'),
                                       ('ALIGN', (0, 1), (-1, -1), 'RIGHT')]))
        self.flowables.append(tbl2)

        #add logo
        widthLogo = 187.5
        heightLogo = 137.25
        x, y = self.helper.coord(self.width - widthLogo,
                                 self.height - heightLogo, self.height,
                                 self.helper.unit_lookup["pt"])
        self.set_cursor(x + 50, y - 95)
        #self.doc.canv.setTitle("Goods_Outwards_" + GoodsName)
        self.doc.widthLogo = widthLogo
        self.doc.heigLogo = heightLogo
        self.doc.logo_path_header = settings.LOGO_IMAGE + "LogoHeader.jpg"
        self.doc.logo_path_footer = settings.LOGO_IMAGE + "LogoFooter.jpg"
        #self.helper.AddLogoHeader(self.canvas, self.doc)
        self.doc.build(self.flowables,
                       onFirstPage=self.helper.header_and_footer)
        #self.doc.build(self.flowables, onFirstPage=self.AddLogoHeader)

        ReportFile = self.file.getvalue()
        self.file.close()
        return ReportFile
コード例 #10
0
    def create_claims(self):
        """"""
        fsize = 7.5

        ptext = '<font size=26>Your claims up close</font>'
        p = Paragraph(ptext, self.styles["Normal"])
        self.elements.append(p)
        self.elements.append(Spacer(1, 20))

        claim = Paragraph(
            '''<font size={0}>
            Claim ID {1}<br/>
            Received on 12/12/16<br/></font>
            '''.format(fsize, 'ER123456789'), self.styles["Normal"])
        billed = Paragraph(
            '<font size={}>Amount<br/>billed</font>'.format(fsize),
            self.styles["Normal"])
        member_rate = Paragraph(
            '<font size={}>Member<br/>rate</font>'.format(fsize),
            self.styles["Normal"])
        pending = Paragraph(
            '<font size={}>Pending or<br/>not payable<br/>(Remarks)</font>'.
            format(fsize), self.styles["Normal"])
        applied = Paragraph(
            '<font size={}>Applied to<br/>deductible</font>'.format(fsize),
            self.styles["Normal"])
        copay = Paragraph('<font size={}>Your<br/>copay</font>'.format(fsize),
                          self.styles["Normal"])
        remaining = Paragraph(
            '<font size={}>Amount<br/>remaining</font>'.format(fsize),
            self.styles["Normal"])
        plan_pays = Paragraph(
            '<font size={}>Plan<br/>pays</font>'.format(fsize),
            self.styles["Normal"])
        coins = Paragraph(
            '<font size={}>Your<br/>coinsurance</font>'.format(fsize),
            self.styles["Normal"])
        owe = Paragraph(
            '<font size={}>You owe<br/>C+D+E+H=I</font>'.format(fsize),
            self.styles["Normal"])

        claim_one = [
            self.create_text('FLU VIRUS VACC-SPLIT 3 YR & on 9/12/16'),
            self.create_text('12.50'), '', '', '', '',
            self.create_text('12.50'),
            self.create_text('12.50 (100%)'), '', ''
        ]

        data = [
            [
                claim, billed, member_rate, pending, applied, copay, remaining,
                plan_pays, coins, owe
            ],
        ]
        for item in range(50):
            data.append(claim_one)

        colWidths = [110, 50, 40, 60, 50, 40, 50, 40, 55, 60]
        table_style = TableStyle([
            ('INNERGRID', (0, 0), (-1, -1), 0.25,
             colors.black),  # Add grid to cells
            ('BOX', (0, 0), (-1, -1), 0.25, colors.black),  # add outer border
            ('BACKGROUND', (1, 0), (1, -1), colors.lightgoldenrodyellow),
            ('BACKGROUND', (7, 0), (7, -1), colors.lightgoldenrodyellow)
        ])

        table = Table(data, colWidths=colWidths)
        table.setStyle(table_style)

        self.elements.append(Indenter(left=40))
        self.elements.append(table)
        self.elements.append(Indenter(left=-40))
コード例 #11
0
ファイル: CANVIS.py プロジェクト: manning-lab/fineMap
def Assemble_PDF(data_plots, posterior_plots, heatmaps, annotation_plot, output):
    DPI = 100
    
    # save posterior plot
    posterior_plots.set_size_inches(8, 4) 
    posterior_plots.savefig('posterior_plots.png', format='png', dpi=DPI, transparent=True, bbox_inches='tight')

    # save annotation plots
    for i,plot in enumerate(annotation_plot):
        plot.set_size_inches(6.9, 0.2)
        plot.savefig('annotation_plot'+str(i)+'.png', format='png', dpi=DPI, transparent=True, bbox_inches='tight')

    # save data plot
    for i,plot in enumerate(data_plots):
        plot[0].set_size_inches(8, 4) 
        plot[0].savefig('value_plots'+str(i)+'.png', format='png', dpi=DPI, transparent=True, bbox_inches='tight')

    # save heatmap
    for i,heatmap in enumerate(heatmaps):
        plot = heatmap[0]
        plot.set_size_inches(np.sqrt(32), np.sqrt(32)) 
        plot.savefig('heatmap'+str(i)+'.png', format='png', dpi=DPI, transparent=True, bbox_inches='tight')

    # colorbar
    colorbar_h = heatmap[1]
    colorbar_h.set_size_inches(4, .5)
    colorbar_h.savefig('colorbar_h.png', format='png', dpi=DPI, transparent=True, bbox_inches='tight')

    colorbar = data_plots[0][1]
    colorbar.set_size_inches(4, .5)
    colorbar.savefig('colorbar.png', format='png', dpi=DPI, transparent=True, bbox_inches='tight')

    # start pdf doc
    doc = SimpleDocTemplate(output+".pdf", pagesize=(10*inch,18*inch+0.5*len(annotation_plot)*inch), rightMargin=0, leftMargin=0, topMargin=0, bottomMargin=0)

    # list for figures
    Story = []

    # add posterior plot
    Story.append(Image('posterior_plots.png'))

    # loop through annotations adding an indent to each one
    for i in range(0,len(annotation_plot)):
        Story.append(Indenter(left=.6*inch))
        Story.append(Image('annotation_plot'+str(i)+'.png'))

    Story.append(Indenter(right=.6*inch))

    # add zscore/pvalue plots
    Story.extend([Image('value_plots'+str(i)+'.png') for i in range(0,len(data_plots))])

    # add colorbar
    Story.append(Image('colorbar_h.png'))

    # add ld plot
    for i in range(0,len(annotation_plot)):
        Story.append(Indenter(left=6.9*inch))
        Story.append(RotatedImage('heatmap'+str(i)+'.png'))

    Story.append(Indenter(right=6.9*inch))

    # add other colorbar
    Story.append(Image('colorbar.png'))

    # build image and save
    doc.build(Story)
コード例 #12
0
    def export(self, filename, data_align='LEFT', table_halign='LEFT'):
        """
        Export the data to a PDF file.
        
        Arguments:
            filename - The filename for the generated PDF file.
            data_align - The alignment of the data inside the table (eg.
                'LEFT', 'CENTER', 'RIGHT')
            table_halign - Horizontal alignment of the table on the page
                (eg. 'LEFT', 'CENTER', 'RIGHT')
        """
        doc = SimpleDocTemplate(filename,
                                pagesize=self.formato,
                                leftMargin=self.leftMrg,
                                rightMargin=self.rightMrg,
                                topMargin=self.topMrg,
                                bottomMargin=self.bottomMrg)
        #        doc = BaseDocTemplate("C:/Users/Isr/git/MyDev/SpatialControls/Main/ReportTemplate.pdf",showBoundary=1,pagesize=landscape(letter))
        # for sample styleSheets http://eric.sau.pe/tag/reportlab-getsamplestylesheet/
        styles = getSampleStyleSheet()
        #         styleH = styles['Heading1']

        pdfmetrics.registerFont(TTFont('Arial', 'arial.ttf'))
        pdfmetrics.registerFont(
            TTFont('LiberationSans', 'LiberationSans-Regular.ttf'))
        pdfmetrics.registerFont(
            TTFont('LiberationSansBold', 'LiberationSans-Bold.ttf'))
        pdfmetrics.registerFont(
            TTFont('LiberationSansItalic', 'LiberationSans-Italic.ttf'))
        pdfmetrics.registerFont(
            TTFont('LiberationSansBoldItalic',
                   'LiberationSans-BoldItalic.ttf'))

        ##stile_sottot=ParagraphStyle('Sottotitolo',parent=styles['Normal'],fontName='LiberationSansBold',fontSize=18,spaceBefore=20,spaceAfter=10,leftIndent=0,alignment=TA_CENTER,textColor=black)
        #stile_intest=ParagraphStyle('Intestazione',parent=styles['Normal'],fontName='LiberationSansBold',fontSize=12,spaceBefore=8,spaceAfter=0,leftIndent=0,alignment=TA_CENTER,textColor=colors.darkgrey)
        #stile_catego=ParagraphStyle('Categoria',parent=styles['Normal'],fontName='LiberationSansBold',fontSize=18,spaceBefore=20,spaceAfter=10,leftIndent=20,alignment=TA_LEFT,textColor=black)
        #stile_gruppo=ParagraphStyle('Gruppo',parent=styles['Normal'],fontName='LiberationSansBoldItalic',fontSize=14,spaceBefore=12,spaceAfter=10,leftIndent=40,alignment=TA_LEFT,textColor=black)
        #stile_err_ok=ParagraphStyle('Esito_err_ok',parent=styles['Normal'],fontName='LiberationSans',fontSize=10,spaceBefore=2,spaceAfter=0,leftIndent=60,alignment=TA_LEFT,textColor=colors.darkgreen)
        #stile_err_dc=ParagraphStyle('Esito_err_desc',parent=styles['Normal'],fontName='LiberationSans',fontSize=10,spaceBefore=2,spaceAfter=0,leftIndent=60,alignment=TA_LEFT,textColor=colors.darkred)
        #stile_err_id=ParagraphStyle('Esito_err_id',parent=styles['Normal'],fontName='LiberationSansItalic',fontSize=10,spaceBefore=1,spaceAfter=0,leftIndent=80,alignment=TA_LEFT,textColor=colors.darkred)
        #stile_descri=ParagraphStyle('Descriz_ctrl',parent=styles['Normal'],fontName='LiberationSansItalic',fontSize=10,spaceBefore=1,spaceAfter=0,leftIndent=60,alignment=TA_LEFT,textColor=colors.darkgrey)
        stile_codmod = ParagraphStyle('cod_mod',
                                      parent=styles['Normal'],
                                      fontName='LiberationSansBold',
                                      fontSize=16,
                                      spaceBefore=20,
                                      spaceAfter=15,
                                      leftIndent=0,
                                      alignment=TA_LEFT,
                                      textColor=black)
        stile_docmod = ParagraphStyle('doc_mod',
                                      parent=styles['Normal'],
                                      fontName='LiberationSans',
                                      fontSize=12,
                                      spaceBefore=4,
                                      spaceAfter=0,
                                      leftIndent=20,
                                      alignment=TA_LEFT,
                                      textColor=black)

        story = []

        for intest in self.lst_intest:
            story.append(Indenter(left=intest['INDENT_MM'] * mm, right=0 * mm))
            story.append(Paragraph(intest['TESTO'], styles[intest['STILE']]))
            story.append(Spacer(width=0 * mm, height=intest['BELOW_MM'] * mm))
            story.append(Indenter(left=-intest['INDENT_MM'] * mm,
                                  right=0 * mm))
#
#         story.append(Spacer(width=0*mm, height=10*mm))

        for doc_mod in self.lst_doc_mod:
            story.append(Paragraph(doc_mod['COD_MOD'], stile_codmod))
            str_doc_mod = doc_mod['DOC_MOD']
            righe = str_doc_mod.split('\n')
            #QMessageBox.information(None, "doc_mod", str_doc_mod, QMessageBox.Ok, QMessageBox.NoButton)
            for riga in righe:
                story.append(Paragraph(riga, stile_docmod))

        #story.append(Spacer(width=0*mm, height=10*mm))

        doc.build(story,
                  onFirstPage=self.addPageNumber,
                  onLaterPages=self.addPageNumber)
コード例 #13
0
    def test0(self):
        """Test...

        The story should contain...

        Features to be visually confirmed by a human being are:

            1. ...
            2. ...
            3. ...
        """

        story = []

        #need a style
        styNormal = ParagraphStyle('normal')
        styGreen = ParagraphStyle('green', parent=styNormal, textColor=green)

        # some to test
        stySpaced = ParagraphStyle('spaced',
                                   parent=styNormal,
                                   spaceBefore=12,
                                   spaceAfter=12)

        story.append(
            Paragraph("This is a normal paragraph. " + randomText(),
                      styNormal))
        story.append(
            Paragraph(
                "This has 12 points space before and after, set in the style. "
                + randomText(), stySpaced))
        story.append(Paragraph("This is normal. " + randomText(), styNormal))

        story.append(
            Paragraph(
                """<para spacebefore="12" spaceafter="12">
            This has 12 points space before and after, set inline with
            XML tag.  It works too.""" + randomText() + "</para", styNormal))

        story.append(Paragraph("This is normal. " + randomText(), styNormal))

        styBackground = ParagraphStyle('MyTitle',
                                       fontName='Helvetica-Bold',
                                       fontSize=24,
                                       leading=28,
                                       textColor=white,
                                       backColor=navy)
        story.append(
            Paragraph("This is a title with a background. ", styBackground))

        story.append(
            Paragraph(
                """<para backcolor="pink">This got a background from the para tag</para>""",
                styNormal))

        story.append(
            Paragraph(
                """<para>\n\tThis has newlines and tabs on the front but inside the para tag</para>""",
                styNormal))
        story.append(
            Paragraph(
                """<para>  This has spaces on the front but inside the para tag</para>""",
                styNormal))

        story.append(
            Paragraph(
                """\n\tThis has newlines and tabs on the front but no para tag""",
                styNormal))
        story.append(
            Paragraph("""  This has spaces on the front but no para tag""",
                      styNormal))

        story.append(
            Paragraph("""This has <font color=blue>blue text</font> here.""",
                      styNormal))
        story.append(
            Paragraph("""This has <i>italic text</i> here.""", styNormal))
        story.append(
            Paragraph("""This has <b>bold text</b> here.""", styNormal))
        story.append(
            Paragraph("""This has <u>underlined text</u> here.""", styNormal))
        story.append(
            Paragraph(
                """This has <font color=blue><u>blue and <font color=red>red</font> underlined text</u></font> here.""",
                styNormal))
        story.append(Paragraph("""<u>green underlining</u>""", styGreen))
        story.append(
            Paragraph(
                """<u>green <font size=+4><i>underlining</font></i></u>""",
                styGreen))
        story.append(
            Paragraph("""This has m<super>2</super> a superscript.""",
                      styNormal))
        story.append(
            Paragraph(
                """This has m<sub>2</sub> a subscript. Like H<sub>2</sub>O!""",
                styNormal))
        story.append(
            Paragraph(
                """This has a font change to <font name=Helvetica>Helvetica</font>.""",
                styNormal))
        #This one fails:
        #story.append(Paragraph("""This has a font change to <font name=Helvetica-Oblique>Helvetica-Oblique</font>.""", styNormal))
        story.append(
            Paragraph(
                """This has a font change to <font name=Helvetica><i>Helvetica in italics</i></font>.""",
                styNormal))

        story.append(
            Paragraph(
                '''This one uses upper case tags and has set caseSensitive=0: Here comes <FONT FACE="Helvetica" SIZE="14pt">Helvetica 14</FONT> with <STRONG>strong</STRONG> <EM>emphasis</EM>.''',
                styNormal,
                caseSensitive=0))
        story.append(
            Paragraph(
                '''The same as before, but has set not set caseSensitive, thus the tags are ignored: Here comes <FONT FACE="Helvetica" SIZE="14pt">Helvetica 14</FONT> with <STRONG>strong</STRONG> <EM>emphasis</EM>.''',
                styNormal))
        story.append(
            Paragraph(
                '''This one uses fonts with size "14pt" and also uses the em and strong tags: Here comes <font face="Helvetica" size="14pt">Helvetica 14</font> with <Strong>strong</Strong> <em>emphasis</em>.''',
                styNormal,
                caseSensitive=0))
        story.append(
            Paragraph(
                '''This uses a font size of 3cm: Here comes <font face="Courier" size="3cm">Courier 3cm</font> and normal again.''',
                styNormal,
                caseSensitive=0))
        story.append(
            Paragraph(
                '''This is just a very long silly text to see if the <FONT face="Courier">caseSensitive</FONT> flag also works if the paragraph is <EM>very</EM> long. '''
                * 20,
                styNormal,
                caseSensitive=0))
        story.append(Indenter("1cm"))
        story.append(
            Paragraph(
                "<para><bullet bulletIndent='-1cm'><seq id='s0'/>)</bullet>Indented list. %s</para>"
                % randomText(), styNormal))
        story.append(
            Paragraph(
                "<para><bullet bulletIndent='-1cm'><seq id='s0'/>)</bullet>Indented list. %s</para>"
                % randomText(), styNormal))
        story.append(
            Paragraph(
                "<para><bullet bulletIndent='-1cm'><seq id='s0'/>)</bullet>Indented list. %s</para>"
                % randomText(), styNormal))
        story.append(Indenter("1cm"))
        story.append(
            XPreformatted(
                "<para leftIndent='0.5cm' backcolor=pink><bullet bulletIndent='-1cm'><seq id='s1'/>)</bullet>Indented list.</para>",
                styNormal))
        story.append(
            XPreformatted(
                "<para leftIndent='0.5cm' backcolor=palegreen><bullet bulletIndent='-1cm'><seq id='s1'/>)</bullet>Indented list.</para>",
                styNormal))
        story.append(Indenter("-1cm"))
        story.append(
            Paragraph(
                "<para><bullet bulletIndent='-1cm'><seq id='s0'/>)</bullet>Indented list. %s</para>"
                % randomText(), styNormal))
        story.append(Indenter("-1cm"))
        story.append(
            Paragraph(
                "<para>Indented list using seqChain/Format<seqChain order='s0 s1 s2 s3 s4'/><seqReset id='s0'/><seqFormat id='s0' value='1'/><seqFormat id='s1' value='a'/><seqFormat id='s2' value='i'/><seqFormat id='s3' value='A'/><seqFormat id='s4' value='I'/></para>",
                stySpaced))
        story.append(Indenter("1cm"))
        story.append(
            Paragraph(
                "<para><bullet bulletIndent='-1cm'><seq id='s0'/>)</bullet>Indented list. %s</para>"
                % randomText(), styNormal))
        story.append(
            Paragraph(
                "<para><bullet bulletIndent='-1cm'><seq id='s0'/>)</bullet>Indented list. %s</para>"
                % randomText(), styNormal))
        story.append(
            Paragraph(
                "<para><bullet bulletIndent='-1cm'><seq id='s0'/>)</bullet>Indented list. %s</para>"
                % randomText(), styNormal))
        story.append(Indenter("1cm"))
        story.append(
            XPreformatted(
                "<para backcolor=pink><bullet bulletIndent='-1cm'><seq id='s1'/>)</bullet>Indented list.</para>",
                styNormal))
        story.append(
            XPreformatted(
                "<para backcolor=pink><bullet bulletIndent='-1cm'><seq id='s1'/>)</bullet>Indented list.</para>",
                styNormal))
        story.append(Indenter("-1cm"))
        story.append(
            Paragraph(
                "<para><bullet bulletIndent='-1cm'><seq id='s0'/>)</bullet>Indented list. %s</para>"
                % randomText(), styNormal))
        story.append(Indenter("1cm"))
        story.append(
            XPreformatted(
                "<para backcolor=palegreen><bullet bulletIndent='-1cm'><seq id='s1'/>)</bullet>Indented list.</para>",
                styNormal))
        story.append(Indenter("1cm"))
        story.append(
            XPreformatted(
                "<para><bullet bulletIndent='-1cm'><seq id='s2'/>)</bullet>Indented list. line1</para>",
                styNormal))
        story.append(
            XPreformatted(
                "<para><bullet bulletIndent='-1cm'><seq id='s2'/>)</bullet>Indented list. line2</para>",
                styNormal))
        story.append(Indenter("-1cm"))
        story.append(
            XPreformatted(
                "<para backcolor=palegreen><bullet bulletIndent='-1cm'><seq id='s1'/>)</bullet>Indented list.</para>",
                styNormal))
        story.append(Indenter("-1cm"))
        story.append(Indenter("-1cm"))

        template = SimpleDocTemplate(outputfile('test_paragraphs.pdf'),
                                     showBoundary=1)
        template.build(story,
                       onFirstPage=myFirstPage,
                       onLaterPages=myLaterPages)
コード例 #14
0
def form_04(request_data):
    """
    Форма 030/у - контрольная карта диспансерного учета
    """
    reg_dipensary = DispensaryReg.objects.get(pk=request_data["reg_pk"])
    ind_card = reg_dipensary.card
    patient_data = ind_card.get_data_individual()

    hospital: Hospitals = request_data["hospital"]

    hospital_name = hospital.safe_short_title
    hospital_address = hospital.safe_address
    hospital_kod_ogrn = hospital.safe_ogrn

    if sys.platform == 'win32':
        locale.setlocale(locale.LC_ALL, 'rus_rus')
    else:
        locale.setlocale(locale.LC_ALL, 'ru_RU.UTF-8')

    pdfmetrics.registerFont(
        TTFont('PTAstraSerifBold',
               os.path.join(FONTS_FOLDER, 'PTAstraSerif-Bold.ttf')))
    pdfmetrics.registerFont(
        TTFont('PTAstraSerifReg',
               os.path.join(FONTS_FOLDER, 'PTAstraSerif-Regular.ttf')))

    buffer = BytesIO()
    # doc = SimpleDocTemplate(buffer, pagesize=A4, leftMargin=25 * mm, rightMargin=5 * mm, topMargin=6 * mm, bottomMargin=6 * mm, allowSplitting=1, title="Форма {}".format("025/у"))
    doc = SimpleDocTemplate(buffer,
                            pagesize=landscape(A5),
                            leftMargin=25 * mm,
                            rightMargin=5 * mm,
                            topMargin=6 * mm,
                            bottomMargin=6 * mm,
                            allowSplitting=1,
                            title="Форма {}".format("030/у"))
    width, height = portrait(A4)
    styleSheet = getSampleStyleSheet()
    style = styleSheet["Normal"]
    style.fontName = "PTAstraSerifReg"
    style.fontSize = 10
    style.leading = 12
    style.spaceAfter = 0.5 * mm
    styleBold = deepcopy(style)
    styleBold.fontName = "PTAstraSerifBold"
    styleCenter = deepcopy(style)
    styleCenter.alignment = TA_CENTER
    styleCenter.fontSize = 12
    styleCenter.leading = 7
    styleCenter.spaceAfter = 1 * mm
    styleCenterBold = deepcopy(styleBold)
    styleCenterBold.alignment = TA_CENTER
    styleCenterBold.fontSize = 12
    styleCenterBold.leading = 15
    styleCenterBold.face = 'PTAstraSerifBold'
    styleCenterBold.borderColor = black
    styleJustified = deepcopy(style)
    styleJustified.alignment = TA_JUSTIFY
    styleJustified.spaceAfter = 4.5 * mm
    styleJustified.fontSize = 12
    styleJustified.leading = 4.5 * mm

    objs = []

    styleT = deepcopy(style)
    styleT.alignment = TA_LEFT
    styleT.fontSize = 10
    styleT.leading = 4.5 * mm
    styleT.face = 'PTAstraSerifReg'

    styleTCenter = deepcopy(styleT)
    styleTCenter.alignment = TA_CENTER

    print_district = ''
    if SettingManager.get("district", default='True', default_type='b'):
        if ind_card.district is not None:
            print_district = 'Уч: {}'.format(ind_card.district.title)

    opinion = [
        [
            Paragraph(
                '<font size=11>{}<br/>Адрес: {}<br/>ОГРН: {} <br/><u>{}</u> </font>'
                .format(hospital_name, hospital_address, hospital_kod_ogrn,
                        print_district), styleT),
            Paragraph(
                '<font size=9 >Код формы по ОКУД:<br/>Код организации по ОКПО:<br/>'
                'Медицинская документация<br/>Учетная форма N 030/у</font>',
                styleT),
        ],
    ]

    tbl = Table(opinion, 2 * [90 * mm])
    tbl.setStyle(
        TableStyle([
            ('GRID', (0, 0), (-1, -1), 0.75, colors.white),
            ('LEFTPADDING', (1, 0), (-1, -1), 80),
            ('VALIGN', (0, 0), (-1, -1), 'TOP'),
        ]))

    objs.append(tbl)
    space_symbol = '&nbsp;'
    if patient_data['age'] < SettingManager.get(
            "child_age_before", default='15', default_type='i'):
        patient_data['serial'] = patient_data['bc_serial']
        patient_data['num'] = patient_data['bc_num']
    else:
        patient_data['serial'] = patient_data['passport_serial']
        patient_data['num'] = patient_data['passport_num']

    card_num_obj = patient_data['card_num'].split(' ')
    p_card_num = card_num_obj[0]
    if len(card_num_obj) == 2:
        p_card_type = '(' + str(card_num_obj[1]) + ')'
    else:
        p_card_type = ''

    diagnos = reg_dipensary.diagnos
    illnes = reg_dipensary.illnes
    doctor = reg_dipensary.doc_start_reg
    doc_speciality = "____________________"
    if doctor.specialities:
        doc_speciality = f"<u>{doctor.specialities.title}</u>"
    doc_fio = doctor.get_full_fio()
    date_start = reg_dipensary.date_start
    date_start = strdate(date_start, short_year=True)
    date_start = normalize_date(date_start)

    date_end = reg_dipensary.date_end
    if date_end:
        date_end = strdate(date_end, short_year=True)
        date_end = normalize_date(date_end)
    else:
        date_end = ""

    why_stop = reg_dipensary.why_stop

    if reg_dipensary.what_times == 1:
        what_times = "впервые - 1"
    elif reg_dipensary.what_times == 2:
        what_times = "повторно - 2"
    else:
        what_times = "впервые - 1, повторно - 2"

    if reg_dipensary.how_identified == 1:
        how_identified = "обращении за лечением - 1"
    elif reg_dipensary.how_identified == 2:
        how_identified = "профилактическом осмотре - 2"
    else:
        how_identified = "обращении за лечением - 1, профилактическом осмотре - 2"

    content_title = [
        Indenter(left=0 * mm),
        Spacer(1, 1 * mm),
        Paragraph('КОНТРОЛЬНАЯ КАРТА, ', styleCenter),
        Paragraph(
            'ДИСПАНСЕРНОГО НАБЛЮДЕНИЯ {}<font size=14>№</font><font fontname="PTAstraSerifBold" size=17> <u>{}</u></font><font size=14> {}</font>'
            .format(3 * space_symbol, p_card_num, p_card_type),
            styleCenter,
        ),
        Spacer(1, 7 * mm),
        Paragraph(
            f'1. Диагноз заболевания, по поводу которого пациент подлежит диспансерному наблюдению: <u>{illnes}</u> Код по МКБ-10: <u>{diagnos}</u>',
            style),
        Paragraph('2.Дата заполнения медицинской карты: _____________________',
                  style),
        Paragraph(
            f'3. Специальность врача: {doc_speciality} {4 * space_symbol} 4.ФИО врача: <u>{doc_fio}</u>',
            style),
        Paragraph(
            f'5. Дата установления диагноза: <u>{date_start}</u> {4 * space_symbol} 6. Диагноз установлен: {what_times}',
            style),
        Paragraph(f'7. Заболевание выявлено при: {how_identified}', style),
        Paragraph(
            f'8. Дата начала диспансерного наблюдения <u>{date_start}</u> {4 * space_symbol} 9. Дата прекращения диспансерного наблюдения {date_end}',
            style),
        Paragraph(
            f'10. Причины прекращения диспансерного наблюдения: <u>{why_stop}</u>',
            style),
        Paragraph(
            "11. Фамилия, имя, отчество:&nbsp;  <font size=11.7 fontname ='PTAstraSerifBold'> {} </font> "
            .format(patient_data['fio']), style),
        Paragraph(
            '12. Пол: {} {} 13. Дата рождения: {}'.format(
                patient_data['sex'], 3 * space_symbol, patient_data['born']),
            style),
        Paragraph(
            '14. Место регистрации: {}'.format(patient_data['main_address']),
            style),
        Paragraph('15. Код категории льготы:__________', style),
    ]

    objs.extend(content_title)
    objs.append(Spacer(1, 5 * mm))

    research_need = DispensaryPlan.objects.filter(diagnos=diagnos).order_by(
        'research__title', 'speciality__title')
    researches_list = []
    specialities_list = []
    visits_result = ""
    visits_plan = ""
    visits_research = VisitPurpose.objects.filter(
        title__icontains="диспансерн")

    current_year = datetime.datetime.now().year
    year = request_data.get('year', current_year)
    for i in research_need:
        if i.speciality:
            results = research_last_result_every_month(
                Researches.objects.filter(speciality=i.speciality), ind_card,
                year, visits_research)
            dates_result = ""
            dates_plan = ""
            plans = DispensaryRegPlans.objects.filter(
                card=ind_card,
                research=None,
                speciality=i.speciality,
                date__year=year).order_by('date')
            for p in plans:
                dates_plan = f"{dates_plan} {strfdatetime(p.date, '%d.%m')};"
            for r in range(12):
                if results[r]:
                    if r < 9:
                        dates_result = f"{dates_result} {results[r]['date']}.0{r + 1};"
                    else:
                        dates_result = f"{dates_result} {results[r]['date']}.{r + 1};"
            if i.is_visit:
                visits_result = dates_result
                visits_plan = dates_plan
            else:
                specialities_list.append(
                    f'{i.speciality.title}-{dates_plan}-{dates_result}')
        if i.research:
            dates_plan = " "
            plans = DispensaryRegPlans.objects.filter(
                card=ind_card,
                research=None,
                speciality=i.speciality,
                date__year=year).order_by('date')
            for p in plans:
                dates_plan = f"{dates_plan} {strfdatetime(p.date, '%d.%m')};"
            results = research_last_result_every_month([i.research], ind_card,
                                                       year)
            dates_result = ""
            for r in range(12):
                if results[r]:
                    if r < 9:
                        dates_result = f"{dates_result} {results[r]['date']}.0{r + 1};"
                    else:
                        dates_result = f"{dates_result} {results[r]['date']}.{r + 1};"
            researches_list.append(
                f'{i.research.title}-{dates_plan}-{dates_result}')

    researches_list.extend(specialities_list)
    visits_result = visits_result.split(';')[:-1]
    visits_plan = visits_plan.split(';')[:-1]
    visits_plan = [Paragraph(i, styleT) for i in visits_plan]
    if len(visits_plan) < 7:
        for i in range(7 - len(visits_plan)):
            visits_plan.append(Paragraph('', styleT))
    visits_plan.insert(0, Paragraph('Назначено явиться', styleT))

    visits_result = [Paragraph(i, styleT) for i in visits_result]
    if len(visits_result) < 7:
        for i in range(7 - len(visits_result)):
            visits_result.append(Paragraph('', styleT))
    visits_result.insert(0, Paragraph('Явился(лась)', styleT))

    opinion = [
        [
            Paragraph('Даты посещений', styleTCenter),
            Paragraph('', styleT),
            Paragraph('', styleT),
            Paragraph('', styleT),
            Paragraph('', styleT),
            Paragraph('', styleT),
            Paragraph('', styleT),
            Paragraph('', styleT),
        ],
        visits_plan,
        visits_result,
    ]

    tbl = Table(opinion,
                colWidths=(40 * mm, 20 * mm, 20 * mm, 20 * mm, 20 * mm,
                           20 * mm, 20 * mm, 20 * mm))
    tbl.setStyle(
        TableStyle([
            ('GRID', (0, 0), (-1, -1), 0.75, colors.black),
            ('SPAN', (0, 0), (-1, 0)),
        ]))
    objs.append(tbl)
    objs.append(PageBreak())
    objs.append(Paragraph('оборотная сторона ф. N 030/у', style))
    objs.append(Spacer(1, 5 * mm))

    visit_date = [Paragraph('', styleT) for i in range(7)]
    visit_date.insert(0, Paragraph('Даты посещений', styleTCenter))
    visits_plan = [Paragraph('', styleT) for i in range(7)]
    visits_plan.insert(0, Paragraph('Назначено явиться', styleT))
    visits_result = [Paragraph('', styleT) for i in range(7)]
    visits_result.insert(0, Paragraph('Явился(лась)я', styleT))

    opinion = [visit_date, visits_plan, visits_result]

    tbl = Table(opinion,
                colWidths=(40 * mm, 20 * mm, 20 * mm, 20 * mm, 20 * mm,
                           20 * mm, 20 * mm, 20 * mm))
    tbl.setStyle(
        TableStyle([
            ('GRID', (0, 0), (-1, -1), 0.75, colors.black),
            ('SPAN', (0, 0), (-1, 0)),
        ]))

    objs.append(tbl)
    objs.append(Spacer(1, 5 * mm))
    objs.append(Paragraph('17. Сведения об изменении диагноза', style))
    objs.append(Spacer(1, 2 * mm))
    empty_para = [Paragraph('', styleT) for i in range(4)]
    opinion = [
        [
            Paragraph('Дата', styleTCenter),
            Paragraph('Формулировка диагноза', styleT),
            Paragraph('Код по МКБ-10', styleT),
            Paragraph('ФИО врача', styleT),
        ],
        empty_para,
        empty_para,
    ]
    tbl = Table(opinion,
                colWidths=(30 * mm, 85 * mm, 30 * mm, 35 * mm),
                rowHeights=6 * mm)
    tbl.setStyle(TableStyle([
        ('GRID', (0, 0), (-1, -1), 0.75, colors.black),
    ]))
    objs.append(tbl)
    objs.append(Spacer(1, 3 * mm))
    objs.append(
        Paragraph(
            '18. Сопутствующие заболевания ______________________________________________________________________',
            style))
    objs.append(Spacer(1, 2 * mm))
    objs.append(
        Paragraph(
            '___________________________________________________________________________________________________',
            style))
    objs.append(Spacer(1, 1 * mm))
    objs.append(Paragraph('19. Лечебно-профилактические мероприятия', style))

    opinion_title = [
        Paragraph('N п/п', styleT),
        Paragraph('Мероприятия', styleT),
        Paragraph('Дата<br/> начала', styleT),
        Paragraph('Дата<br/>окончания', styleT),
        Paragraph('Отметка о<br/>выполнении', styleT),
        Paragraph('ФИО врача', styleT),
    ]

    opinion = [[
        '',
        Paragraph(f'{i.split("-")[0]}', styleT), '',
        Paragraph(f'{i.split("-")[2]}', styleT), ''
    ] for i in researches_list]
    opinion.insert(0, opinion_title)

    tbl = Table(opinion,
                colWidths=(10 * mm, 60 * mm, 25 * mm, 25 * mm, 23 * mm,
                           35 * mm))
    tbl.setStyle(TableStyle([
        ('GRID', (0, 0), (-1, -1), 0.75, colors.black),
    ]))
    objs.append(tbl)

    def first_pages(canvas, document):
        canvas.saveState()
        canvas.restoreState()

    def later_pages(canvas, document):
        canvas.saveState()
        canvas.restoreState()

    doc.build(objs, onFirstPage=first_pages, onLaterPages=later_pages)

    pdf = buffer.getvalue()
    buffer.close()

    return pdf
コード例 #15
0
    def __init__(
        self,
        filename,
        entries,
        balance,
        date_from,
        date_to,
        level,
        **kwargs,
    ):
        super().__init__(filename, page_size=A4, _pageBreakQuick=0, **kwargs)
        self.income, self.expense = entries
        self.cash_bal, self.main_acc_bal, self.building_acc_bal = balance
        self.date_from = date_from
        self.date_to = date_to
        self.level = level
        self.leftMargin = 2
        self.bottomMargin = 2
        self.topMargin = 2
        self.rightMargin = 2
        self.width, self.height = A4

        self.style = getSampleStyleSheet()
        self.style.add(
            ParagraphStyle(
                name="customTitle",
                parent=self.style["Title"],
                fontName="Times-Roman",
                leading=15,
                spaceAfter=2,
            ))

        self.style.add(
            ParagraphStyle(name="trusty",
                           fontName="Times-Roman",
                           fontSize=10,
                           leading=12))
        self.style.add(ParagraphStyle(name="Justify", alignment=TA_JUSTIFY))
        self.style.add(ParagraphStyle(name="Right", alignment=TA_RIGHT))
        self.title_style = self.style["customTitle"]
        self.trusty_style = self.style["trusty"]

        # Setting up the frames, frames are use for dynamic content not fixed page elements
        page_table_frame = Frame(
            6 * cm,
            10,
            self.width - 6 * cm - 10,
            self.height - 4 * cm,
            id="small_table",
            showBoundary=1,
        )

        # Creating the page templates
        page_temp = PageTemplate(id="Page",
                                 frames=[page_table_frame],
                                 onPage=self.add_default_info)

        self.addPageTemplates([page_temp])

        self.story = []
        self.story.append(Indenter(100))
        self.story.append(Spacer(1, 5))
        ptext = (
            f"<para align=right><font size=9>Report Generate at:&nbsp; &nbsp;"
            f"<font bgcolor={colors.cornsilk}>{ctime()}</font></font></para>")
        self.story.append(Paragraph(ptext, self.style["Right"]))
        self.story.append(Spacer(1, 20))
        self.story.append(Indenter(-70))

        ptext = (
            f"<font size=11>Report Generate from &nbsp;&nbsp;<font color='darkblue'>{self.date_from}</font>"
            f"&nbsp;&nbsp; to &nbsp;&nbsp;<font color='darkblue'>{self.date_to}</font></font>"
        )
        self.story.append(Paragraph(ptext, self.style["Justify"]))
        self.story.append(Spacer(1, 20))

        ptext = "<para align=left><font color='#191970' fontsize=12><u>Entries of Income</u></font></para>"
        self.story.append(Paragraph(ptext, self.title_style))
        self.story.append(Indenter(-30))
        self.story.append(Spacer(1, 12))

        if self.level == "1":
            self.report_level_1(self.income)
        else:
            self.report_level_2(self.income)

        self.story.append(Indenter(30))
        self.story.append(Spacer(1, 40))
        ptext = "<para align=left><font color='#191970' fontsize=12><u>Entries of Expense</u></font></para>"
        self.story.append(Paragraph(ptext, self.title_style))
        self.story.append(Indenter(-30))
        self.story.append(Spacer(1, 12))

        if self.level == "1":
            self.report_level_1(self.expense)
        else:
            self.report_level_2(self.expense)

        self.story.append(Spacer(1, 40))
        self.story.append(Indenter(50))

        data = [
            [
                self.create_text("Total Main Account Bank Balance", 12, True),
                f"{self.main_acc_bal[1]} Rs",
            ],
            [
                self.create_text("Total Building Account Bank Balance", 12,
                                 True),
                f"{self.building_acc_bal[1]} Rs",
            ],
            [
                self.create_text("Total Cash Balance", 12, True),
                f"{self.cash_bal[1]} Rs",
            ],
        ]

        col_width = [250, 80]
        self.story.append(
            Table(
                data,
                colWidths=col_width,
                style=TableStyle([
                    ("BACKGROUND", (-1, 0), (-1, -1), colors.bisque),
                    ("BACKGROUND", (-1, 1), (-1, 1), colors.blanchedalmond),
                    ("ALIGN", (0, 0), (0, -1), "CENTER"),
                ]),
            ))

        self.build(self.story)
コード例 #16
0
def form_01(request_data):
    """
    Температурный лист (АД, Пульс)
    на входе: type=107.01&hosps_pk=[113110]&titles=['Температура (°C)', 'Пульс', 'Давление']
    """
    num_dir = json.loads(request_data["hosp_pks"])
    direction_obj = Napravleniya.objects.get(pk=num_dir[0])
    hosp_nums_obj = hosp_get_hosp_direction(num_dir[0])
    hosp_nums = ''
    for i in hosp_nums_obj:
        hosp_nums = hosp_nums + ' - ' + str(i.get('direction'))

    ind_card = direction_obj.client
    patient_data = ind_card.get_data_individual()

    if sys.platform == 'win32':
        locale.setlocale(locale.LC_ALL, 'rus_rus')
    else:
        locale.setlocale(locale.LC_ALL, 'ru_RU.UTF-8')

    pdfmetrics.registerFont(
        TTFont('PTAstraSerifBold',
               os.path.join(FONTS_FOLDER, 'PTAstraSerif-Bold.ttf')))
    pdfmetrics.registerFont(
        TTFont('PTAstraSerifReg',
               os.path.join(FONTS_FOLDER, 'PTAstraSerif-Regular.ttf')))

    buffer = BytesIO()
    doc = SimpleDocTemplate(buffer,
                            pagesize=landscape(A4),
                            leftMargin=15 * mm,
                            rightMargin=5 * mm,
                            topMargin=13 * mm,
                            bottomMargin=10 * mm,
                            allowSplitting=1,
                            title="Форма {}".format("Лист показателей"))
    width, height = landscape(A4)
    styleSheet = getSampleStyleSheet()
    style = styleSheet["Normal"]
    style.fontName = "PTAstraSerifReg"
    style.fontSize = 12
    style.leading = 15
    style.spaceAfter = 0.5 * mm
    styleBold = deepcopy(style)
    styleBold.fontName = "PTAstraSerifBold"
    styleCenter = deepcopy(style)
    styleCenter.alignment = TA_CENTER
    styleCenter.fontSize = 12
    styleCenter.leading = 15
    styleCenter.spaceAfter = 1 * mm
    styleCenterBold = deepcopy(styleBold)
    styleCenterBold.alignment = TA_CENTER
    styleCenterBold.fontSize = 12
    styleCenterBold.leading = 15
    styleCenterBold.face = 'PTAstraSerifBold'
    styleCenterBold.borderColor = black
    styleJustified = deepcopy(style)
    styleJustified.alignment = TA_JUSTIFY
    styleJustified.spaceAfter = 4.5 * mm
    styleJustified.fontSize = 12
    styleJustified.leading = 4.5 * mm

    objs = []

    styleT = deepcopy(style)
    styleT.alignment = TA_LEFT
    styleT.fontSize = 10
    styleT.leading = 4.5 * mm
    styleT.face = 'PTAstraSerifReg'

    if patient_data['age'] < SettingManager.get(
            "child_age_before", default='15', default_type='i'):
        patient_data['serial'] = patient_data['bc_serial']
        patient_data['num'] = patient_data['bc_num']
    else:
        patient_data['serial'] = patient_data['passport_serial']
        patient_data['num'] = patient_data['passport_num']

    card_num_obj = patient_data['card_num'].split(' ')
    p_card_num = card_num_obj[0]

    title_page = [
        Indenter(left=0 * mm),
        Spacer(1, 2 * mm),
        Paragraph(
            '<font fontname="PTAstraSerifBold" size=13>Показатели жизненно важных функций</font><br/>',
            styleCenter),
        Paragraph(
            '({} № {} {})'.format(patient_data['fio'], p_card_num, hosp_nums),
            styleCenter),
    ]
    objs.extend(title_page)
    objs.append(Spacer(1, 3 * mm))

    result = get_temperature_list(num_dir[0])
    titles = json.loads(request_data["titles"])
    count_in_graph = 26
    if 'Температура (°C)' in titles and 'Температура (°C)' in result:
        result_data = result['Температура (°C)']
        min_max = result_data['min_max']
        count_param = count_len_param(result_data, count_in_graph)
        for i in range(count_param):
            elements = count_graph_el(count_in_graph, result_data)
            temp_obj = [
                Paragraph(' <u>Температура (°C)</u>', style),
                Spacer(1, 2 * mm),
                draw_temper_pulse(
                    {
                        'data': elements[0],
                        'xtext': elements[1],
                        'min_max': min_max
                    }, 1, 250 * mm, 27 * mm),
                Spacer(1, 10 * mm),
            ]
            objs.append(KeepTogether(temp_obj))

    if 'Пульс (уд/с)' in titles and 'Пульс (уд/с)' in result:
        result_data = result['Пульс (уд/с)']
        min_max = result_data['min_max']
        count_param = count_len_param(result_data, count_in_graph)
        for i in range(count_param):
            elements = count_graph_el(count_in_graph, result_data)
            temp_obj = [
                Paragraph(' <u>Пульс (уд/с)</u>', style),
                Spacer(1, 2 * mm),
                draw_temper_pulse(
                    {
                        'data': elements[0],
                        'xtext': elements[1],
                        'min_max': min_max
                    }, 10, 250 * mm, 27 * mm),
                Spacer(1, 10 * mm),
            ]
            objs.append(KeepTogether(temp_obj))

    diastolic = 'Диастолическое давление (мм рт.с)'
    systolic = 'Диастолическое давление (мм рт.с)'
    if 'Давление' in titles and diastolic in result and systolic in result:
        result_data = {
            diastolic: result[diastolic],
            systolic: result[systolic]
        }
        min_max_diastolic = result_data[diastolic]['min_max']
        min_max_systolic = result_data[systolic]['min_max']
        count_param = count_len_param(result_data[diastolic], count_in_graph)
        for i in range(count_param):
            elements = count_graph_el_pressure(count_in_graph, result_data,
                                               diastolic, systolic,
                                               min_max_diastolic,
                                               min_max_systolic)
            temp_obj = [
                Paragraph(
                    '<u>Давление:</u> (<img src="forms/img/squreline.png" width="20" height="10" />  систолическое, '
                    '<img src="forms/img/strokedot.png" width="20" height="10" />  диастолическое)',
                    style,
                ),
                Spacer(1, 2 * mm),
                draw_pressure(elements, 10, 250 * mm, 45 * mm),
                Spacer(1, 10 * mm),
            ]
            objs.append(KeepTogether(temp_obj))
    doc.build(objs)
    pdf = buffer.getvalue()
    buffer.close()
    return pdf
コード例 #17
0
ファイル: forms102.py プロジェクト: moodpulse/l2
def form_02(direction, iss: Issledovaniya, fwb, doc, leftnone, user=None):
    # ПАТОЛОГО-АНАТОМИЧЕСКОЕ заключение
    styleSheet = getSampleStyleSheet()
    style = styleSheet["Normal"]
    style.fontName = "FreeSans"
    style.fontSize = 10
    style.alignment = TA_JUSTIFY

    style_ml = deepcopy(style)
    style_ml.leftIndent = 5 * mm
    style_ml.spaceAfter = 0.5 * mm

    styleBold = deepcopy(style)
    styleBold.fontName = "FreeSansBold"

    hospital_name = SettingManager.get("org_title")
    hospital_address = SettingManager.get("org_address")
    hospital_kod_ogrn = SettingManager.get("org_ogrn")

    styleT = deepcopy(style)
    styleT.alignment = TA_LEFT
    styleT.fontSize = 10
    styleT.leading = 4.5 * mm

    opinion = [
        [
            Paragraph(f'<font size=10>{hospital_name}<br/>Адрес: {hospital_address}<br/>ОГРН: {hospital_kod_ogrn} <br/> </font>', styleT),
            Paragraph('<font size=9 >Медицинская документация <br/> Учетная форма № 014/1-у<br/>Утверждена приказом Минздрава России<br/>от 24 марта 2016г. № 179н</font>', styleT),
        ],
    ]

    tbl = Table(opinion, 2 * [100 * mm])
    tbl.setStyle(
        TableStyle(
            [
                ('GRID', (0, 0), (-1, -1), 0.75, colors.white),
                ('LEFTPADDING', (1, 0), (-1, -1), 35 * mm),
                ('LEFTPADDING', (0, 0), (0, -1), 15 * mm),
                ('VALIGN', (0, 0), (-1, -1), 'TOP'),
            ]
        )
    )

    fwb.append(tbl)
    fwb.append(Spacer(1, 5 * mm))

    history_num = ''
    if direction.parent and direction.parent.research.is_hospital:
        history_num = f"(cтационар-{str(direction.parent.napravleniye_id)})"

    styleCenterBold = deepcopy(style)
    styleCenterBold.alignment = TA_CENTER
    styleCenterBold.fontSize = 11.5
    styleCenterBold.leading = 15
    styleCenterBold.fontName = 'FreeSansBold'

    fwb.append(Paragraph(f'ПРОТОКОЛ № {direction.pk} {history_num} ', styleCenterBold))
    fwb.append(Paragraph('ПРИЖИЗНЕННОГО ПАТОЛОГО-АНАТОМИЧЕСКОГО<br/> ИССЛЕДОВАНИЯ БИОПСИЙНОГО (ОПЕРАЦИОННОГО) МАТЕРИАЛА', styleCenterBold))
    short_title = iss.research.short_title
    fwb.append(Paragraph(f'{short_title.upper()}', styleCenterBold))

    open_bold_tag = "<font face =\"FreeSansBold\">"
    close_tag_bold = "</font>"

    title_fields = [
        "Отделение направившее",
        "ФИО пациента",
        "Пол",
        "Дата рождения",
        "Полис ОМС",
        "СНИЛС",
        "Место регистрации",
        "Местность",
        "Диагноз по направлению",
        "Код по МКБ из направления",
        "Дата забора",
        "Время забора",
        "Материал в 10% растворе",
        "Загрязнен",
        "Дата поступления",
        "Время поступления",
        "Сохранность упаковки",
        "Дата регистрации",
        "Время регистрации",
        "Регистрационный номер",
        "Медицинские услуги",
        "Категория сложности",
        "Дата вырезки",
        "Время вырезки",
        "В проводку взято",
        "Окраски",
        "Макроскопическое описание",
        "Микроскопическое описание",
        "Заключение",
        "Код по МКБ",
        "Комментарии к заключению и рекомендации",
        "Врач-консультант",
    ]
    result = fields_result_only_title_fields(iss, title_fields, False)
    data = {}
    for i in result:
        data[i["title"]] = i["value"]

    if not data.get("Отделение направившее"):
        data["Отделение направившее"] = "не указано"

    if not data.get("Макроскопическое описание"):
        data["Макроскопическое описание"] = ""

    if not data.get("Микроскопическое описание"):
        data["Микроскопическое описание"] = ""

    if not data.get("Заключение"):
        data["Заключение"] = ""

    if not data.get("Комментарии к заключению и рекомендации"):
        data["Комментарии к заключению и рекомендации"] = ""

    if not data.get("Врач-консультант"):
        data["Врач-консультант"] = ""

    fwb.append(Spacer(1, 4 * mm))
    fwb.append(Paragraph(f'{open_bold_tag}1. Отделение, направившее биопсийный (операционный) материал:{close_tag_bold}{data["Отделение направившее"]}', style_ml))
    fwb.append(Paragraph(f'{open_bold_tag}2. Фамилия, имя, отчество (при наличии) пациента:{close_tag_bold} {data["ФИО пациента"]}', style_ml))
    if data["Пол"] == "м":
        sex = f'{data["Пол"]}-1'
    else:
        sex = f'{data["Пол"]}-2'
    space_symbol = '&nbsp;'
    fwb.append(Paragraph(f'{open_bold_tag}3. Пол:{close_tag_bold} {sex}, {space_symbol * 5} {open_bold_tag}4. Дата рождения:{close_tag_bold} {data["Дата рождения"]}', style_ml))
    if not data.get("Полис ОМС"):
        data["Полис ОМС"] = ""
    if not data.get("СНИЛС"):
        data["СНИЛС"] = ""
    fwb.append(Paragraph(f'{open_bold_tag}5. Полис ОМС:{close_tag_bold}{data["Полис ОМС"]} {space_symbol * 4} {open_bold_tag}6. СНИЛС:{close_tag_bold} {data["СНИЛС"]}', style_ml))
    data_address = json.loads(data["Место регистрации"])
    fwb.append(Paragraph(f'{open_bold_tag}7. Место регистрации:{close_tag_bold} {data_address["address"]}', style_ml))
    place = json.loads(data["Местность"])
    if place["code"] == "1":
        place_fact = "городская — 1"
    else:
        place_fact = "сельская — 2"
    fwb.append(Paragraph(f'{open_bold_tag}8. Местность:{close_tag_bold} {place_fact}', style_ml))
    fwb.append(Paragraph(f'{open_bold_tag}9. Диагноз заболевания (состояния) по данным направления:{close_tag_bold} {data["Диагноз по направлению"]}', style_ml))
    direction_mkb = json.loads(data["Код по МКБ из направления"])
    fwb.append(Paragraph(f'{open_bold_tag}10. Код по МКБ:{close_tag_bold} {direction_mkb["code"]}', style_ml))
    fwb.append(
        Paragraph(
            f'{open_bold_tag}11. Дата забора материала по данным направления:{close_tag_bold} {space_symbol * 2}{normalize_date(data["Дата забора"])} {space_symbol * 4} '
            f'{open_bold_tag}время{close_tag_bold} {data["Время забора"]}',
            style_ml,
        )
    )
    fwb.append(
        Paragraph(
            f'{open_bold_tag}12. Материал доставлен в 10%-ный раствор нейтрального формалина:{close_tag_bold} {space_symbol * 2}{data["Материал в 10% растворе"]} {space_symbol * 4} '
            f'{open_bold_tag}загрязнен {close_tag_bold} {data["Загрязнен"]}',
            style_ml,
        )
    )
    fwb.append(
        Paragraph(
            f'{open_bold_tag}13. Дата поступления биопсийного (операционного) материала:{close_tag_bold} {space_symbol * 2}{normalize_date(data["Дата поступления"])} {space_symbol * 4}'
            f'{open_bold_tag}время{close_tag_bold} {data["Время поступления"]}',
            style_ml,
        )
    )
    fwb.append(Paragraph(f'{open_bold_tag}14. Отметка о сохранности упаковки:{close_tag_bold} {space_symbol * 2}{data["Сохранность упаковки"]}', style_ml))
    fwb.append(
        Paragraph(
            f'{open_bold_tag}15. Дата регистрации биопсийного (операционного) материала:{close_tag_bold} {space_symbol * 2}{normalize_date(data["Дата регистрации"])} {space_symbol * 4}'
            f'{open_bold_tag}время{close_tag_bold} {data["Время регистрации"]}',
            style_ml,
        )
    )
    fwb.append(Paragraph(f'{open_bold_tag}16. Регистрационный номер:{close_tag_bold} {space_symbol * 2}{data["Регистрационный номер"]}', style_ml))
    med_service = json.loads(data["Медицинские услуги"])
    fwb.append(Paragraph(f'{open_bold_tag}17. Медицинские услуги:{close_tag_bold} {space_symbol * 2}{med_service["code"]} {med_service["title"]}', style_ml))
    category = json.loads(data["Категория сложности"])
    fwb.append(Paragraph(f'{open_bold_tag}18. Категория сложности:{close_tag_bold} {space_symbol * 2}{category["title"]}', style_ml))
    fwb.append(
        Paragraph(
            f'{open_bold_tag}19. Вырезка проводилась:{close_tag_bold} {space_symbol * 2}{normalize_date(data["Дата вырезки"])} {space_symbol * 4} {open_bold_tag}время{close_tag_bold} '
            f'{data["Время вырезки"]} {open_bold_tag}20. В проводку взято:{close_tag_bold} {space_symbol * 2} {data["В проводку взято"]} объектов',
            style_ml,
        )
    )

    table_results = table_part_result(data["Окраски"])
    fwb.append(Paragraph(f'{open_bold_tag}21. Назначенные окраски (реакции, определения):{close_tag_bold}', style_ml))
    fwb.append(Indenter(left=5 * mm))
    fwb.append(table_results)
    fwb.append(Indenter(left=-5 * mm))
    fwb.append(Paragraph(f'{open_bold_tag}22. Макроскопическое описание:{close_tag_bold}', style_ml))
    fwb.append(Paragraph(f'{data["Макроскопическое описание"]}', style_ml))
    fwb.append(Paragraph(f'{open_bold_tag}23. Микроскопическое описание:{close_tag_bold}', style_ml))
    fwb.append(Paragraph(f'{data["Микроскопическое описание"]}', style_ml))
    result_mkb = json.loads(data["Код по МКБ"])
    fwb.append(Paragraph(f'{open_bold_tag}24. Заключение:{close_tag_bold} {space_symbol * 110} {open_bold_tag}25. Код по МКБ:{close_tag_bold} {result_mkb["code"]}', style_ml))
    fwb.append(Paragraph(f'{data["Заключение"]}', style_ml))
    fwb.append(Paragraph(f'{open_bold_tag}26. Комментарии к заключению и рекомендации:{close_tag_bold}', style_ml))
    fwb.append(Paragraph(f'{data["Комментарии к заключению и рекомендации"]}', style_ml))
    fwb.append(Paragraph(f'{open_bold_tag}27. Прижизненное патолого-анатомическое исследование выполнили:{close_tag_bold}', style_ml))
    fwb.append(Spacer(1, 3 * mm))
    tbl = gen_table("Врач-патологоанатом", iss.doc_confirmation_fio, styleT, iss.doc_confirmation)
    fwb.append(tbl)
    fwb.append(Spacer(1, 7 * mm))
    tbl = gen_table("Врач-специалист, <br/>осуществляющий консультирование", data["Врач-консультант"], styleT)
    fwb.append(tbl)
    fwb.append(Spacer(1, 3 * mm))
    date_str = pytils.dt.ru_strftime(u"%d %B %Y", inflected=True, date=iss.medical_examination)
    fwb.append(Paragraph(f'{open_bold_tag}28. Дата проведения прижизненного патолого-анатомического исследования:{close_tag_bold} {date_str} г.', style_ml))

    return fwb
コード例 #18
0
    def create_claims(self):
        """"""
        fsize = 8

        ptext = '<font size=26>Your claims up close</font>'
        p = Paragraph(ptext, self.styles["Normal"])
        self.elements.append(p)
        self.elements.append(Spacer(1, 20))

        claim = Paragraph(
            '''<font size={0}>
            Claim ID {1}<br/>
            Received on 12/12/16<br/></font>
            '''.format(fsize, 'ER123456789'), self.styles["Normal"])
        billed = Paragraph(
            '<font size={}>Amount<br/>billed</font>'.format(fsize),
            self.styles["Normal"])
        member_rate = Paragraph(
            '<font size={}>Member<br/>rate</font>'.format(fsize),
            self.styles["Normal"])
        pending = Paragraph(
            '<font size={}>Pending or<br/>not payable<br/>(Remarks)</font>'.
            format(fsize), self.styles["Normal"])
        applied = Paragraph(
            '<font size={}>Applied to<br/>deductible</font>'.format(fsize),
            self.styles["Normal"])
        copay = Paragraph('<font size={}>Your<br/>copay</font>'.format(fsize),
                          self.styles["Normal"])
        remaining = Paragraph(
            '<font size={}>Amount<br/>remaining</font>'.format(fsize),
            self.styles["Normal"])
        plan_pays = Paragraph(
            '<font size={}>Plan<br/>pays</font>'.format(fsize),
            self.styles["Normal"])
        coins = Paragraph(
            '<font size={}>Your<br/>coinsurance</font>'.format(fsize),
            self.styles["Normal"])
        owe = Paragraph(
            '<font size={}>You owe<br/>C+D+E+H=I</font>'.format(fsize),
            self.styles["Normal"])

        claim_one = [
            self.create_text('FLU VIRUS VACC-SPLIT 3 YR & on 9/12/16'),
            self.create_text('12.50'), '', '', '', '',
            self.create_text('12.50'),
            self.create_text('12.50 (100%)'), '', ''
        ]

        data = [
            [
                claim, billed, member_rate, pending, applied, copay, remaining,
                plan_pays, coins, owe
            ],
        ]
        for item in range(50):
            data.append(claim_one)

        colWidths = [110, 50, 50, 60, 50, 50, 50, 40, 60, 60]
        table = Table(data, colWidths=colWidths)

        self.elements.append(Indenter(left=60))
        self.elements.append(table)
        self.elements.append(Indenter(left=-60))
コード例 #19
0
    def create_claims(self):
        """"""
        fsize = 7.5

        ptext = 'Your claims up close'
        p = Paragraph(ptext, self.styles["Heading1"])
        self.elements.append(p)
        self.elements.append(Spacer(1, 20))

        claim = Paragraph(
            '''<font size={fsize}>
                Claim ID {claim_id}<br/>
                Received on {received_date}<br/></font>
                '''.format(fsize=fsize,
                           claim_id=self.data.claim_id,
                           received_date=self.data.received_date),
            self.styles["Normal"])

        billed = Paragraph(
            '<font size={}>Amount<br/>billed</font>'.format(fsize),
            self.styles["Normal"])
        member_rate = Paragraph(
            '<font size={}>Member<br/>rate</font>'.format(fsize),
            self.styles["Normal"])
        pending = Paragraph(
            '<font size={}>Pending or<br/>not payable<br/>(Remarks)</font>'.
            format(fsize), self.styles["Normal"])
        applied = Paragraph(
            '<font size={}>Applied to<br/>deductible</font>'.format(fsize),
            self.styles["Normal"])
        copay = Paragraph('<font size={}>Your<br/>copay</font>'.format(fsize),
                          self.styles["Normal"])
        remaining = Paragraph(
            '<font size={}>Amount<br/>remaining</font>'.format(fsize),
            self.styles["Normal"])
        plan_pays = Paragraph(
            '<font size={}>Plan<br/>pays</font>'.format(fsize),
            self.styles["Normal"])
        coins = Paragraph(
            '<font size={}>Your<br/>coinsurance</font>'.format(fsize),
            self.styles["Normal"])
        owe = Paragraph(
            '<font size={}>You owe<br/>C+D+E+H=I</font>'.format(fsize),
            self.styles["Normal"])

        data = [
            [
                claim, billed, member_rate, pending, applied, copay, remaining,
                plan_pays, coins, owe
            ],
        ]

        for claim in self.data.claims.getchildren():
            data.append([
                self.create_text(claim.description),
                self.create_text(claim.amount_billed.text),
                self.create_text(claim.member_rate),
                self.create_text(claim.pending),
                self.create_text(claim.deductible),
                self.create_text(claim.copay),
                self.create_text(claim.amount_remaining.text),
                self.create_text(claim.plan_pays.text),
                self.create_text(claim.coinsurance),
                self.create_text(claim.total_owed.text)
            ])

        colWidths = [110, 50, 40, 60, 50, 40, 50, 40, 55, 60]
        table_style = TableStyle([
            ('INNERGRID', (0, 0), (-1, -1), 0.25,
             colors.black),  # Add grid to cells
            ('BOX', (0, 0), (-1, -1), 0.25, colors.black),  # add outer border
            ('BACKGROUND', (1, 0), (1, -1), colors.lightgoldenrodyellow),
            ('BACKGROUND', (7, 0), (7, -1), colors.lightgoldenrodyellow)
        ])

        table = Table(data, colWidths=colWidths)
        table.setStyle(table_style)

        self.elements.append(Indenter(left=40))
        self.elements.append(table)
        self.elements.append(Indenter(left=-40))
コード例 #20
0
    def export(self, filename, data_align='LEFT', table_halign='LEFT'):
        """
        Export the data to a PDF file.
        
        Arguments:
            filename - The filename for the generated PDF file.
            data_align - The alignment of the data inside the table (eg.
                'LEFT', 'CENTER', 'RIGHT')
            table_halign - Horizontal alignment of the table on the page
                (eg. 'LEFT', 'CENTER', 'RIGHT')
        """
        doc = SimpleDocTemplate(filename,
                                pagesize=self.formato,
                                leftMargin=self.leftMrg,
                                rightMargin=self.rightMrg,
                                topMargin=self.topMrg,
                                bottomMargin=self.bottomMrg)
        #        doc = BaseDocTemplate("C:/Users/Isr/git/MyDev/SpatialControls/Main/ReportTemplate.pdf",showBoundary=1,pagesize=landscape(letter))
        # for sample styleSheets http://eric.sau.pe/tag/reportlab-getsamplestylesheet/
        styles = getSampleStyleSheet()
        #         styleH = styles['Heading1']

        pdfmetrics.registerFont(TTFont('Arial', 'arial.ttf'))
        pdfmetrics.registerFont(
            TTFont('LiberationSans', 'LiberationSans-Regular.ttf'))
        pdfmetrics.registerFont(
            TTFont('LiberationSansBold', 'LiberationSans-Bold.ttf'))
        pdfmetrics.registerFont(
            TTFont('LiberationSansItalic', 'LiberationSans-Italic.ttf'))
        pdfmetrics.registerFont(
            TTFont('LiberationSansBoldItalic',
                   'LiberationSans-BoldItalic.ttf'))

        #stile_sottot=ParagraphStyle('Sottotitolo',parent=styles['Normal'],fontName='LiberationSansBold',fontSize=18,spaceBefore=20,spaceAfter=10,leftIndent=0,alignment=TA_CENTER,textColor=black)
        stile_intest = ParagraphStyle('Intestazione',
                                      parent=styles['Normal'],
                                      fontName='LiberationSansBold',
                                      fontSize=12,
                                      spaceBefore=8,
                                      spaceAfter=0,
                                      leftIndent=0,
                                      alignment=TA_CENTER,
                                      textColor=colors.darkgrey)
        stile_catego = ParagraphStyle('Categoria',
                                      parent=styles['Normal'],
                                      fontName='LiberationSansBold',
                                      fontSize=18,
                                      spaceBefore=20,
                                      spaceAfter=10,
                                      leftIndent=20,
                                      alignment=TA_LEFT,
                                      textColor=black)
        stile_gruppo = ParagraphStyle('Gruppo',
                                      parent=styles['Normal'],
                                      fontName='LiberationSansBoldItalic',
                                      fontSize=14,
                                      spaceBefore=12,
                                      spaceAfter=10,
                                      leftIndent=40,
                                      alignment=TA_LEFT,
                                      textColor=black)
        stile_err_ok = ParagraphStyle('Esito_err_ok',
                                      parent=styles['Normal'],
                                      fontName='LiberationSans',
                                      fontSize=10,
                                      spaceBefore=2,
                                      spaceAfter=0,
                                      leftIndent=60,
                                      alignment=TA_LEFT,
                                      textColor=colors.darkgreen)
        stile_err_dc = ParagraphStyle('Esito_err_desc',
                                      parent=styles['Normal'],
                                      fontName='LiberationSans',
                                      fontSize=10,
                                      spaceBefore=2,
                                      spaceAfter=0,
                                      leftIndent=60,
                                      alignment=TA_LEFT,
                                      textColor=colors.darkred)
        stile_err_id = ParagraphStyle('Esito_err_id',
                                      parent=styles['Normal'],
                                      fontName='LiberationSansItalic',
                                      fontSize=10,
                                      spaceBefore=1,
                                      spaceAfter=0,
                                      leftIndent=80,
                                      alignment=TA_LEFT,
                                      textColor=colors.darkred)
        stile_descri = ParagraphStyle('Descriz_ctrl',
                                      parent=styles['Normal'],
                                      fontName='LiberationSansItalic',
                                      fontSize=10,
                                      spaceBefore=1,
                                      spaceAfter=0,
                                      leftIndent=60,
                                      alignment=TA_LEFT,
                                      textColor=colors.darkgrey)

        story = []

        id_file_img = None

        if self.file_logo:
            path_to_file = self.file_logo
            #id_file_img = open(path_to_file, 'rb')
            ##img=Image(f,width=37.8*mm,height=13.9*mm)
            #img=Image(id_file_img)
            img = Image(path_to_file)
            fatt_larg = img.drawWidth / img.drawHeight
            img.drawHeight = 20.0 * mm
            img.drawWidth = 20.0 * mm * fatt_larg
            img.hAlign = 'CENTER'  #RIGHT
            story.append(img)
            #id_file_img.close()
#           story.append(Spacer(width=0, height=5*mm))

        if self.file_intestaz:
            path_to_file = self.file_intestaz
            f = open(path_to_file, 'r')
            linee_intest = f.readlines()
            story.append(Spacer(width=0, height=3 * mm))
            for linea in linee_intest:
                story.append(Paragraph(linea, stile_intest))
            f.close()

#       if self.title:
#           story.append(Paragraph(self.title, styleH))
#           story.append(Spacer(width=0, height=2*mm))

        story.append(Spacer(width=0, height=15 * mm))

        for intest in self.lst_intest:
            story.append(Indenter(left=intest['INDENT_MM'] * mm, right=0 * mm))
            story.append(Paragraph(intest['TESTO'], styles[intest['STILE']]))
            story.append(Spacer(width=0 * mm, height=intest['BELOW_MM'] * mm))
            story.append(Indenter(left=-intest['INDENT_MM'] * mm,
                                  right=0 * mm))

        story.append(Spacer(width=0 * mm, height=10 * mm))

        for rif_dati in self.lst_rif_dati:
            story.append(
                Indenter(left=rif_dati['INDENT_MM'] * mm, right=0 * mm))
            story.append(
                Paragraph(rif_dati['TESTO'], styles[rif_dati['STILE']]))
            story.append(Spacer(width=0 * mm,
                                height=rif_dati['BELOW_MM'] * mm))
            story.append(
                Indenter(left=-rif_dati['INDENT_MM'] * mm, right=0 * mm))

        story.append(Spacer(width=0 * mm, height=10 * mm))

        for info_sess in self.lst_info_sess:
            story.append(
                Indenter(left=info_sess['INDENT_MM'] * mm, right=0 * mm))
            story.append(
                Paragraph(info_sess['TESTO'], styles[info_sess['STILE']]))
            story.append(
                Spacer(width=0 * mm, height=info_sess['BELOW_MM'] * mm))
            story.append(
                Indenter(left=-info_sess['INDENT_MM'] * mm, right=0 * mm))

        story.append(Spacer(width=0 * mm, height=10 * mm))

        info_sess = self.lst_info_sess[0]  # per usare la stessa indentazione
        story.append(Indenter(left=info_sess['INDENT_MM'] * mm, right=0 * mm))
        str_out = 'Numero controlli previsti: ' + str(self.lst_num_ctrl[0])
        story.append(Paragraph(str_out, styles[info_sess['STILE']]))
        str_out = 'Numero controlli eseguiti: ' + str(self.lst_num_ctrl[1])
        story.append(Paragraph(str_out, styles[info_sess['STILE']]))
        story.append(Indenter(left=-info_sess['INDENT_MM'] * mm, right=0 * mm))

        story.append(PageBreak())

        #         converted_data = self.__convert_data()
        #         table = Table(converted_data, hAlign=table_halign)
        #         table.setStyle(TableStyle([
        #             ('FONT', (0, 0), (-1, 0), 'Helvetica-Bold'),
        #             ('ALIGN', (0, 0), (-1, 0), 'CENTER'),
        #             ('ALIGN',(0, 0),(0,-1), data_align),
        #             ('INNERGRID', (0, 0), (-1, -1), 0.50, colors.black),
        #             ('BOX', (0,0), (-1,-1), 0.25, colors.black),
        #         ]))
        #         story.append(table)
        #
        #         story.append(Spacer(width=0*mm, height=10*mm))
        #
        #         prova=[('Esito',),['pippo'],['pluto'],['paperino']]
        #         table=Table(prova, hAlign='CENTER')
        #         table.setStyle(TableStyle([
        #             ('FONT', (0, 0), (-1, 0), 'Helvetica-Bold'),
        #             ('ALIGN', (0, 0), (-1, 0), 'CENTER'),
        #             ('ALIGN',(0, 0),(0,-1), data_align),
        #             ('INNERGRID', (0, 0), (-1, -1), 0.50, colors.red),
        #             ('BOX', (0,0), (-1,-1), 0.25, colors.green),
        #             ('TEXTCOLOR', (0, 0), (-1,-1), colors.blue)
        #         ]))
        #         story.append(table)
        #
        #         story.append(PageBreak())

        row2 = self.data[0]

        lista_codmod_out = []

        is_res_ok = False
        if row2['ESITO_CTRL'].upper() == 'OK': is_res_ok = True

        descr_mod_pulita = self.togli_var_sign(row2['DES_MOD'])
        descr_mod_pulita += ' (vedi modello '
        descr_mod_pulita += row2['COD_MOD']
        descr_mod_pulita += ')'

        #story.append(Spacer(width=0*mm, height=5*mm))
        #story.append(Indenter(left=0*mm, right=0*mm))
        story.append(Paragraph(row2['DES_CAT'], stile_catego))
        #story.append(Spacer(width=0*mm, height=3*mm))
        #story.append(Indenter(left=2*mm, right=0*mm))
        #story.append(Paragraph('<font color="blue">' + row2['DES_GRP']+'</font>', stileGrp))
        story.append(Paragraph(row2['DES_GRP'], stile_gruppo))
        #story.append(Indenter(left=-2*mm, right=0*mm))
        #story.append(Spacer(width=0*mm, height=2*mm))
        #story.append(Indenter(left=4*mm, right=0*mm))
        if row2['DB_STATO'] != 0:
            story.append(
                Paragraph(
                    'errore in ' + row2['DES_CTRL'] + ': ' +
                    row2['DB_MSG_ERR'], stile_err_dc))
        else:
            if is_res_ok:  #(row2['ESITO_CTRL'].upper()=='OK')
                if self.out_if_ok:
                    if self.descr_out:
                        story.append(Paragraph(descr_mod_pulita, stile_descri))
                    story.append(
                        Paragraph(row2['DES_CTRL'] + ': ' + row2['ESITO_CTRL'],
                                  stile_err_ok))
            else:
                if self.descr_out:
                    story.append(Paragraph(descr_mod_pulita, stile_descri))
                story.append(Paragraph(row2['DES_CTRL'], stile_err_dc))
                #story.append(Indenter(left=-4*mm, right=0*mm))
                #if not is_res_ok: #(row2['ESITO_CTRL'].upper()!='OK')
                #    #story.append(Indenter(left=6*mm, right=0*mm))
                #    #story.append(Paragraph(row2['ESITO_CTRL'], styles['Heading4']))
                #    #story.append(Paragraph('<font face="times" color="red" size=10>' + ' ' + row2['ESITO_CTRL'] + ' ' + '</font>', styles['Normal']))
                #    story.append(Paragraph(row2['ESITO_CTRL'], stile_err_id))
                #    #story.append(Indenter(left=-6*mm, right=0*mm))
                story.append(Paragraph(row2['ESITO_CTRL'], stile_err_id))
            lista_codmod_out = [row2['COD_MOD']]

        for row1, row2 in zip(self.data, self.data[1:]):
            descr_mod_pulita = self.togli_var_sign(row2['DES_MOD'])
            descr_mod_pulita += ' (vedi modello '
            descr_mod_pulita += row2['COD_MOD']
            descr_mod_pulita += ')'

            if (row1['DES_CAT'] != row2['DES_CAT']):
                #story.append(Spacer(width=0*mm, height=5*mm))
                #story.append(Indenter(left=0*mm, right=0*mm))
                story.append(Paragraph(row2['DES_CAT'], stile_catego))
                lista_codmod_out = []
            if (row1['DES_GRP'] != row2['DES_GRP']):
                #story.append(Spacer(width=0*mm, height=3*mm))
                #story.append(Indenter(left=2*mm, right=0*mm))
                story.append(Paragraph(row2['DES_GRP'], stile_gruppo))
                #story.append(Indenter(left=-2*mm, right=0*mm))
                #story.append(Spacer(width=0*mm, height=2*mm))
                lista_codmod_out = []

            if row2['DB_STATO'] != 0:
                story.append(
                    Paragraph(
                        'errore in ' + row2['DES_CTRL'] + ': ' +
                        row2['DB_MSG_ERR'], stile_err_dc))
            else:
                is_res_ok = False
                if row2['ESITO_CTRL'].upper() == 'OK': is_res_ok = True

                if (row1['DES_CTRL'] != row2['DES_CTRL']):
                    #story.append(Indenter(left=4*mm, right=0*mm))
                    if is_res_ok:  #(row2['ESITO_CTRL'].upper()=='OK')
                        if self.out_if_ok:
                            if self.descr_out and row2[
                                    'COD_MOD'] not in lista_codmod_out:  #row1['COD_MOD']!=row2['COD_MOD']
                                story.append(
                                    Paragraph(descr_mod_pulita, stile_descri))
                                lista_codmod_out.append(row2['COD_MOD'])
                            story.append(
                                Paragraph(
                                    row2['DES_CTRL'] + ': ' +
                                    row2['ESITO_CTRL'], stile_err_ok))
                    else:
                        if self.descr_out and row2[
                                'COD_MOD'] not in lista_codmod_out:  #row1['COD_MOD']!=row2['COD_MOD']
                            story.append(
                                Paragraph(descr_mod_pulita, stile_descri))
                            lista_codmod_out.append(row2['COD_MOD'])
                        story.append(Paragraph(row2['DES_CTRL'], stile_err_dc))
                        max_err = row2['MAX_ERR']
                        num_err = row2['NUM_ERR']
                        if (num_err >= max_err):
                            wng_out = '***** ATTENZIONE: raggiunto il limite di ' + str(
                                max_err) + ' segnalazioni'
                            story.append(Paragraph(wng_out, stile_err_dc))
                    #story.append(Indenter(left=-4*mm, right=0*mm))

                if not is_res_ok:  #(row2['ESITO_CTRL'].upper()!='OK')
                    #story.append(Indenter(left=6*mm, right=0*mm))
                    #story.append(Paragraph('<font face="times" color="red" size=8>' + ' ' + row2['ESITO_CTRL'] + ' ' + '</font>', styles['Normal']))
                    story.append(Paragraph(row2['ESITO_CTRL'], stile_err_id))
                    #story.append(Indenter(left=-6*mm, right=0*mm))

        doc.build(story,
                  onFirstPage=self.addPageNumber,
                  onLaterPages=self.addPageNumber)
コード例 #21
0
ファイル: forms105.py プロジェクト: moodpulse/l2
def form_02(request_data):
    """
    Отдельный статталон по отдельному амбулаторному приему.
    Краткая форма - результата проткола. Учитываются те поля, к-рые имеют признак "для статталона"
    -------------------------------
    Вход: Направление.
    Выходные: форма

    в файле .....\Lib\site-packages\anytree\render.py
        class ContStyle(AbstractStyle):
        необходимое мотод super сделать так:(изменить символы)
                super(ContStyle, self).__init__(u'\u2063   ',
                                        u'\u2063   ',
                                        u'\u2063   ')
    """

    # получить направления
    ind_dir = json.loads(request_data["napr_id"])

    hospital_name = SettingManager.get("org_title")
    if sys.platform == 'win32':
        locale.setlocale(locale.LC_ALL, 'rus_rus')
    else:
        locale.setlocale(locale.LC_ALL, 'ru_RU.UTF-8')

    pdfmetrics.registerFont(
        TTFont('PTAstraSerifBold',
               os.path.join(FONTS_FOLDER, 'PTAstraSerif-Bold.ttf')))
    pdfmetrics.registerFont(
        TTFont('PTAstraSerifReg',
               os.path.join(FONTS_FOLDER, 'PTAstraSerif-Regular.ttf')))
    pdfmetrics.registerFont(
        TTFont('Symbola', os.path.join(FONTS_FOLDER, 'Symbola.ttf')))

    buffer = BytesIO()
    doc = SimpleDocTemplate(buffer,
                            pagesize=A4,
                            leftMargin=18 * mm,
                            rightMargin=5 * mm,
                            topMargin=6 * mm,
                            bottomMargin=6 * mm,
                            allowSplitting=1,
                            title="Форма {}".format("Статталон пациента"))
    width, height = portrait(A4)
    styleSheet = getSampleStyleSheet()
    style = styleSheet["Normal"]
    style.fontName = "PTAstraSerifReg"
    style.fontSize = 10
    style.leading = 12
    style.spaceAfter = 0.5 * mm

    styleBold = deepcopy(style)
    styleBold.fontName = "PTAstraSerifBold"

    styleCenter = deepcopy(style)
    styleCenter.alignment = TA_CENTER
    styleCenter.fontSize = 12
    styleCenter.leading = 10
    styleCenter.spaceAfter = 1 * mm

    styleCenterBold = deepcopy(styleBold)
    styleCenterBold.alignment = TA_CENTER
    styleCenterBold.fontSize = 12
    styleCenterBold.leading = 15
    styleCenterBold.face = 'PTAstraSerifBold'
    styleCenterBold.borderColor = black

    styleJustified = deepcopy(style)
    styleJustified.alignment = TA_JUSTIFY
    styleJustified.spaceAfter = 4.5 * mm
    styleJustified.fontSize = 12
    styleJustified.leading = 4.5 * mm

    objs = []

    styleT = deepcopy(style)
    styleT.alignment = TA_LEFT
    styleT.fontSize = 10
    styleT.leading = 4.5 * mm
    styleT.face = 'PTAstraSerifReg'

    for dir in ind_dir:
        obj_dir = Napravleniya.objects.get(pk=dir)
        ind_card = obj_dir.client
        patient_data = ind_card.get_data_individual()

        if patient_data['age'] < SettingManager.get(
                "child_age_before", default='15', default_type='i'):
            patient_data['serial'] = patient_data['bc_serial']
            patient_data['num'] = patient_data['bc_num']
        else:
            patient_data['serial'] = patient_data['passport_serial']
            patient_data['num'] = patient_data['passport_num']

        card_num_obj = patient_data['card_num'].split(' ')
        p_card_num = card_num_obj[0]
        if len(card_num_obj) == 2:
            p_card_type = '(' + str(card_num_obj[1]) + ')'
        else:
            p_card_type = ''

        space_symbol = '&nbsp;'

        # Добавить сведения о пациента
        content_title = [
            Indenter(left=0 * mm),
            Spacer(1, 1 * mm),
            Paragraph('{}'.format(hospital_name), styleCenterBold),
            Spacer(1, 2 * mm),
            Paragraph('<u>Статистический талон пациента</u>', styleCenter),
            Paragraph(
                '{}<font size=10>Карта № </font><font fontname="PTAstraSerifBold" size=10>{}</font><font size=10> из {}</font>'
                .format(3 * space_symbol, p_card_num,
                        p_card_type), styleCenter),
            Spacer(1, 2 * mm),
            Paragraph('<font size=11>Данные пациента:</font>', styleBold),
            Paragraph(
                "1. Фамилия, имя, отчество:&nbsp;  <font size=11.7 fontname ='PTAstraSerifBold'> {} </font> "
                .format(patient_data['fio']), style),
            Paragraph(
                '2. Пол: {} {} 3. Дата рождения: {}'.format(
                    patient_data['sex'], 3 * space_symbol,
                    patient_data['born']), style),
            Paragraph(
                '4. Место регистрации: {}'.format(
                    patient_data['main_address']), style),
            Paragraph(
                '5. Полис ОМС: серия {} №: {} {}'
                '6. СНИЛС: {}'.format(patient_data['oms']['polis_serial'],
                                      patient_data['oms']['polis_num'],
                                      13 * space_symbol,
                                      patient_data['snils']),
                style,
            ),
            Paragraph(
                '7. Наименование страховой медицинской организации: {}'.format(
                    patient_data['oms']['polis_issued']), style),
        ]

        objs.extend(content_title)

        # добавить данные об услуге
        objs.append(Spacer(1, 3 * mm))
        objs.append(
            Paragraph('<font size=11>Данные об услуге:</font>', styleBold))
        objs.append(Spacer(1, 1 * mm))

        obj_iss = Issledovaniya.objects.filter(napravleniye=obj_dir,
                                               parent_id=None).first()
        date_proto = utils.strfdatetime(obj_iss.time_confirmation, "%d.%m.%Y")

        opinion = [
            [
                Paragraph('Основная услуга', styleT),
                Paragraph(
                    '<font fontname="PTAstraSerifBold">{}</font> <font face="Symbola">\u2013</font> {}'
                    .format(obj_iss.research.code,
                            obj_iss.research.title), styleT),
            ],
            [
                Paragraph('Направление №', styleT),
                Paragraph('{}'.format(dir), styleT)
            ],
            [
                Paragraph('Дата протокола', styleT),
                Paragraph('{}'.format(date_proto), styleT)
            ],
        ]

        # Найти и добавить поля у к-рых флаг "for_talon". Отсортировано по 'order' (группа, поле)
        field_iss = ParaclinicResult.objects.filter(
            issledovaniye=obj_iss,
            field__for_talon=True).order_by('field__group__order',
                                            'field__order')

        for f in field_iss:
            v = f.value.replace("\n", "<br/>")
            field_type = f.get_field_type()
            if field_type == 1:
                vv = v.split('-')
                if len(vv) == 3:
                    v = "{}.{}.{}".format(vv[2], vv[1], vv[0])
            list_f = [[
                Paragraph(f.field.get_title(force_type=field_type), styleT),
                Paragraph(v, styleT)
            ]]
            opinion.extend(list_f)

        tbl = Table(opinion, colWidths=(60 * mm, 123 * mm))
        tbl.setStyle(
            TableStyle([
                ('GRID', (0, 0), (-1, -1), 1.0, colors.black),
                ('BOTTOMPADDING', (0, 0), (-1, -1), 1 * mm),
            ]))

        objs.append(tbl)

        # Заключительные положения
        objs.append(Spacer(1, 4 * mm))
        objs.append(
            Paragraph('<font size=11>Заключительные положения:</font>',
                      styleBold))
        objs.append(Spacer(1, 1 * mm))
        empty = '-'
        purpose = empty if not obj_iss.purpose else obj_iss.purpose
        outcome_illness = empty if not obj_iss.outcome_illness else obj_iss.outcome_illness
        result_reception = empty if not obj_iss.result_reception else obj_iss.result_reception
        diagnos = empty if not obj_iss.diagnos else obj_iss.diagnos

        opinion = [
            [
                Paragraph('Цель посещения', styleT),
                Paragraph('{}'.format(purpose), styleT)
            ],
            [
                Paragraph('Исход заболевания', styleT),
                Paragraph('{}'.format(outcome_illness), styleT)
            ],
            [
                Paragraph('Результат обращения', styleT),
                Paragraph('{}'.format(result_reception), styleT)
            ],
            [
                Paragraph('Основной диагноз', styleT),
                Paragraph('{}'.format(diagnos), styleT)
            ],
        ]

        tbl = Table(opinion, colWidths=(60 * mm, 123 * mm))
        tbl.setStyle(
            TableStyle([
                ('GRID', (0, 0), (-1, -1), 1.0, colors.black),
                ('BOTTOMPADDING', (0, 0), (-1, -1), 1 * mm),
            ]))
        objs.append(tbl)

        # Добавить Дополнительные услуги
        add_research = Issledovaniya.objects.filter(
            parent_id__napravleniye=obj_dir)
        if add_research:
            objs.append(Spacer(1, 3 * mm))
            objs.append(
                Paragraph('<font size=11>Дополнительные услуги:</font>',
                          styleBold))
            objs.append(Spacer(1, 1 * mm))
            for i in add_research:
                objs.append(
                    Paragraph(
                        '{} <font face="Symbola">\u2013</font> {}'.format(
                            i.research.code, i.research.title), style))

        objs.append(Spacer(1, 5 * mm))
        objs.append(
            HRFlowable(width=185 * mm,
                       thickness=0.7 * mm,
                       spaceAfter=1.3 * mm,
                       spaceBefore=0.5 * mm,
                       color=colors.black,
                       hAlign=TA_LEFT))
        objs.append(Paragraph('<font size=11>Лечащий врач:</font>', styleBold))
        objs.append(Spacer(1, 1 * mm))

        personal_code = ''
        doc_fio = ''
        if obj_iss.time_confirmation:
            personal_code = empty if not obj_iss.doc_confirmation or not obj_iss.doc_confirmation.personal_code else obj_iss.doc_confirmation.personal_code
            doc_fio = obj_iss.doc_confirmation_fio

        objs.append(
            Paragraph(
                '{} /_____________________/ {} Код врача: {} '.format(
                    doc_fio, 42 * space_symbol, personal_code), style))

        objs.append(Spacer(1, 5 * mm))

        # Получить структуру Направлений если, направление в Дереве не важно в корне в середине или в начале
        root_dir = tree_directions.root_direction(dir)
        num_iss = root_dir[-1][-2]
        tree_dir = tree_directions.tree_direction(num_iss)
        final_tree = {}
        pattern = re.compile('<font face=\"Symbola\" size=10>\u2713</font>')

        node_dir = Node("Структура направлений")
        for j in tree_dir:
            if not Researches.objects.get(pk=j[8]).is_hospital:
                continue
            if len(j[9]) > 47:
                research = j[9][:47] + '...'
            else:
                research = j[9]
            diagnos = '  --' + j[-2] if j[-2] else ""
            temp_s = f"{j[0]} - {research}. Создано {j[1]} в {j[2]} {diagnos}"
            if dir == j[0]:
                temp_s = f"{temp_s} -- <font face=\"Symbola\" size=10>\u2713</font>"
            if not j[3]:
                final_tree[j[5]] = Node(temp_s, parent=node_dir)
            else:
                final_tree[j[5]] = Node(temp_s, parent=final_tree.get(j[3]))

        counter = 0
        opinion = []
        for row in RenderTree(node_dir):
            counter += 1
            result = pattern.search(row.node.name)
            current_style = styleBold if result else styleT
            count_space = len(row.pre) // 2 * 2
            para = [
                Paragraph(
                    '{}{}'.format(space_symbol * count_space, row.node.name),
                    current_style)
            ]
            opinion.append(para)

        tbl = Table(opinion, colWidths=(190 * mm))
        tbl.setStyle(
            TableStyle([
                ('GRID', (0, 0), (-1, -1), 1.0, colors.white),
                ('BOTTOMPADDING', (0, 0), (-1, -1), 1 * mm),
            ]))
        objs.append(tbl)

        objs.append(PageBreak())

    doc.build(objs)
    pdf = buffer.getvalue()
    buffer.close()

    return pdf
コード例 #22
0
def form_02(request_data):
    """
    Форма 025/у - титульный лист амбулаторной карты
    Приказ Минздрава России от 15.12.2014 N 834н (ред. от 09.01.2018)
    """
    ind_card = Card.objects.get(pk=request_data["card_pk"])
    ind = ind_card.individual
    ind_doc = Document.objects.filter(individual=ind, is_active=True)

    hospital_name = SettingManager.get("org_title")
    hospital_address = SettingManager.get("org_address")
    hospital_kod_ogrn = SettingManager.get("org_ogrn", "<TODO:OGRN>")
    hospital_okpo = SettingManager.get("org_ogrn", "<TODO:OKPO>")

    individual_fio = ind.fio()
    individual_sex = ind.sex
    individual_date_born = ind.bd()

    document_passport = "Паспорт РФ"

    documents = forms_func.get_all_doc(ind_doc)
    document_passport_num = documents['passport']['num']
    document_passport_serial = documents['passport']['serial']
    document_passport_date_start = documents['passport']['date_start']
    document_passport_issued = documents['passport']['issued']
    document_polis = documents['polis']['num']
    document_snils = documents['snils']['num']

    indivudual_insurance_org = documents['polis']['issued']
    individual_benefit_code = "_________"

    ind_card_num = ind_card.number_with_type()
    ind_card_address = ind_card.main_address
    ind_card_phone = ", ".join(ind_card.get_phones())

    individual_work_organization = "Управление Федераньной службы по ветеринарному и фитосанитрному надзору по Иркутской области" \
                                   "и Усть-Ордынскому бурятскому автономному округу"  # реест организаций
    work_organization_okved = "91.5 - Обслуживание и ремонт компютерной и оргтехники, заправка картриджей" \
                              "обслуживание принтеров"
    individual_department = "отдел информационных технология, ораганизаци ремонта и обслуживания медицинского оборудования"
    individual_profession = "старший государственный таможенный инспектор"  # реест профессий

    if sys.platform == 'win32':
        locale.setlocale(locale.LC_ALL, 'rus_rus')
    else:
        locale.setlocale(locale.LC_ALL, 'ru_RU.UTF-8')

    pdfmetrics.registerFont(
        TTFont('PTAstraSerifBold',
               os.path.join(FONTS_FOLDER, 'PTAstraSerif-Bold.ttf')))
    pdfmetrics.registerFont(
        TTFont('PTAstraSerifReg',
               os.path.join(FONTS_FOLDER, 'PTAstraSerif-Regular.ttf')))
    # http://www.cnews.ru/news/top/2018-12-10_rossijskim_chinovnikam_zapretili_ispolzovat
    # Причина PTAstraSerif использовать

    buffer = BytesIO()
    individual_fio = ind.fio()
    individual_date_born = ind.bd()

    doc = SimpleDocTemplate(buffer,
                            pagesize=A4,
                            leftMargin=25 * mm,
                            rightMargin=5 * mm,
                            topMargin=6 * mm,
                            bottomMargin=6 * mm,
                            allowSplitting=1,
                            title="Форма {}".format("025/у"))
    width, height = portrait(A4)
    styleSheet = getSampleStyleSheet()
    style = styleSheet["Normal"]
    style.fontName = "PTAstraSerifReg"
    style.fontSize = 10
    style.leading = 12
    style.spaceAfter = 0.5 * mm
    styleBold = deepcopy(style)
    styleBold.fontName = "PTAstraSerifBold"
    styleCenter = deepcopy(style)
    styleCenter.alignment = TA_CENTER
    styleCenter.fontSize = 12
    styleCenter.leading = 15
    styleCenter.spaceAfter = 1 * mm
    styleCenterBold = deepcopy(styleBold)
    styleCenterBold.alignment = TA_CENTER
    styleCenterBold.fontSize = 12
    styleCenterBold.leading = 15
    styleCenterBold.face = 'PTAstraSerifBold'
    styleJustified = deepcopy(style)
    styleJustified.alignment = TA_JUSTIFY
    styleJustified.spaceAfter = 4.5 * mm
    styleJustified.fontSize = 12
    styleJustified.leading = 4.5 * mm

    objs = []

    styleT = deepcopy(style)
    styleT.alignment = TA_LEFT
    styleT.fontSize = 10
    styleT.leading = 4.5 * mm
    styleT.face = 'PTAstraSerifReg'

    opinion = [
        [
            Paragraph(
                '<font size=11>{}<br/>Адрес: {}<br/>ОГРН: {} </font>'.format(
                    hospital_name, hospital_address, hospital_kod_ogrn),
                styleT),
            Paragraph(
                '<font size=9 >Код формы по ОКУД:<br/>Код организации по ОКПО: 31348613<br/>'
                'Медицинская документация<br/>Учетная форма № 025/у</font>',
                styleT)
        ],
    ]

    tbl = Table(opinion, 2 * [90 * mm])

    tbl.setStyle(
        TableStyle([
            ('GRID', (0, 0), (-1, -1), 0.75, colors.white),
            ('LEFTPADDING', (1, 0), (-1, -1), 80),
            ('VALIGN', (0, 0), (-1, -1), 'TOP'),
        ]))

    objs.append(tbl)
    space_symbol = '&nbsp;'
    content_title = [
        Indenter(left=0 * mm),
        Spacer(1, 4 * mm),
        Paragraph(
            'МЕДИЦИНСКАЯ КАРТА ПАЦИЕНТА, <br/> ПОЛУЧАЮЩЕГО МЕДИЦИНСКУЮ ПОМОЩЬ В АМБУЛАТОРНЫХ УСЛОВИЯХ',
            styleCenter),
        Paragraph('{}№&nbsp;{}'.format(3 * space_symbol, ind_card_num),
                  styleCenterBold),
        Spacer(1, 2 * mm),
        Paragraph(
            '1.Дата заполнения медицинской карты: {}'.format(
                pytils.dt.ru_strftime(u"%d %B %Y",
                                      inflected=True,
                                      date=datetime.datetime.now())), style),
        Paragraph(
            "2. Фамилия, имя, отчество:<b> {} </b> ".format(individual_fio),
            style),
        Paragraph(
            '3. Пол: {} {} 4. Дата рождения: {}'.format(
                individual_sex, 3 * space_symbol, individual_date_born),
            style),
        Paragraph('5. Место регистрации: {}'.format(ind_card_address), style),
        Paragraph('тел. {}'.format(ind_card_phone), style),
        Paragraph('6. Местность: городская — 1, сельская — 2', style),
        Paragraph(
            '7. Полис ОМС: серия______№: {} {}'
            '8. СНИЛС: {}'.format(document_polis, 13 * space_symbol,
                                  document_snils), style),
        Paragraph(
            '9. Наименование страховой медицинской организации: {}'.format(
                indivudual_insurance_org), style),
        Paragraph(
            '10. Код категории льготы: {} {} 11. Документ: {} &nbsp; серия: {} &nbsp;&nbsp; №: {}'
            .format(individual_benefit_code, 35 * space_symbol,
                    document_passport, document_passport_serial,
                    document_passport_num), style),
        Paragraph(
            '12. Заболевания, по поводу которых осуществляется диспансерное наблюдение:',
            style),
        Spacer(1, 2 * mm),
    ]

    objs.extend(content_title)

    styleTCenter = deepcopy(styleT)
    styleTCenter.alignment = TA_CENTER
    styleTCenter.leading = 3.5 * mm

    opinion = [
        [
            Paragraph(
                '<font size=9>Дата начала диспансерного наблюдения </font>',
                styleTCenter),
            Paragraph(
                '<font size=9 >Дата прекращения диспансерного наблюдения</font>',
                styleTCenter),
            Paragraph('<font size=9 >Диагноз</font>', styleTCenter),
            Paragraph('<font size=9 >Код по МКБ-10</font>', styleTCenter),
            Paragraph('<font size=9 >Врач</font>', styleTCenter),
        ],
    ]
    for i in range(0, 5):
        para = ['', '', '', '', '']
        opinion.append(para)

    row_height = []
    for i in opinion:
        row_height.append(6 * mm)

    row_height[0] = None

    tbl = Table(opinion,
                colWidths=(27 * mm, 30 * mm, 75 * mm, 20 * mm, 27 * mm),
                rowHeights=row_height)

    tbl.setStyle(
        TableStyle([
            ('GRID', (0, 0), (-1, -1), 1.0, colors.black),
            ('VALIGN', (0, 0), (-1, 0), 'MIDDLE'),
        ]))

    objs.append(tbl)
    doc.build(objs)
    pdf = buffer.getvalue()
    buffer.close()
    return pdf
コード例 #23
0
    def treatment_report(treatment, treatment_cycle, goniometries, perimetries,
                         muscle_tests):
        """
        Returns the list of relevant results for the searched query
        """

        pdfmetrics.registerFont(TTFont('Vera', 'Vera.ttf'))
        pdfmetrics.registerFont(TTFont('VeraBd', 'VeraBd.ttf'))
        pdfmetrics.registerFont(TTFont('VeraIt', 'VeraIt.ttf'))
        pdfmetrics.registerFont(TTFont('VeraBI', 'VeraBI.ttf'))

        sample_style_sheet = getSampleStyleSheet()
        buffer = io.BytesIO()

        my_doc = SimpleDocTemplate(buffer,
                                   rightMargin=50,
                                   leftMargin=50,
                                   topMargin=100)

        title = ParagraphStyle(name='title',
                               parent=sample_style_sheet['Heading1'],
                               fontSize=18,
                               spaceAfter=15,
                               fontName='VeraBd')
        title_topic = ParagraphStyle(name='title_topic',
                                     parent=sample_style_sheet['Heading2'],
                                     spaceAfter=30,
                                     fontName='VeraBd')
        text_title_topic = ParagraphStyle(
            name='title_topic',
            parent=sample_style_sheet['Heading2'],
            leading=17,
            fontSize=13,
            fontName='VeraBd')
        subtitle_topic = ParagraphStyle(name='subtitle_topic',
                                        parent=sample_style_sheet['Heading3'],
                                        fontName='VeraBd')
        text = ParagraphStyle(name='text',
                              parent=sample_style_sheet['BodyText'],
                              fontSize=10,
                              alignment=TA_JUSTIFY,
                              fontName='Vera')
        text_topic = ParagraphStyle(name='text_topic',
                                    parent=sample_style_sheet['BodyText'],
                                    leading=25,
                                    fontSize=12,
                                    fontName='Vera')
        horizontal_text_topic = ParagraphStyle(
            name='text_topic',
            parent=sample_style_sheet['BodyText'],
            fontSize=12,
            fontName='Vera')

        chart = ReportService.BarChart([[treatment.pain_level]], ["Dor"],
                                       width=250,
                                       height=20,
                                       graph_x=30,
                                       graph_y=20,
                                       value_min=0,
                                       value_max=10,
                                       value_step=1)
        flowables = [Paragraph("Relatório de Tratamento", title)] + [Spacer(1, 0.40 * inch)] +\
                    treatment_cycle.report(title_topic, text_topic) + treatment.report(text_title_topic, text_topic,
                                                                                       text,
                                                                                       chart.horizontal_bar_graph())

        flowables += [PageBreak(), Paragraph("Perimetrias", title_topic)]
        for perimetry in perimetries:
            chart = ReportService.BarChart([[perimetry.size]], ["Tamanho"],
                                           width=350,
                                           height=30,
                                           graph_x=30,
                                           graph_y=-5,
                                           value_min=0,
                                           value_max=200,
                                           value_step=20)
            flowables += [Indenter("1cm")] + perimetry.report(subtitle_topic, horizontal_text_topic) + \
                         chart.horizontal_bar_graph() + [Indenter("-1cm"), Spacer(1, 0.60 * inch)]

        flowables += [PageBreak(), Paragraph("Testes Musculares", title_topic)]
        for muscle_test in muscle_tests:
            chart = ReportService.BarChart([[muscle_test.strength]], ["Força"],
                                           width=350,
                                           height=30,
                                           graph_x=30,
                                           graph_y=-5,
                                           value_min=0,
                                           value_max=5,
                                           value_step=1)
            flowables += [Indenter("1cm")] + muscle_test.report(subtitle_topic, horizontal_text_topic) + \
                         chart.horizontal_bar_graph() + [Indenter("-1cm"), Spacer(1, 0.60 * inch)]

        flowables += [PageBreak(), Paragraph("Goniometrias", title_topic)]
        page_break = False
        for goniometry in goniometries:
            chart_data = [[
                goniometry.min_abduction, goniometry.min_adduction,
                goniometry.min_flexion, goniometry.min_rotation,
                goniometry.min_extension
            ],
                          [
                              goniometry.max_abduction,
                              goniometry.max_adduction, goniometry.max_flexion,
                              goniometry.max_rotation, goniometry.max_extension
                          ]]
            chart = ReportService.BarChart(
                chart_data,
                ['Abdução', 'Adução', 'Flexão', 'Rotação', 'Extensão'],
                width=350,
                height=150,
                graph_x=30,
                graph_y=65,
                value_min=0,
                value_max=180,
                value_step=20)
            flowables += [Indenter("1cm")] + goniometry.report(subtitle_topic, horizontal_text_topic) + \
                         chart.vertical_bar_chart() + [Indenter("-1cm")]

            if page_break:
                flowables += [PageBreak()]

            page_break = not page_break

        my_doc.build(flowables,
                     onFirstPage=ReportService._header_footer,
                     onLaterPages=ReportService._header_footer)

        buffer.seek(0)

        return buffer