PDFium Delphi Component Docs

Модуль FPdfLayout

Строит измеримые планы потоковой вёрстки с оформлением страниц, колонками, таблицами через страницы, ссылками, многоразовыми узлами, входной разметкой и семантикой Tagged PDF

Exceptions and enumerations

TypeValues or purpose
EPdfLayoutErrorИсключение для некорректного ввода вёрстки, превышенных лимитов и несогласованной семантической структуры
TPdfLayoutAlignmentplaLeft, plaCenter, plaRight
TPdfLayoutCommandKindplcText, plcRule, plcImage, plcPageXObject, plcCachedNode, plcLink, plcRectangle
TPdfLayoutItemKindpliText, pliSpacer, pliRule, pliImage, pliPageXObject, pliPageBreak, pliCachedNode, pliLink, pliSemanticNode, pliTable
TPdfLayoutSemanticRoleplsrArtifact, plsrParagraph, plsrHeading1, plsrHeading2, plsrHeading3, plsrHeading4, plsrHeading5, plsrHeading6, plsrList, plsrListItem, plsrListLabel, plsrListBody, plsrTable, plsrTableRow, plsrTableHeader, plsrTableData, plsrFigure, plsrCaption, plsrLink, plsrSection, plsrDivision
TPdfLayoutTableScopepltsNone, pltsRow, pltsColumn, pltsBoth
TPdfLayoutListNumberingplnNone, plnDisc, plnCircle, plnSquare, plnDecimal, plnUpperRoman, plnLowerRoman, plnUpperAlpha, plnLowerAlpha
TPdfLayoutGridTrackKindplgtkFixed, plgtkFraction, plgtkAuto
TPdfMarkupFormatpmfMarkdown, pmfHtml

Layout records

TypePublic members
TPdfLayoutSemanticsRole, ParentID, ElementID, AlternateText, ActualText, Language, HeaderIDs, TableScope, ColumnSpan, RowSpan, ListNumbering, Artifact, Paragraph, Figure
TPdfLayoutTextStyleFontName, FontSize, Color, Alpha, LineHeight, Alignment, KeepTogether, BreakLongWords, SpaceBefore, SpaceAfter, Default
TPdfLayoutConstraintsKeepTogether, KeepWithNext, PageBreakBefore, PageBreakAfter, OrphanLines, WidowLines, Default
TPdfLayoutPageSettingsWidth, Height, MarginLeft, MarginTop, MarginRight, MarginBottom, HeaderHeight, FooterHeight, A4, Letter
TPdfLayoutRectLeft, Top, Width, Height
TPdfLayoutGridTrackKind, Value, Minimum, Maximum, MeasuredContent
TPdfLayoutGridTracksДинамический массив TPdfLayoutGridTrack
TPdfLayoutGridSizesДинамический массив вычисленных размеров дорожек
TPdfLayoutTableOptionsCellPadding, BorderWidth, BorderColor, BorderAlpha, RepeatHeaderRows, AllowRowSpanContinuation, MaxContinuationRegions, ContinuationBefore, ContinuationAfter, ContinuationStyle, Default
TPdfLayoutTableTextRunText, Style
TPdfLayoutTableTextRunsДинамический массив TPdfLayoutTableTextRun
TPdfMarkupOptionsBaseStyle, HeadingScale, MaxInputCharacters, MaxNodes, Default
TPdfLayoutSemanticElementSemantics, ParentElementIndex
TPdfLayoutSemanticElementsДинамический массив TPdfLayoutSemanticElement
TPdfLayoutCommandKind, PageNumber, Bounds, Text, FontName, FontSize, Color, Alpha, Alignment, Thickness, FileName, Uri, Source, SourcePageIndex, SemanticElementIndex, MarkedContentID, AnnotationIndex
TPdfLayoutCommandsДинамический массив TPdfLayoutCommand
TPdfLayoutPlanPageSettings, PageCount, Commands, SemanticElements, TextLineCount, RuleCount, RectangleCount, ImageCount, PageXObjectCount, CachedNodeCount, LinkCount, TaggedContentCount, ArtifactCount, MeasuredTextCount, TotalPageReferenceCount, ReservedPageDigits, CacheHitCount, CacheMissCount, ReusedXObjectCount, ColumnCount, ColumnGap

Layout classes

TypePublic members
TPdfLayoutMeasurerMeasureTextWidth, CacheIdentity
TPdfLayoutItemKind
TPdfLayoutTableCellText, Uri, Style, AddTextRun, TextRuns, SetImage, ColumnSpan, RowSpan, Header, ElementID, HeaderIDs, Scope
TPdfLayoutTableRowAddCell, Cells, Header, AllowSplit, MinimumHeight, KeepWithPrevious
TPdfLayoutTableCreate, Destroy, AddRow, AddSubtotalRow, SetCaption, Columns, Rows, Options, Caption, CaptionStyle, ElementID, ParentID
TPdfLayoutPagedPlanCreate, Destroy, ClearPageCache, MaterializePage, Reset, Summary, CommandCount, StorageByteCount, SourceCount, Completed, бюджеты MaxCommandCount, MaxStorageBytes, MaxPageCommands, MaxSourceCount и MaxCachedPages, а также статистика кэша CachedPageCount, CacheHitCount, CacheMissCount и PeakCachedPageCount
TPdfLayoutDocumentCreate, Destroy, Clear, AddText, AddSpacer, AddRule, AddImage, AddPageXObject, AddCachedNode, AddLink, AddSemanticNode, SetLastItemSemantics, SetLastItemConstraints, AddTable, AddPageBreak, LoadMarkup, InvalidateCache, BuildPlan, BuildPagedPlan, PageSettings, HeaderText, FooterText, HeaderStyle, FooterStyle, ReservedPageDigits, ColumnCount, ColumnGap, Items
TPdfLayoutCachedNodeCreate, Destroy, Invalidate, BeginEmission, EndEmission, Content, Width, Height, Built

Pagination constraints

Вызывайте SetLastItemConstraints после добавления любого видимого элемента потока, чтобы удержать его целиком, привязать к началу следующего элемента или принудительно разорвать страницу до или после него

OrphanLines — минимальное число строк абзаца, удерживаемых внизу области, а WidowLines — минимум, размещаемый вверху следующей области; обе по умолчанию равны единице, чтобы сохранить существующую разбивку на страницы

Ограничения одинаково применяются к элементам ролей абзаца, ссылки, списка, рисунка и таблицы, а чисто семантические контейнеры не имеют геометрии и потому отклоняют ограничения разбивки

Элемент pliTable принимает только PageBreakBefore и PageBreakAfter; разрыв строк и удержание начала таблицы управляются табличной моделью

Планировщик кэширует перенесённые строки во время построения, поэтому предсказание keep-with-next и финальная выдача команд не измеряют один и тот же текст дважды

Paged command plans

Создайте TPdfLayoutPagedPlan над отдельным перемещаемым и изменяемым по размеру TStream, затем вызовите BuildPagedPlan или передайте его в TPdf.GeneratePagedLayout

Планировщик сериализует команды немедленно, освобождает каждый завершённый результат переноса текста и оставляет Plan.Commands пустым, сохраняя настройки страниц, семантические элементы, счётчики и стабильные итоги страниц в сводке

Команды тела и последующие команды колонтитулов индексируются как связанные сегменты страниц, поэтому MaterializePage восстанавливает полную страницу без просмотра команд других страниц

MaxCachedPages ограничивает только массивы страниц, удерживаемые планом; вызывающий код, сохраняющий возвращённые массивы, продлевает их время жизни, а PDFium удерживает нативные созданные страницы, пока целевой документ не сохранён или не закрыт

Формат хранения — частное состояние сеанса, а не переносимый файловый формат, поток нельзя разделять или изменять извне, а исходные объекты, на которые ссылаются XObjects страниц или кэшированные узлы, должны переживать постраничный план

Используйте TPdfRandomAccessStore, когда команды должны оставаться в памяти до выбранного порога, а затем вытесняться во временное хранилище с удалением при закрытии

Cross-page tables

Создайте TPdfLayoutTable с фиксированными, дробными или размеренными по содержимому дорожками сетки, добавьте строки и ячейки, затем вызовите AddTable; документ хранит собственный снимок, поэтому последующие изменения со стороны вызывающего кода не могут инвалидировать существующий кэш плана

Строки заголовков должны быть непрерывны в начале таблицы и повторяются после перехода страницы или колонки, когда RepeatHeaderRows истинно; объединения строк заголовков не могут распространяться на строки тела

Строка тела может разрываться, когда AllowSplit истинно; по умолчанию транзитивные группы с объединением строк перемещаются как единое атомарное целое, а ячейки обычной разорванной строки имеют одну полосу строк, отступы и геометрию границ

Установите AllowRowSpanContinuation в True, чтобы группа с объединением строк продолжалась через страницы или колонки; планировщик распределяет дополнительную высоту объединения по её строкам и выбирает разрезы, не пересекающие ни строку текста, ни изображение

AllowSplit=False остаётся ограничением атомарной строки; несовместимые ограничения строк или атомарный блок, не помещающийся в свежую область, возбуждают EPdfLayoutError вместо обрезки или повторения содержимого

Подписи остаются с исходным блоком заголовков и минимальным началом первой группы тела; повторяемые заголовки переиспользуют те же исходные элементы заголовков

Планировщик выдаёт один элемент Table, необязательную Caption, дочерние TR и ячейки TH или TD независимо от количества страниц; повторяемые команды заголовков повторно используют исходные семантические индексы, а ячейки TD автоматически получают перекрывающиеся идентификаторы заголовков, если явно не переданы корректные идентификаторы

Границы таблицы — команды артефактов plcRectangle, отображаемые через нативные объекты путей PDFium, а текст подписи и ячеек остаётся tagged-содержимым

Смешанные ячейки с текстом и изображениями

AddTextRun дописывает встроенный текст после исходного Text ячейки; у каждого прогона свой шрифт, размер шрифта, цвет, альфа, высота строки и политика переноса длинных слов

Смешанный текст переносится по измеренным ширинам, сохраняет суррогатные пары UTF-16 при переносе длинного слова и выдаёт отдельные нативные текстовые объекты с общей базовой линией; горизонтальное выравнивание берётся из базового Style ячейки

Интервалы абзацев и флаги удержания на уровне прогона не создают дополнительных блоков абзацев; используйте отдельные строки или обычные элементы вёрстки, когда такие ограничения нужны

SetImage настраивает одно изображение из файла на ячейку, размещаемое над её текстом по левому отступу; повторный вызов заменяет это изображение

Передайте явную положительную высоту и ширину, помещающуюся во внутреннюю ширину ячейки; ширина ноль использует всю внутреннюю ширину, а соотношение сторон изображения вызывающий код задаёт через переданные размеры

Изображение неделимо при продолжении и выдаётся один раз на исходной позиции; его файл должен оставаться доступным до генерации, а отсутствующий файл или неподдерживаемое изображение заставляют генерацию откатить добавленные страницы

Требуется непустое альтернативное описание; изображение становится дочерним Figure своей исходной ячейки TH или TD, а все текстовые фрагменты остаются связаны с этой ячейкой

Между страницами исходная ячейка TH или TD получает ссылки continued marked-content и сохраняет свои RowSpan, ColumnSpan и связи заголовков; дублирующая логическая ячейка не создаётся

Подытоги и метки продолжения

AddSubtotalRow создаёт атомарную строку тела, используя метку, форматированное значение и стиль вызывающего кода; при нескольких колонках метка охватывает все, кроме последней колонки значений

Помощник устанавливает KeepWithPrevious=True, чтобы подытог не оказался изолированной первой строкой на продолжении; значения передаёт вызывающий код, и числовая агрегация не выполняется

ContinuationAfter показывается в конце продолжающейся области, а ContinuationBefore — после любых повторяемых заголовков в следующей области

Обе метки по умолчанию пусты, используют ContinuationStyle, должны помещаться в одну строку и резервируют собственную высоту; у первой области нет метки before, а у последней — метки after

Метки и границы — артефакты, поэтому семантическая иерархия таблицы не меняется; заполнители страниц вроде {page} и {pages} используют обычный распознаватель текста вёрстки

Дополнительные объявления таблицы и лимиты

procedure TPdfLayoutTableCell.AddTextRun(const Text: WideString;
  const Style: TPdfLayoutTextStyle);

procedure TPdfLayoutTableCell.SetImage(const FileName: string;
  Width, Height: Single; const AlternateText: WideString);

function TPdfLayoutTable.AddSubtotalRow(const LabelText, ValueText: WideString;
  const Style: TPdfLayoutTextStyle): TPdfLayoutTableRow;

Используйте TPdfLayoutTableOptions.Default перед переопределением параметров; AllowRowSpanContinuation по умолчанию False, а MaxContinuationRegions — 10 000 страничных или колоночных областей при настраиваемом потолке 100 000

Таблицы сохраняют лимиты в 256 колонок, 100 000 строк и 100 000 семантических элементов; суммарный текст ячеек ограничен 8 000 000 кодовых единиц UTF-16

Ячейка со смешанным текстом принимает не более 1 024 добавленных прогонов, 1 000 000 кодовых единиц UTF-16, 100 000 строк и 100 000 фрагментов; отдельный символ или слово с отключённым переносом длинных слов, превышающее доступную ширину, отклоняется

Продолженная группа строк ограничена 10 000 ячейками; бюджеты областей и ограниченные поиски разрезов предотвращают неограниченную разбивку, а изображения должны помещаться в доступную область тела после заголовков, меток и отступов

Собственный снимок таблицы и кэш плана включают стили прогонов, размеры изображений, альтернативный текст, удержание подытогов и настройки продолжения; последующие изменения таблицы вызывающего кода не меняют этот снимок

Top-level routines

RoutineDescription
ResolveLayoutTextРазворачивает заполнители номеров страниц с учётом зарезервированной ширины в цифрах
PdfLayoutSemanticRoleNameВозвращает имя структуры Tagged PDF для семантической роли
BuildTaggedLayoutPdfПрименяет завершённый план вёрстки и tagged-структуру к исходным байтам PDF
ResolvePdfLayoutGridTracksВычисляет фиксированные, дробные и размеренные по содержимому дорожки сетки в пределах доступной ширины

See Also