Как использовать кириллицу в борбе?Python

Программы на Python
Anonymous
 Как использовать кириллицу в борбе?

Сообщение Anonymous »

Я пытаюсь использовать кириллицу в борбе. Оказалось, что borb не использует шрифты, поддерживающие кириллицу. Я нашел простое, но долго работающее решение, а также быстро работающее решение, но с ним у меня возникли проблемы.
Мне нужно изменить PDF-документ, но так как я не могу сделать это напрямую (это совершенно нетривиальная задача), я читаю все данные из PDF-документа, затем меняю координаты символов, создаю новую страницу, вставляю туда все символы обратно, а старую страницу удаляю. Мне нужно иметь возможность манипулировать местоположением каждого отдельного персонажа. Для этого я сначала использовал Rectangle и Paragraph для каждого отдельного символа, но это не самое эффективное решение, и код выполняется долго. Однако мне удалось использовать шрифт, поддерживающий кириллицу.
font_path: Path = Path(__file__).parent / "TimesNewRomanRegular.ttf"
custom_font: Font = TrueTypeFont.true_type_font_from_file(font_path)
for i, s in enumerate(symb_arr):
r: Rectangle = Rectangle(
Decimal(s.x_coord), # x: 0 + page_margin
Decimal(s.y_coord), # y: page_height - page_margin - height_of_textbox
Decimal(s.width + 2), # width: page_width - 2 * page_margin
Decimal(s.height + 2), # height
)
Paragraph(s.sym, font_size=Decimal(font_size), font=custom_font).paint(page, r)

Где symb_arr — массив объектов класса Symbol (мой собственный):
class Symbol:
def __init__(self, s, x, y, w, h, f):
self.sym = s # character
self.x_coord = x
self.y_coord = y
self.width = w
self.height = h
self.font_size = f

Этот код для моего PDF-документа из двух абзацев выполняется около 5 секунд, что не так уж и мало. Однако я нашел более элегантное и быстрое решение, использующее низкоуровневый синтаксис:
# create content stream
content_stream = Stream()
content = b""""""
for s in symb_arr:
content += b"""
q
BT
/F1 %b Tf
%b %b Td
(%b) Tj
ET
Q
""" % (bytes(format(s.font_size, '.4f'), 'utf-8'), bytes(format(s.x_coord, '.4f'), 'utf-8'),
bytes(format(s.y_coord, '.4f'), 'utf-8'), bytes(str(s.sym), 'utf-8'))

content_stream[Name("DecodedBytes")] = content
content_stream[Name("Bytes")] = zlib.compress(content_stream["DecodedBytes"], 9)
content_stream[Name("Filter")] = Name("FlateDecode")
content_stream[Name("Length")] = bDecimal(len(content_stream["Bytes"]))

# set content of page
page[Name("Contents")] = content_stream

# set Font
page[Name("Resources")] = Dictionary()
page[Name("Resources")] = doc.get_page(0)["Resources"] # here I am installing the font from the original page

Этот метод работает за 0,4 секунды для того же примера, что в 12 раз быстрее, чем предыдущий метод! Однако я не могу использовать кириллицу в этом методе.
Возможные проблемы следующие: используемый шрифт не поддерживает кириллицу, либо есть проблема с байтовой кодировкой, так как оператор (%b)Tj принимает на вход байт, а кириллица кодируется в utf-8 двумя байтами.
Итак, я также могу изменить шрифт при использовании низкоуровневого синтаксиса, но не знаю, как это сделать. У меня есть пример автора из документации borb, однако там этому уделено очень мало внимания, поэтому я не понимаю, как это сделать самостоятельно со своим шрифтом (имея TTF-файл).
Здесь автор определяет свой шрифт с помощью низкоуровневого синтаксиса:
# set Font
page[Name("Resources")] = Dictionary()
page["Resources"][Name("Font")] = Dictionary()
page["Resources"]["Font"][Name("F1")] = Dictionary()
page["Resources"]["Font"]["F1"][Name("Type")] = Name("Font")
page["Resources"]["Font"]["F1"][Name("Subtype")] = Name("Type1")
page["Resources"]["Font"]["F1"][Name("Name")] = Name("F1")
page["Resources"]["Font"]["F1"][Name("BaseFont")] = Name("Helvetica")
page["Resources"]["Font"]["F1"][Name("Encoding")] = Name("MacRomanEncoding")


Подробнее здесь: https://stackoverflow.com/questions/777 ... et-in-borb

Вернуться в «Python»