Skip to content

Commit

Permalink
Print result form pdf (#3129)
Browse files Browse the repository at this point in the history
* get title stamp in result form

* оценка качества qr-code

* метаинформация о пациенте

* api контроль доступа. Замена title на печатных формах

* декомпозиция результата печатной формы

* подготовка шаблонов бланка результата

* SELF_WATERMARKS

* Подготовка печати Результатов с доп листами и с любыми формами
urchinpro authored Oct 17, 2023

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
1 parent cf7a7c6 commit bb5d459
Showing 13 changed files with 1,095 additions and 549 deletions.
4 changes: 2 additions & 2 deletions api/laboratory/views.py
Original file line number Diff line number Diff line change
@@ -842,8 +842,8 @@ def receive_history(request):
"labs": ['Гистология'],
"researches": [x.research.title for x in Issledovaniya.objects.filter(napravleniye_id=n.pk)],
'isDirection': True,
'defect_text': n.defect_text,
'is_defect': n.is_defect,
'defect_text': "",
'is_defect': "",
}
)

1 change: 1 addition & 0 deletions api/models.py
Original file line number Diff line number Diff line change
@@ -33,6 +33,7 @@ class Application(models.Model):
decimal_places = models.PositiveIntegerField(default=4)
places_type = models.CharField(max_length=10, default=PLACES_FRACTION, choices=PLACES)
hospitals = models.ManyToManyField('hospitals.Hospitals', blank=True)
companies = models.ManyToManyField('contracts.Company', blank=True)
is_superuser = False
tube_work = models.BooleanField(default=False, help_text="Работа с номерами, пришедшими с анализатора как с номерами пробирок")
can_access_schedule = models.BooleanField(default=False, help_text="У приложения есть доступ к расписанию")
9 changes: 9 additions & 0 deletions contracts/models.py
Original file line number Diff line number Diff line change
@@ -66,6 +66,15 @@ def as_json(price):
json_data = {"id": price.id, "title": price.title, "start": price.date_start, "end": price.date_end, "company": company_id, "companyTitle": company_title}
return json_data

@staticmethod
def get_price_by_id_symbol_code(price_code, price_id):
price = None
if price_id:
price = PriceName.objects.filter(pk=price_id).first()
elif price_code:
price = PriceName.objects.filter(symbol_code=price_code).first()
return price


class PriceCoast(models.Model):
price_name = models.ForeignKey(PriceName, on_delete=models.DO_NOTHING, db_index=True)
1 change: 1 addition & 0 deletions directory/models.py
Original file line number Diff line number Diff line change
@@ -179,6 +179,7 @@ class Researches(models.Model):
RESULT_TITLE_FORMS = (
(0, 'По умолчанию'),
(10001, '100.01 - Выписка из амб карты'),
(10002, '100.02 - Клеше'),
)

CO_EXECUTOR_MODES = (
15 changes: 14 additions & 1 deletion hospitals/models.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import os
from typing import Optional

from django.core.mail import EmailMessage
@@ -6,7 +7,7 @@
from clients.models import Card
from directory.models import Researches
from hospitals.sql_func import search_hospitals
from laboratory.settings import EMAIL_HOST_USER
from laboratory.settings import EMAIL_HOST_USER, MEDIA_ROOT


class Hospitals(models.Model):
@@ -54,6 +55,8 @@ class Hospitals(models.Model):
hl7_receiver_appplication = models.CharField(max_length=55, blank=True, default=None, null=True, help_text='HL7 приложение получатель')
hl7_rule_file = models.CharField(max_length=60, null=True, blank=True, default="default.json", help_text="Название ф-ла правил HL7")
is_auto_transfer_hl7_file = models.BooleanField(default=False, blank=True, help_text='Автоматическая отправка файла в каталог', db_index=True)
title_stamp_executor = models.CharField(max_length=255, blank=True, null=True, default=None, help_text="Ссылка на заголовок Исполнителя - клеше")
title_stamp_customer = models.CharField(max_length=255, blank=True, null=True, default=None, help_text="Ссылка на заголовок Закачика - клеше")

@staticmethod
def get_default_hospital() -> Optional['Hospitals']:
@@ -121,6 +124,16 @@ def get_is_external_performing_organization():
hosp = Hospitals.objects.filter(hide=False, is_external_performing_organization=True)
return [{"id": h.id, "label": h.title} for h in hosp]

def get_title_stamp_executor_pdf(self):
if self.title_stamp_executor:
return os.path.join(MEDIA_ROOT, 'title_stamp_executor_pdf', self.title_stamp_executor)
return None

def get_title_stamp_customer_pdf(self):
if self.title_stamp_customer:
return os.path.join(MEDIA_ROOT, 'title_stamp_customer_pdf', self.title_stamp_customer)
return None

class Meta:
verbose_name = 'Больница'
verbose_name_plural = 'Больницы'
36 changes: 36 additions & 0 deletions integration_framework/common_func.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import directions.models as directions
from contracts.models import Company, PriceName
from hospitals.models import Hospitals
from django.test import Client as TC
import simplejson as json
@@ -19,6 +20,41 @@ def check_correct_hosp(request, oid_org):
return {"OK": True, "hospital": hospital}


def check_correct_hospital_company(request, ogrn):
if not ogrn:
return {"OK": False, "message": 'Должно быть указано ОГРН'}

hospital = Hospitals.objects.filter(ogrn=ogrn).first()
company = Company.objects.filter(ogrn=ogrn).first()
is_company = False
if company:
is_company = True
if not hospital and not company:
return {"OK": False, "message": 'Организация не найдена'}
if not is_company:
if not request.user.hospitals.filter(pk=hospital.pk).exists():
return {"OK": False, "message": 'Нет доступа в переданную организацию'}
else:
if not request.user.companies.filter(pk=company.pk).exists():
return {"OK": False, "message": 'Нет доступа в переданную компанию'}

return {"OK": True, "hospital": hospital, "company": company, "is_company": is_company}


def check_correct_hospital_company_for_price(request, price_code, price_id):
price = PriceName.get_price_by_id_symbol_code(price_code, price_id)
if not price:
return {"OK": False, "message": 'Нет прайса'}
if price and price.hospital:
if not request.user.hospitals.filter(pk=price.hospital.pk).exists():
return {"OK": False, "message": 'Нет доступа в переданную организацию'}
if price and price.company:
if not request.user.companies.filter(pk=price.company.pk).exists():
return {"OK": False, "message": 'Нет доступа в переданную компанию'}

return {"OK": True, "price": price}


def get_data_direction_with_param(direction_num):
direction: directions.Napravleniya = directions.Napravleniya.objects.select_related('istochnik_f', 'client', 'client__individual', 'client__base').get(pk=direction_num)
card = direction.client
3 changes: 2 additions & 1 deletion integration_framework/urls.py
Original file line number Diff line number Diff line change
@@ -56,5 +56,6 @@
path('register-emdr-id', views.register_emdr_id),
path('get-direction-pk-by-emdr-id', views.get_direction_pk_by_emdr_id),
path('get-value-field', views.get_value_field),
path('get-actual-price', views.get_actual_price),
path('get-price-data', views.get_price_data),
path('get-prices-by-date', views.get_prices_by_date),
]
62 changes: 54 additions & 8 deletions integration_framework/views.py
Original file line number Diff line number Diff line change
@@ -17,7 +17,7 @@
from api.stationar.stationar_func import desc_to_data
from api.views import mkb10_dict
from clients.utils import find_patient
from contracts.models import PriceCategory, PriceCoast
from contracts.models import PriceCategory, PriceCoast, PriceName
from directory.utils import get_researches_details, get_can_created_patient
from doctor_schedule.views import get_hospital_resource, get_available_hospital_plans, check_available_hospital_slot_before_save
from external_system.models import ArchiveMedicalDocuments, InstrumentalResearchRefbook
@@ -88,7 +88,7 @@
from utils.xh import check_type_research, short_fio_dots
from . import sql_if
from directions.models import DirectionDocument, DocumentSign, Issledovaniya, Napravleniya
from .common_func import check_correct_hosp, get_data_direction_with_param, direction_pdf_result
from .common_func import check_correct_hosp, get_data_direction_with_param, direction_pdf_result, check_correct_hospital_company, check_correct_hospital_company_for_price
from .models import CrieOrder, ExternalService
from laboratory.settings import COVID_RESEARCHES_PK
from .utils import get_json_protocol_data, get_json_labortory_data, check_type_file, legal_auth_get, author_doctor
@@ -3034,11 +3034,57 @@ def get_value_field(request):


@api_view(['POST'])
def get_actual_price(request):
def get_price_data(request):
request_data = json.loads(request.body)
type_fin = request_data.get("fin")
title_fin = directions.IstochnikiFinansirovaniya.objects.filter(pk=type_fin).first()
price = title_fin.contracts.price
data_price = PriceCoast.objects.filter(price_name=price)
result = [{"title": i.research.title, "shortTtile": i.research.short_title, "coast": i.coast} for i in data_price]
price_code = request_data.get("priceCode")
price_id = request_data.get("priceId")

token = request.headers.get("Authorization").split(" ")[1]
token_obj = Application.objects.filter(key=token).first()
result = []
if not token_obj.unlimited_access:
if not price_code and not price_id:
return {"OK": False, "message": 'priceCode или priceId должны быть переданы'}
check_permissions_price = check_correct_hospital_company_for_price(request, price_code, price_id)
if not check_permissions_price["OK"]:
return Response({"ok": False, 'message': check_permissions_price["message"]})
price = check_permissions_price["price"]
else:
price = PriceName.get_price_by_id_symbol_code(price_code, price_id)
if price:
data_price = PriceCoast.objects.filter(price_name=price)
result = [{"title": i.research.title, "shortTtile": i.research.short_title, "coast": i.coast} for i in data_price]
return Response({"data": result})


@api_view(['POST'])
def get_prices_by_date(request):
request_data = json.loads(request.body)
token = request.headers.get("Authorization").split(" ")[1]
token_obj = Application.objects.filter(key=token).first()
ogrn = request_data.get("ogrn" or '')
date = request_data.get("date" or '')
if not token_obj.unlimited_access:
check_permissions = check_correct_hospital_company(request, ogrn)
if not check_permissions["OK"]:
return Response({"ok": False, 'message': check_permissions["message"]})
hospital = check_permissions["hospital"]
company = check_permissions["company"]
is_company = check_permissions["is_company"]
if is_company:
prices = PriceName.objects.filter(company=company, date_start__lte=date, date_end__gte=date)
else:
prices = PriceName.objects.filter(hospital=hospital, date_start__lte=date, date_end__gte=date)
else:
prices = PriceName.objects.filter(date_start__lte=date, date_end__gte=date)

result = [
{
"id": i.pk,
"priceCode": i.symbol_code,
"title": i.title,
"dateStart": i.date_start,
"dateEnd": i.date_end,
} for i in prices]

return Response({"data": result})
4 changes: 4 additions & 0 deletions laboratory/settings.py
Original file line number Diff line number Diff line change
@@ -390,6 +390,10 @@ def __getitem__(self, item):
NEED_ORDER_DIRECTION_FOR_DEFAULT_HOSPITAL = False
USE_TFOMS_DISTRICT = False
NEED_RECIEVE_TUBE_TO_PUSH_ORDER = False
TITLE_RESULT_FORM_USE_HOSPITAL_STAMP = False
QR_CODE_ANKETA = ""
RESULT_LABORATORY_FORM = ""
SELF_WATERMARKS = ""

try:
from laboratory.local_settings import * # noqa: F403,F401
802 changes: 802 additions & 0 deletions results/laboratory_form.py

Large diffs are not rendered by default.

195 changes: 136 additions & 59 deletions results/prepare_data.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import pytz_deprecation_shim as pytz

import hospitals.models
from api.stationar.stationar_func import hosp_get_lab_iss, hosp_get_text
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
@@ -9,13 +11,13 @@
from copy import deepcopy
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
import os.path
from laboratory.settings import FONTS_FOLDER, TIME_ZONE
from laboratory.settings import FONTS_FOLDER, TIME_ZONE, TITLE_RESULT_FORM_USE_HOSPITAL_STAMP
from pyvirtualdisplay import Display
import imgkit
import sys
import directory.models as directory
import collections
from directions.models import ParaclinicResult, MicrobiologyResultCulture, TubesRegistration
from directions.models import ParaclinicResult, MicrobiologyResultCulture, TubesRegistration, Issledovaniya
import datetime
from appconf.manager import SettingManager
import simplejson as json
@@ -26,6 +28,7 @@
from utils.dates import normalize_date
from utils.xh import check_valid_square_brackets
from reportlab.platypus.flowables import HRFlowable
from laboratory.utils import strdate


def lab_iss_to_pdf(data1):
@@ -317,6 +320,77 @@ def html_to_pdf(file_tmp, r_value, pw, leftnone=False):
return i


def format_time_if_is_not_none_to_str(data_t):
if not data_t:
return ""
return data_t.strftime("%d.%m.%Y %H:%M")


def gen_hospital_stamp(direction):
pdfmetrics.registerFont(TTFont('PTAstraSerifBold', os.path.join(FONTS_FOLDER, 'PTAstraSerif-Bold.ttf')))
pdfmetrics.registerFont(TTFont('PTAstraSerifReg', os.path.join(FONTS_FOLDER, 'PTAstraSerif-Regular.ttf')))
styleSheet = getSampleStyleSheet()
styleBold = styleSheet["Normal"]
styleBold.fontName = "PTAstraSerifBold"
styleBold.fontSize = 10
styleBold.leading = 10
styleBold.spaceAfter = 0 * mm
styleBold.alignment = TA_JUSTIFY

stylePatient = deepcopy(styleBold)
stylePatient.fontSize = 12

styleText = deepcopy(styleBold)
styleText.fontName = "PTAstraSerifReg"

img = None
file_jpg = None
hospital = direction.hospital
if hospital and hospital.title_stamp_customer:
file_jpg = hospital.get_title_stamp_customer_pdf()
else:
hospital = hospitals.models.Hospitals.objects.filter(is_default=True).first()
if hospital.title_stamp_executor:
file_jpg = hospital.get_title_stamp_executor_pdf()
if file_jpg:
img = Image(
file_jpg,
185 * mm,
27 * mm,
)
individual_birthday = f'({strdate(direction.client.individual.birthday)})'
i = Issledovaniya.objects.filter(napravleniye=direction).first()
sample = TubesRegistration.objects.filter(issledovaniya=i, time_get__isnull=False).first()
date_time_get = format_time_if_is_not_none_to_str(sample.time_get_local) if sample else ""
date_time_receive = format_time_if_is_not_none_to_str(sample.time_recive_local) if sample else ""
data_get = ""
data_receive = ""
if i.research.podrazdeleniye and i.research.podrazdeleniye.p_type == 2:
data_get = Paragraph(f"Дата, время взятия биоматериала: {date_time_get}", styleText)
data_receive = Paragraph(f"Дата, время доставки биоматериала в КДЛ: {date_time_receive}", styleText)

space_symbol = ' '
opinion = [
[img, ''],
[Paragraph(direction.client.individual.fio(), stylePatient), Paragraph(f"Индивидуальный номер заказа: {space_symbol * 2}{direction.pk}", stylePatient)],
['', ''],
[Paragraph(f"Пол/Возраст: {direction.client.individual.sex} / {individual_birthday} {direction.client.individual.age_s(direction=direction)}", styleBold), data_get],
[Paragraph(f"Медкарта: {direction.client.number}", styleBold), data_receive],
[Paragraph(f"Заказчик: {direction.hospital.safe_short_title}", styleBold), Paragraph("", styleText)],
]
gentbl = Table(opinion, colWidths=(90 * mm, 110 * mm), hAlign='LEFT')
gentbl.setStyle(
TableStyle(
[
('VALIGN', (0, 0), (-1, -1), 'BOTTOM'),
('BOTTOMPADDING', (0, 0), (-1, -1), -0.5 * mm),
]
)
)

return gentbl


def default_title_result_form(direction, doc, date_t, has_paraclinic, individual_birthday, number_poliklinika, logo_col_func, is_extract):
styleSheet = getSampleStyleSheet()
style = styleSheet["Normal"]
@@ -344,68 +418,71 @@ def default_title_result_form(direction, doc, date_t, has_paraclinic, individual
styleTableSm = deepcopy(styleTable)
styleTableSm.fontSize = 4

data = [
["Номер:", str(direction.pk)],
["Пациент:", Paragraph(direction.client.individual.fio(), styleTableMonoBold)],
["Пол:", direction.client.individual.sex],
["Возраст:", "{} {}".format(direction.client.individual.age_s(direction=direction), individual_birthday)],
]
if not direction.is_external:
data += [["Дата забора:", date_t]] if not has_paraclinic else [["Диагноз:", direction.diagnos]]
data += [
[Paragraph(' ', styleTableSm), Paragraph(' ', styleTableSm)],
["РМИС ID:" if direction.client.base.is_rmis else "№ карты:", direction.client.number_with_type() + (" - архив" if direction.client.is_archive else "") + number_poliklinika],
if not TITLE_RESULT_FORM_USE_HOSPITAL_STAMP:
data = [
["Номер:", str(direction.pk)],
["Пациент:", Paragraph(direction.client.individual.fio(), styleTableMonoBold)],
["Пол:", direction.client.individual.sex],
["Возраст:", "{} {}".format(direction.client.individual.age_s(direction=direction), individual_birthday)],
]
if not direction.is_external:
data += [["Дата забора:", date_t]] if not has_paraclinic else [["Диагноз:", direction.diagnos]]
data += [
[Paragraph(' ', styleTableSm), Paragraph(' ', styleTableSm)],
["РМИС ID:" if direction.client.base.is_rmis else "№ карты:", direction.client.number_with_type() + (" - архив" if direction.client.is_archive else "") + number_poliklinika],
]

if direction.is_external and direction.hospital:
data.append(["Организация:", direction.hospital.safe_short_title])
if direction.id_in_hospital is not None:
data += [["Номер в организации:", direction.id_in_hospital]]
if direction.is_external and direction.hospital:
data.append(["Организация:", direction.hospital.safe_short_title])
if direction.id_in_hospital is not None:
data += [["Номер в организации:", direction.id_in_hospital]]
else:
data += [["", ""]]
tube = TubesRegistration.objects.filter(issledovaniya__napravleniye=direction).first()
if tube and (tube.time_get or tube.time_recive):
data += [["Забор биоматериала:", strfdatetime((tube.time_get or tube.time_recive), "%d.%m.%Y %H:%M")]]
elif not direction.imported_from_rmis and not is_extract and direction.doc:
data.append(["Врач:", "<font>%s<br/>%s</font>" % (direction.doc.get_fio(), direction.get_doc_podrazdeleniye_title())])
elif direction.imported_org:
data.append(["<font>Направляющая<br/>организация:</font>", direction.imported_org.title])
rows = len(data)

logo_col = logo_col_func(direction)

data = [[Paragraph(y, styleTableMono) if isinstance(y, str) else y for y in data[xi]] + [logo_col[xi]] for xi in range(rows)]
if direction.is_external:
colWidths = [40 * mm, doc.width - 158 - 40 * mm, 158]
else:
data += [["", ""]]
tube = TubesRegistration.objects.filter(issledovaniya__napravleniye=direction).first()
if tube and (tube.time_get or tube.time_recive):
data += [["Забор биоматериала:", strfdatetime((tube.time_get or tube.time_recive), "%d.%m.%Y %H:%M")]]
elif not direction.imported_from_rmis and not is_extract and direction.doc:
data.append(["Врач:", "<font>%s<br/>%s</font>" % (direction.doc.get_fio(), direction.get_doc_podrazdeleniye_title())])
elif direction.imported_org:
data.append(["<font>Направляющая<br/>организация:</font>", direction.imported_org.title])
rows = len(data)

logo_col = logo_col_func(direction)

data = [[Paragraph(y, styleTableMono) if isinstance(y, str) else y for y in data[xi]] + [logo_col[xi]] for xi in range(rows)]
if direction.is_external:
colWidths = [40 * mm, doc.width - 158 - 40 * mm, 158]
else:
colWidths = [doc.width * 0.145, doc.width - 158 - doc.width * 0.145, 158]
colWidths = [doc.width * 0.145, doc.width - 158 - doc.width * 0.145, 158]

t = Table(data, colWidths=colWidths)
t.setStyle(
TableStyle(
[
('ALIGN', (-1, 0), (-1, 0), 'CENTER'),
('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
('VALIGN', (-1, 0), (-1, 0), 'MIDDLE'),
('VALIGN', (-1, 5), (-1, 5), 'TOP'),
('LEFTPADDING', (0, 0), (-1, -1), 0),
('RIGHTPADDING', (0, 0), (-1, -1), 1),
('BOTTOMPADDING', (0, 0), (-1, -1), 0),
('TOPPADDING', (0, 0), (-1, -1), 0),
('BOTTOMPADDING', (-1, 0), (-1, -1), 0),
('TOPPADDING', (-1, 0), (-1, -1), 0),
('TOPPADDING', (-1, 5), (-1, 5), 3),
('TOPPADDING', (-1, 0), (-1, 0), -7 * mm if isinstance(logo_col[0], Paragraph) else 0),
('TOPPADDING', (0, 5), (1, 5), 0),
('TOPPADDING', (0, 6), (1, 6), -6),
('BOTTOMPADDING', (0, 5), (1, 5), 0),
('LEFTPADDING', (0, 5), (1, 5), 0),
('RIGHTPADDING', (0, 5), (1, 5), 0),
('SPAN', (-1, 0), (-1, 4)),
('SPAN', (-1, 5), (-1, -1)),
]
t = Table(data, colWidths=colWidths)
t.setStyle(
TableStyle(
[
('ALIGN', (-1, 0), (-1, 0), 'CENTER'),
('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
('VALIGN', (-1, 0), (-1, 0), 'MIDDLE'),
('VALIGN', (-1, 5), (-1, 5), 'TOP'),
('LEFTPADDING', (0, 0), (-1, -1), 0),
('RIGHTPADDING', (0, 0), (-1, -1), 1),
('BOTTOMPADDING', (0, 0), (-1, -1), 0),
('TOPPADDING', (0, 0), (-1, -1), 0),
('BOTTOMPADDING', (-1, 0), (-1, -1), 0),
('TOPPADDING', (-1, 0), (-1, -1), 0),
('TOPPADDING', (-1, 5), (-1, 5), 3),
('TOPPADDING', (-1, 0), (-1, 0), -7 * mm if isinstance(logo_col[0], Paragraph) else 0),
('TOPPADDING', (0, 5), (1, 5), 0),
('TOPPADDING', (0, 6), (1, 6), -6),
('BOTTOMPADDING', (0, 5), (1, 5), 0),
('LEFTPADDING', (0, 5), (1, 5), 0),
('RIGHTPADDING', (0, 5), (1, 5), 0),
('SPAN', (-1, 0), (-1, 4)),
('SPAN', (-1, 5), (-1, -1)),
]
)
)
)
else:
t = gen_hospital_stamp(direction)

return t

491 changes: 23 additions & 468 deletions results/views.py

Large diffs are not rendered by default.

21 changes: 11 additions & 10 deletions utils/pagenum.py
Original file line number Diff line number Diff line change
@@ -5,7 +5,7 @@
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfgen import canvas

from laboratory.settings import FONTS_FOLDER
from laboratory.settings import FONTS_FOLDER, SELF_WATERMARKS


class PageNumCanvas(canvas.Canvas):
@@ -46,10 +46,11 @@ def draw_page_number(self, page_count):
"""
Add the page number
"""
pdfmetrics.registerFont(TTFont('PTAstraSerifReg', os.path.join(FONTS_FOLDER, 'PTAstraSerif-Regular.ttf')))
page = "Лист {} из {}".format(self._pageNumber, page_count)
self.setFont("PTAstraSerifReg", 9)
self.drawRightString(200 * mm, 8 * mm, page)
if not SELF_WATERMARKS:
pdfmetrics.registerFont(TTFont('PTAstraSerifReg', os.path.join(FONTS_FOLDER, 'PTAstraSerif-Regular.ttf')))
page = "Лист {} из {}".format(self._pageNumber, page_count)
self.setFont("PTAstraSerifReg", 9)
self.drawRightString(200 * mm, 8 * mm, page)


class PageNumCanvasPartitionAll(canvas.Canvas):
@@ -77,7 +78,6 @@ def save(self):
Add the page number to each page (page x of y)
"""
page_count = len(self.pages)

for page in self.pages:
self.__dict__.update(page)
self.draw_page_number(page_count)
@@ -90,7 +90,8 @@ def draw_page_number(self, page_count):
"""
Add the page number
"""
pdfmetrics.registerFont(TTFont('PTAstraSerifReg', os.path.join(FONTS_FOLDER, 'PTAstraSerif-Regular.ttf')))
page = "Лист {}".format(self._pageNumber)
self.setFont("PTAstraSerifReg", 9)
self.drawRightString(200 * mm, 8 * mm, page)
if not SELF_WATERMARKS:
pdfmetrics.registerFont(TTFont('PTAstraSerifReg', os.path.join(FONTS_FOLDER, 'PTAstraSerif-Regular.ttf')))
page = "Лист {}".format(self._pageNumber)
self.setFont("PTAstraSerifReg", 9)
self.drawRightString(200 * mm, 8 * mm, page)

0 comments on commit bb5d459

Please sign in to comment.