Reportlab 3.5 diacriti c в тексте неправильно расположены для определенных шрифтов (Юникод) - PullRequest
0 голосов
/ 20 февраля 2020

Я создаю парсер в python3 .7, который принимает xml файлы в качестве входных данных и создает файлы PDF в качестве выходных данных. Я использую reportlab 3.5, и все работает, кроме одной вещи. Текст, который я анализирую, использует определенный шрифт, который называется «Юникод». Шрифт используется правильно, за исключением того, что диакритические знаки (буквы, которые должны go над другой буквой, например «´», идут над «e», как этот é), сдвинуты вправо. Один пример здесь:

Word with the diacritic shifted.

Я использую SimpleDocTemplate, и текст помещается в таблицу. Я немного упростил код:

pdfmetrics.registerFont(TTFont('Junicode', './fonts/Junicode.ttf'))
pdfmetrics.registerFont(TTFont('JunicodeBd', './fonts/Junicode-Bold.ttf'))
pdfmetrics.registerFont(TTFont('JunicodeBI', './fonts/Junicode-BoldItalic.ttf'))
pdfmetrics.registerFont(TTFont('JunicodeIt', './fonts/Junicode-Italic.ttf'))

document = SimpleDocTemplate("output_pdf/" + os.path.splitext(os.path.basename(imgfile))[0] + ".pdf",
                                             pagesize=self.canvas_size,
                                             rightMargin=Helpers.mm_to_pts(self.margin_right),
                                             leftMargin=Helpers.mm_to_pts(self.margin_left),
                                             topMargin=Helpers.mm_to_pts(self.margin_top),
                                             bottomMargin=Helpers.mm_to_pts(self.margin_bottom))

frame = Frame(document.leftMargin, document.bottomMargin, document.width, document.height)

text_template = PageTemplate(id='textpage', frames=[frame], onPage=self.__draw_text_page)

document.addPageTemplates([text_template])

page_flow = [some_other_stuff , NextPageTemplate('textpage'), PageBreak()]

[... code to get line from xml]

table_data.append(['', line])

[...]

table_styles = [('ALIGN', (0, 0), (0, -1), 'RIGHT'),
                                ('ALIGN', (2, 0), (2, -1), 'RIGHT'),
                                ('SIZE', (0, 0), (-1, -1), self.font_size),
                                ('FONT', (0, 0), (-1, -1), 'Junicode'),
                                ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), ]

table = Table(table_data, rowHeights=self.table_row_height)

table.setStyle(TableStyle(table_styles))

page_flow.append(table)

document.build(page_flow)

Я пытаюсь получить диакритические знаки над буквами, например на изображении выше, я бы хотел, чтобы угол наклона ":" был на вершине y.

Кто-нибудь знает, откуда это исходит и есть ли решение для этого?

Спасибо, Павел

1 Ответ

0 голосов
/ 28 февраля 2020

Обходной путь:

Мне удалось решить проблему, отредактировав шрифт с помощью FontForge. Я преобразовал положение x диакритических знаков в отрицательное значение, таким образом расположив их правильно. Для заглавных букв мне также пришлось увеличить значение y, поэтому я создал дополнительные диакритические знаки (в местах шрифта, где буквы не были заданы) с увеличенными значениями y и заменил старые на новые, если перед ним заглавная буква. .

...