Поддержка текста справа налево при генерации PDF: представляем функцию RtLTextOut от HotPDF.
Введение в языки, использующие направление письма справа налево.
Языки, использующие направление письма справа налево (RTL), составляют значительную часть мировых систем письменной коммуникации, охватывая более 400 миллионов человек во всем мире. К ним относятся арабский, иврит, персидский (фарси), урду, пашту и многие другие, каждый из которых имеет свои уникальные характеристики и культурное значение.
Исторический и культурный контекст.
Системы письма, использующие направление справа налево, имеют древние корни, восходящие к тысячам лет. Например, арабский язык развился из набатейского письма и был стандартизирован в ранний исламский период. Иврит имеет еще более долгую историю, с древними надписями на иврите, датируемыми 10 веком до нашей эры. Эти системы письма развивались независимо от латинских шрифтов и отражают различные подходы к организации письменной информации.
Лингвистические особенности языков RTL.
Языки RTL обладают рядом отличительных особенностей, которые влияют на цифровую обработку текста:
- Направление письма.Текст отображается справа налево, в отличие от европейских языков.
- Контекстуальные формы букв.Во многих языках, использующих право-левое направление письма, буквы имеют разные формы в зависимости от позиции (начальная, средняя, конечная, изолированная).
- Лигатуры и соединения.Буквы часто соединяются, образуя непрерывные слова, что требует сложной отрисовки.
- Диакритические знаки.Гласные и другие диакритические знаки располагаются над или под основными символами.
- Двунаправленный текст.Документы RTL часто содержат встроенные элементы LTR (числа, латинский текст, URL-адреса).
Цифровые вызовы и стандарты Unicode.
Цифровое представление языков RTL создает уникальные технические трудности:
- Кодировка символов.Unicode предоставляет стандартизированные коды для символов RTL:
- Арабский язык: U+0600-U+06FF (арабский блок).
- Иврит: U+0590-U+05FF (еврейский блок).
- Дополнительный арабский блок: U+0750-U+077F.
- Арабский расширенный диапазон A: U+08A0-U+08FF
- Алгоритм двунаправленного отображения: Алгоритм двунаправленного отображения Unicode (UBA) определяет, как следует обрабатывать текст, содержащий как текст, читаемый справа налево (RTL), так и текст, читаемый слева направо (LTR).
- Требования к шрифтам: Для отображения текста RTL требуются шрифты с достаточным набором глифов и возможностями форматирования.
- Особенности компоновки: Пользовательские интерфейсы и документы должны учитывать чтение справа налево.
Значение для мирового рынка.
Поддержка языков, использующих направление письма справа налево (RTL), имеет решающее значение для бизнеса и организаций, работающих на разнообразных рынках:
- Арабский регион: 22 страны с более чем 300 миллионами носителей языка.: 22 страны с более чем 300 миллионами носителей языка.
- Еврейский рынок: Израиль и еврейские общины по всему миру.: Израиль и еврейские общины по всему миру.
- Персидский/Фарси: Иран, Афганистан и Таджикистан.: Иран, Афганистан и Таджикистан.
- Урду.Пакистан и часть Индии.
- Экономическое воздействие.Общий ВВП регионов, использующих языки, читаемые справа налево, превышает 4 триллиона долларов США.
В современном глобализированном мире создание PDF-документов, которые должным образом поддерживают несколько языков и систем письма, становится все более важным. Хотя большинство библиотек для создания PDF-файлов легко справляются с языками, читаемыми слева направо (LTR), такими как английский, французский и немецкий, поддержка языков, читаемых справа налево (RTL), таких как арабский и иврит, представляет собой уникальные проблемы. В этой статье рассматривается инновационная RtLTextOut функция компонента HotPDF для Delphi и демонстрируется ее практическая реализация с помощью комплексного демонстрационного приложения.
Понимание проблемы отображения текста справа налево в PDF-файлах.
Языки, читаемые справа налево, требуют особого подхода в цифровых документах по нескольким причинам:
- Порядок символов.Текст, написанный в формате RTL, отображается справа налево, в отличие от языков, использующих формат LTR.
- Двунаправленный текст.Документы часто содержат смешанный контент, включающий текст в форматах RTL и LTR.
- Поведение просмотрщика PDF.Просмотрщикам PDF требуются правильные указания направления для корректного отображения текста.
- Сложность Unicode.Символы RTL имеют определенные диапазоны Unicode, которые должны быть обнаружены и обработаны.
Традиционные подходы к генерации PDF часто не работают при обработке текста в формате RTL, что приводит к инвертированному порядку символов, неправильному порядку чтения или полностью искаженному результату.

Представляем функцию RtLTextOut в HotPDF.
Компонент HotPDF решает эти задачи благодаря своему сложному. RtLTextOut функция, которая реализует передовые алгоритмы двунаправленной обработки текста. В отличие от простых подходов к инверсии символов, RtLTextOut использует сегментно-ориентированную обработку для интеллектуальной обработки смешанного RTL/LTR контента.
Сигнатуры функций.
The RtLTextOut функция предоставляет две перегруженные версии для максимальной гибкости:
|
1 2 3 4 5 |
// PWORD version for direct Unicode character array access procedure RtLTextOut(X, Y: Single; angle: Extended; Text: PWORD; TextLength: Integer); // WideString version for convenient string handling procedure RtLTextOut(X, Y: Single; angle: Extended; Text: WideString); |
Основной алгоритм: Сегментно-ориентированная обработка.
Сердцем является RtLTextOut основана на двунаправленном алгоритме, работающем с сегментами. Вместо простого обращения порядка символов, функция:
- Анализирует типы символов.: Определяет символы, используемые для отображения текста справа налево (арабский: U+0600-U+06FF, иврит: U+0590-U+05FF).
- Сегменты текста.: Объединяет последовательные символы одного типа (справа налево или слева направо).
- Применяет выборочную обработку.:
- Сегменты RTL сохраняют свой первоначальный порядок.
- Сегменты LTR инвертируются внутри.
- Выводит правильный результат.Приводит к следующему шаблону.
Reversed(C)+B+Reversed(A)для сегментов.A+B+C
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
// Core segment processing logic I := 0; while I < TextLength do begin // Determine if current character starts an RTL or LTR segment IsRTLChar := ((ReversedText[I] >= $0600) and (ReversedText[I] <= $06FF)) or // Arabic ((ReversedText[I] >= $0590) and (ReversedText[I] <= $05FF)); // Hebrew CurrentSegmentIsRTL := IsRTLChar; SegmentStart := I; // Find the end of current segment (same character type) while (I < TextLength) do begin IsRTLChar := ((ReversedText[I] >= $0600) and (ReversedText[I] <= $06FF)) or ((ReversedText[I] >= $0590) and (ReversedText[I] <= $05FF)); if IsRTLChar <> CurrentSegmentIsRTL then Break; Inc(I); end; SegmentEnd := I - 1; // Process the segment if CurrentSegmentIsRTL then begin // RTL segment: keep original order for J := SegmentStart to SegmentEnd do OutputText[J] := ReversedText[J]; end else begin // LTR segment: reverse the segment internally for J := SegmentStart to SegmentEnd do OutputText[J] := ReversedText[SegmentEnd - (J - SegmentStart)]; end; end; |
Автоматическая настройка направления PDF.
Помимо обработки текста, RtLTextOut автоматически настраивает документ PDF для оптимального отображения RTL:
|
1 2 3 4 5 |
// Store original direction and set to RightToLeft OriginalDirection := FParent.FDirection; FParent.FDirection := RightToLeft; FParent.FViewerPreference := FParent.FViewerPreference + [vpDirection]; FParent.FVPChanged := true; |
Это гарантирует, что программы просмотра PDF открывают документ с правильным направлением чтения, обеспечивая пользователям интуитивно понятный опыт чтения.
Исследование демонстрационного приложения RtLTextOut.
Библиотека HotPDF включает в себя комплексное демонстрационное приложение (Demo\Delphi\RtLTextOut\RtLTextOut.dpr), которое демонстрирует RtLTextOut возможности функции в различных сценариях.
Структура и особенности демонстрации.
Демонстрационное приложение демонстрирует:
- Базовый вывод текста на арабском языке: Простое отображение текста справа налево.
- Поддержка текста на иврите.: Комплексная обработка символов иврита.
- Контент, содержащий несколько языков: Комбинации текста справа налево (RTL) и слева направо (LTR).
- Техническая документация.: Примечания по реализации и лучшие практики.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
program RtLTextOut; {$I ..\..\..\Lib\HotPDF.inc} {$APPTYPE CONSOLE} uses {$IFDEF XE2+} System.SysUtils, Vcl.Graphics, {$ELSE} SysUtils, Graphics, {$ENDIF} HPDFDoc; var HotPDF: THotPDF; begin try HotPDF := THotPDF.Create(nil); try HotPDF.FileName := 'RtLTextOut.pdf'; HotPDF.Title := 'RtLTextOut Function Test - Right-to-Left Text Output'; HotPDF.BeginDoc; // Title HotPDF.CurrentPage.SetFont('Arial', [fsBold], 18, 0, False); HotPDF.CurrentPage.TextOut(40, 50, 0, 'RtLTextOut Function Demonstration'); // Arabic text demonstration HotPDF.CurrentPage.SetFont('Arial Unicode MS', [], 12, 178, False); HotPDF.CurrentPage.TextOut(40, 160, 0, 'RtLTextOut:'); HotPDF.CurrentPage.RtLTextOut(40, 180, 0, 'يوضح ملف PDF هذا كيفية التعامل بشكل صحيح مع النص العربي من اليمين إلى اليسار.'); // Hebrew text demonstration HotPDF.CurrentPage.SetFont('Arial Unicode MS', [], 12, 177, False); HotPDF.CurrentPage.RtLTextOut(40, 370, 0, 'קובץ PDF זה מדגים כיצד לטפל כראוי בטקסט עברי הזורם מימין לשמאל.'); // Mixed text demonstration HotPDF.CurrentPage.RtLTextOut(40, 550, 0, 'مرحبا بالعالم! اكتب في مستندات PDF التي تم إنشاؤها بواسطة مكون HotPDF'); HotPDF.EndDoc; Writeln('RtLTextOut.pdf created successfully!'); finally HotPDF.Free; end; except on E: Exception do Writeln('Error: ', E.Message); end; end. |
Основные моменты демонстрации.
Обработка текста на арабском языке.: Демонстрация показывает, как RtLTextOut обрабатывает сложные арабские предложения с правильным отображением символов и интервалами.
Поддержка иврита: Демонстрирует отображение текста на иврите с правильной ориентацией справа налево.
Контент, содержащий несколько языков: Показывает, как функция интеллектуально обрабатывает текст, содержащий элементы как RTL, так и LTR.
Конфигурация шрифтов: Иллюстрирует правильный выбор шрифтов Unicode (Arial Unicode MSдля поддержки символов, отображаемых справа налево (RTL).
Технические детали реализации.
Обнаружение символов Unicode.
Эта функция использует надежное обнаружение диапазонов Unicode:
- Арабский.: U+0600 to U+06FF (1536-1791 десятичные).
- Иврит.: U+0590 to U+05FF (1424-1535 десятичные).
Управление памятью.
Эффективная обработка массивов обеспечивает оптимальную производительность:
|
1 2 3 4 5 6 7 8 9 10 |
// Initialize arrays SetLength(ReversedText, TextLength); SetLength(OutputText, TextLength); // Copy original text first for I := 0 to TextLength - 1 do begin ReversedText[I] := TempText^; Inc(TempText); end; |
Поддержка вертикального текста.
Функция включает в себя специальную обработку для вертикальных шрифтов:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
if CurrentFontObj.IsVertical then begin DeltaH := TextHeight('Zj'); DeltaW := TextWidth('W'); HorizontalLine := Y; ChBuff := @ChCode; for I := 0 to TextLength - 1 do begin ChCode := OutputText[I]; if (ChCode = $30FC) then ChCode := $7C; InternUnicodeTextOut(X + (DeltaW / 2), HorizontalLine - DeltaH, 0, ChBuff, 1); HorizontalLine := HorizontalLine + DeltaH; end; end else InternUnicodeTextOut(X, Y, angle, @OutputText[0], TextLength); |
Рекомендации по работе с текстом справа налево (RTL) в PDF-файлах.
Выбор шрифтов.
Выбирайте шрифты, поддерживающие Unicode и ваши целевые языки, использующие направление справа налево:
- Arial Unicode MS.Комплексная поддержка Unicode.
- Times New Roman.Подходит для контента, содержащего различные типы данных.
- Tahoma.Отличная поддержка арабского языка.
Кодировка текста.
Убедитесь, что в вашем исходном тексте используется правильная кодировка Unicode.
|
1 2 3 4 5 6 7 |
// Use WideString for Unicode text var ArabicText: WideString; begin ArabicText := 'النص العربي'; HotPDF.CurrentPage.RtLTextOut(X, Y, 0, ArabicText); end; |
Совместимость с просмотрщиками PDF.
Автоматическая настройка направления обеспечивает совместимость с различными просмотрщиками PDF:
- Adobe Acrobat Reader
- Foxit Reader
- Chrome PDF Viewer
- Firefox PDF Viewer
Особенности производительности
Алгоритм, основанный на сегментах, обеспечивает отличные характеристики производительности:
- Линейная временная сложность: Время обработки O(n).
- : Минимальные накладные расходы памяти.: Эффективное управление массивами.
- : Обработка за один проход.: Не требуется несколько итераций.
- : Оптимизированное определение символов.: Быстрая проверка диапазонов Unicode.
: Применение в реальных задачах.
Локализация документации.
The RtLTextOut Эта функция обеспечивает бесшовную локализацию документов для рынков, использующих направление письма справа налево (RTL).
- Юридические документы на арабском языке.
- Технические руководства на иврите.
- Многоязычные формы и контракты.
- Образовательные материалы.
Международный бизнес.
Компании, работающие на рынках, использующих языки с направлением письма справа налево (RTL), могут использовать эту функцию для:
- Генерация счетов.
- Создание отчетов.
- Печать сертификатов.
- Маркетинговые материалы.
Устранение распространенных проблем.
Проблемы с кодировкой символов.
Проблема.: Неразборчивые или отсутствующие символы.
Решение.: Обеспечьте правильную кодировку Unicode и выбор шрифта.
|
1 2 3 4 5 |
// Correct approach HotPDF.CurrentPage.SetFont('Arial Unicode MS', [], 12, 178, False); var Text: WideString := 'النص العربي'; HotPDF.CurrentPage.RtLTextOut(X, Y, 0, Text); |
Проблемы с направлением текста
Проблема.: Текст отображается в неправильном направлении.
Решение.: Убедитесь, что RtLTextOut используется вместо обычного. TextOut
Проблемы смешанного контента.
Проблема.: Неправильный порядок в тексте, содержащем элементы RTL/LTR.
Решение.: Алгоритм, основанный на сегментах, обрабатывает это автоматически.
Планы развития и дорожная карта.
Команда разработчиков HotPDF продолжает улучшать поддержку RTL.
- Расширенная поддержка языков.Дополнительные языки, поддерживающие направление текста справа налево (RTL).
- Расширенная обработка сложных систем письма.Усовершенствованные функции типографики.
- Оптимизация производительности.Дальнейшие улучшения скорости.
- Улучшенная отладка.Улучшенные инструменты диагностики.
Заключительные слова.
The RtLTextOut Функция в HotPDF представляет собой значительный шаг вперед в технологии создания PDF-документов для языков, использующих направление письма справа налево (RTL). Ее сложный алгоритм обработки, основанный на сегментах, в сочетании с автоматической настройкой PDF, предоставляет разработчикам мощный инструмент для создания действительно международных PDF-документов.
Данное комплексное демонстрационное приложение служит как образовательным ресурсом, так и практическим руководством, демонстрируя лучшие практики обработки текста, ориентированного справа налево (RTL), в реальных сценариях. Независимо от того, разрабатываете ли вы приложения для рынков, где говорят на арабском языке, создаете ли документацию на иврите или строите многоязычные системы, это... RtLTextOut Эта функция обеспечивает надежную основу, необходимую для создания PDF-файлов профессионального качества.
Понимая и применяя эти методы, разработчики могут создавать PDF-документы, которые эффективно обслуживают глобальную аудиторию, преодолевая языковые барьеры и обеспечивая доступность и читаемость контента независимо от используемой системы письма.
Для получения дополнительной информации о HotPDF и его расширенных функциях, посетите официальную документацию или ознакомьтесь с демонстрационными приложениями, включенными в состав компонента.