Переносимый headless-вывод
Доступно с версии 2.384.100 как ограниченный конвейер вывода с явными API захвата и рендеринга
Захватите поддерживаемый прямоугольник из Classic XLS- или XLSX-книги на Windows, перенесите его неизменяемый снимок и отрендерите PDF, SVG или PNG на Linux или macOS с Free Pascal и нативным Cairo
Адаптер захвата использует движок книги; захват на Windows задействует свой сервис геометрии по умолчанию, а нативный захват на Linux и macOS может получить явный сервис геометрии FreeType/HarfBuzz, опирающийся на выбранные приложением файлы шрифтов
Отдельный нативный потребитель принимает сцены lxPortableRender через lxPortableCairo — без Excel и десктопной сессии; его геометрический API также использует существующие переносимые модули представления книги и геометрии рендеринга
Потребитель принимает неизменяемую сцену или поток переноса; требования платформы к загрузке и вычислению книг описаны отдельно в поддержке Free Pascal
Захват прямоугольника существующей книги
CaptureXLSPortableRenderSnapshot в lxPortableWorkbookCapture принимает IXLSWorkbook или IXLSXWorkbookOwner с явными или стандартными TXLSPortableRenderLimits; две дополнительные перегрузки принимают явные лимиты, а затем поставщика IXLSRenderGeometry, ограниченного областью захваченного представления
SheetIndex и включающие Row1, Col1, Row2, Col2 отсчитываются от 1; полученный снимок хранит позиции с отсчётом от нуля относительно захваченного прямоугольника
program CaptureRectangle;
{$APPTYPE CONSOLE}
uses SysUtils, Classes, lxHandleX, lxPortableRender,
lxPortableWorkbookCapture;
var
Workbook: TXLSXWorkbook;
Owner: IXLSXWorkbookOwner;
Snapshot: IXLSPortableRenderSnapshot;
Stream: TFileStream;
begin
Workbook := TXLSXWorkbook.Create;
Owner := Workbook;
if Workbook.Open('report.xlsx') <> 1 then
raise Exception.Create('Cannot open report.xlsx');
Snapshot := CaptureXLSPortableRenderSnapshot(Owner, 1, 1, 1, 30, 6);
Stream := TFileStream.Create('report.hxrs', fmCreate);
try
SaveXLSPortableRenderSnapshot(Snapshot, Stream,
XLSDefaultPortableRenderLimits);
finally
Stream.Free;
end;
Owner := nil;
end.
Держите интерфейс владельца живым, пока работаете с объектом книги; освобождайте интерфейс, а не освобождайте вручную книгу, принадлежащую интерфейсу
Для Classic XLS используйте TXLSWorkbook и IXLSWorkbook из lxHandle с тем же вызовом захвата
Захват читает существующие кэши формул и отклоняет любую формулу в прямоугольнике без кэша; он никогда не пересчитывает неявно, не подтягивает внешние данные и не добавляет новые стили в исходную книгу
Явно пересчитайте книгу перед захватом, если вашему приложению нужны свежие результаты формул; существующий кэш рендерится как сохранён, и захват не ручается за его свежесть
Операция удерживает read-only представление и проверяет поколение книги перед возвратом; возвращённый снимок отсоединён от владения книгой и остаётся пригодным после освобождения книги
Внешний вид и границы захвата
Снимок содержит форматированный отображаемый текст, физические размеры в пунктах, разрешённые RGB-цвета, поддерживаемые шрифты и выравнивания ячеек, заливки, границы и полные объединённые прямоугольники; скрытые строки и столбцы имеют нулевой размер
Поддерживаемый внешний вид шрифтов включает полужирный, курсив, одинарное подчёркивание и зачёркивание; поддерживаемый внешний вид ячеек включает сплошные заливки, горизонтальное выравнивание влево/по центру/вправо, вертикальное сверху/по центру/снизу, перенос, сжатие и порядок чтения справа налево
Тонкие, средние, толстые, волосяные, двойные, точечные, пунктирные и среднепунктирные границы книги отображаются в переносимые стили границ и ширины в пунктах; другие стили границ отклоняются
Поддерживаемый rich text несёт действующие шрифты runs, размеры в пунктах, RGB-цвета, полужирный, курсив, одинарное подчёркивание, зачёркивание, а также верхний или нижний индекс на уровне run; плоские эффекты шрифта ячеек (контур/тень/вертикальный), неподдерживаемые стили подчёркивания, градиентные или узорные заливки, диагональные границы, отступ, поворот текста и неподдерживаемые выравнивания отклоняются
Прямоугольник захвата должен содержать каждую объединённую ячейку целиком; обрезанные, перекрывающиеся или несогласованные объединения и несовместимые стили вдоль внешнего края объединения отклоняются
Фоны листа и неподдерживаемые виды листов отклоняют захват; поддерживаемые изображения PNG/JPEG и обычные текстовые фигуры прямоугольник/эллипс в обоих фасадах книги захватываются как упорядоченные объекты сцены, вместе с изображениями ячеек XLSX, Boolean-флажками и описанным ниже поддерживаемым подмножеством кэшированных диаграмм XLSX; неподдерживаемые диаграммы, заготовки фигур, WordArt, групповые преобразования, плавающие элементы управления, срезы, шкалы времени и спарклайны отклоняются, когда их разрешённая зона пересекает прямоугольник
Неподдерживаемый контент с надёжно разрешённой зоной вне прямоугольника может сосуществовать с захватом; неразрешимый footprint рисунка отклоняет захват, а не молча пропускает потенциально пересекающийся контент
Стилирование таблиц Classic, пересекающее прямоугольник, отклоняет захват; встроенные и поддерживаемые пользовательские разделы Table XLSX разрешаются в отсоединённом контексте стилей, с полосами размером в раздел и прямыми переопределениями формата ячеек
Для поддерживаемых импортированных сплошных или неявных дифференциальных заливок Table видимый фон задаёт RGB bgColor; один RGB fgColor оставляет унаследованный фон без изменений, а раздел с обоими цветами использует цвет фона
Импортированные разделы Table, содержащие внешний вид, который типизированная сводка не может представить, отклоняют захват, когда раздел применяется: подчёркивание, числовые форматы, явно снятые полужирный/курсив, схемы шрифтов, явный узор без заливки и неподдерживаемые формы цвета; несвязанный раздел вне захваченного прямоугольника захвату не мешает
Поддерживаемое условное форматирование применяется без вычисления формул: кэшированные числовые или датные сравнения с литеральными числовыми границами, литеральные Boolean или числовые выражения, правила вхождения/префикса/суффикса текста, пустоты и ошибки; более приоритетный внешний вид побеждает по каждому поддерживаемому свойству, а XLSX StopIfTrue останавливает менее приоритетные совпавшие правила
Текстовые правила Classic требуют литеральной строки-иглы и совпадают с кэшированными строковыми ячейками; текстовые правила XLSX используют свои сохранённые текстовые критерии
Поддерживаемый дифференциальный внешний вид включает разрешённые цвета темы с tint и простые индексированные цвета; импортированные автоматические цвета, tint не из темы, дифференциальная заливка с цветами и переднего, и заднего плана, а также неподдерживаемые границы, выравнивание, зачёркивание и другой непредставимый дифференциальный вид отклоняются, когда применяется совпавшее правило
Условные формулы, требующие вычисления, агрегатные или зависящие от даты правила, цветовые шкалы, гистограммы и наборы значков отклоняются там, где встречаются; количество пересекающихся правил условного форматирования ограничено
Преобразование Date1904 выбирает применимый сырой раздел числового формата до применения календарного смещения; неактивные календарные разделы не меняют обычный числовой показ, а Boolean-значения остаются Boolean
Выбранный календарный раздел Date1904 вместе с условиями формата или конструкциями прошедшего времени отклоняется; экранированные или в кавычках разделители разделов тоже отклоняются, и эта граница не блокирует выбранный обычный числовой раздел лишь потому, что другой раздел — календарный формат
Rich text и упорядоченные сцены рисунков
TXLSPortableCell.RichText — массив записей TXLSPortableTextRun с Text, FontFamily, FontSizePoints, FontStyles, ColorRGB и BaselineShiftPoints; конкатенация текста runs должна в точности равняться отображаемому тексту ячейки
Runs XLSX наследуют опущенные свойства от действующего захваченного шрифта ячейки, включая поддерживаемое табличное и условное форматирование; явно выставленные false-флаги и явные значения none/baseline/автоматического цвета переопределяют наследование
Нативные общие и встроенные строки сохраняют границы runs и пробельные символы; неподдерживаемые нативные дочерние элементы шрифтов, атрибуты, пространства имён, богатые цвета темы/индексированные и фонетические аннотации отклоняются, а не молча теряют видимый внешний вид
Runs Classic разрешают свои сохранённые индексы шрифтов BIFF в полные действующие шрифты runs; фонетические метаданные и неподдерживаемые шрифты runs отклоняются, а захват удерживает поколение книги и пулы стилей
Текстовые фигуры Classic читают существующие свойства OfficeArt и шрифтовые runs TXO, не создавая обёрток рисунков и не меняя книгу; якоря используют реальные размеры строк и столбцов и смещения, поддерживаемые сплошные заливки и контуры сохраняют цвета и ширины, а встроенные байты PNG/JPEG отсоединяются до переноса
Текст в прямоугольнике использует нативные поля 7.2pt по горизонтали и 3.6pt по вертикали; текст в эллипсе дополнительно использует свой вписанный текстовый прямоугольник, удерживая обычный текст внутри контура фигуры в обоих фасадах книги
Импортированные контейнеры Classic — прямоугольник и эллипс — сохраняют свой типизированный текст и форматирование; пропущенные нативные метаданные фигуры или группы без разрешённой зоны отклоняют захват явно, а неизвестные хвостовые записи объектов, расширения рисунков, вращение, несплошные заливки и неподдерживаемые стили линий отклоняют пересекающийся объект
Импортированные двухъячеечные якоря прямоугольника и эллипса XLSX поддерживают явные RGB-сплошные заливки с альфа-каналом, сплошные или пунктирные/точечные контуры, физические смещения якорей и один обычный абзац rich text; каждый run сохраняет действующие гарнитуру, размер в пунктах, цвет, полужирный, курсив, одинарное подчёркивание и зачёркивание, включая явные сбросы полужирного и курсива
Читатель импортированных фигур резервирует сырую XML-рабочую память до разбора и кооперативно проверяет бюджеты элементов, байтов и текста; он удерживает порядок рисунков книги и аренды на чтение, не создавая моделей фигур и отсутствующих ячеек
Неизвестные нативные свойства фигур, эффекты, темы, вращения, групповые преобразования, несколько абзацев и неподдерживаемые виды якорей отклоняются явно; разрешённая неподдерживаемая зона вне прямоугольника захвата не блокирует запрошенный регион
Верхний и нижний индекс на уровне run используют две трети размера шрифта run и смещение базовой линии на треть исходного размера в пунктах; граница стиля, разрезающая кластер Unicode-шейпинга, или последовательность CRLF через несовместимые границы runs отклоняется при нативной раскладке
TXLSPortableSceneObject несёт Kind, основанные на пунктах X, Y, Width, Height, прямоугольник отсечения, цвета заливки/контура и непрозрачность, а также необязательные точки пути, текстовую ячейку либо закодированные растровые байты и размеры
TXLSPortableSceneKind содержит xpskRectangle, xpskEllipse, xpskPolyline, xpskPolygon, xpskText, xpskPNG и xpskJPEG; порядок массива — порядок рисования, где поздние объекты перекрывают ранние
Дополнительная перегрузка CreateXLSPortableRenderSnapshot принимает массив TXLSPortableSceneObjects; запросите IXLSPortableRenderSceneSnapshot для Objects и ObjectCount с отсчётом от нуля, чьи геттеры возвращают отсоединённые копии, включая массивы runs, точек и растров
Изображения ячеек и пути флажков предшествуют плавающим рисункам; плавающие рисунки сохраняют порядок книги, физические якоря и отсечение по области просмотра, а текстовые фигуры используют minor-шрифт темы в 11 пунктов с полями текста 7.2 пункта по горизонтали и 3.6 пункта по вертикали
Изображения PNG и JPEG декодируются нативно после preflight заголовка, размера в пикселях и байтов; поддерживаемые плавающие изображения сохраняют прозрачность и геометрию растяжения, а изображения ячеек умещаются внутри ячейки или полного объединённого прямоугольника с сохранением пропорций
Обрезка, вращение, тени, регулировка яркости/гаммы, мозаика, SVG-спутники и живые привязки камеры остаются неподдерживаемыми; сохранённый XML изображения проверяется на соответствие поддерживаемому внешнему виду, поэтому скрытые изображения, неизвестные вложенные метаданные, свойства в чужих пространствах имён, непрямоугольная геометрия изображений и несмоделированные преобразования отклоняются только при пересечении их зоны с захватом
Boolean-флажки ячеек используют нейтральный к теме векторный бокс и необязательную отметку, включая действующие элементы управления, унаследованные от форматов строк и столбцов; обход запрошенных ячеек ограничен до обхода, другие виды элементов управления и пустые или не-Boolean значения флажков отклоняются, а поддерживаемые сцены ячеек подавляют fallback-текст скалярных Boolean или ошибок изображений
Флажок по умолчанию — метаданные вставки и не изготавливает Boolean для отсутствующей ячейки; явная очистка управления прямой ячейки маскирует унаследованный элемент управления, а захват при чтении сохраняет разреженное отсутствие и поколение книги
XLSReadPortableImageDimensions проверяет ограниченный PNG IHDR или поддерживаемый восьмибитный последовательный/прогрессивный кадр JPEG и возвращает объявленные ширину и высоту; декодирование остаётся заботой рендерера
IXLSPortableSceneCaptureSource.ReadPortableSceneObjects использует координаты книги с отсчётом от 1 и координаты сцены в пунктах относительно диапазона, проверяет диапазон и кооперативные лимиты и возвращает израсходованные счётчики байтов, текста и элементов; HasPortableCellScene опознаёт ячейки, чей скалярный показ замещён захваченной сценой
Нативная раскладка считает в CellCount ячейки сетки, а LineCount дополнительно включает текстовые объекты сцены; CellIndex строки текстового объекта равен CellCount плюс его порядковый номер с отсчётом от нуля среди текстовых объектов сцены, тогда как GetCellGeometry остаётся ограниченной ячейками сетки
Скалярные снимки по-прежнему сериализуются как HXRSNP01; снимки с runs или объектами сцены сериализуются как HXRSNP02, а загрузчик принимает обе версии с тем же неизменяемым владением и контрактом отката позиции входа
Объединённый бюджет элементов считает сохранённые ячейки, rich-runs, объекты сцены и точки путей; байтовые лимиты учитывают промежуточные и отсоединённые массивы, текст, закодированные растровые полезные нагрузки и ограниченную инспекцию нативных метаданных до выделения памяти
Переносимый API снимков
| Символ | Контракт |
|---|---|
EXLSPortableRender | Исключение для неверных данных снимка, неподдерживаемого внешнего вида захвата, недоступного нативного backend'а, лимитов ресурсов или сбоев рендеринга |
TXLSPortableFontStyle, TXLSPortableFontStyles | xpfsBold, xpfsItalic, xpfsUnderline и xpfsStrikeout, объединяемые в множество |
TXLSPortableHorizontal, TXLSPortableVertical | xphLeft, xphCenter, xphRight и xpvTop, xpvCenter, xpvBottom |
TXLSPortableBorderStyle, TXLSPortableBorder | xpbsNone, xpbsSolid, xpbsDashed, xpbsDotted и xpbsDouble; каждая граница несёт Style, WidthPoints и ColorRGB |
TXLSPortableCell | Row/Column с отсчётом от нуля, положительные RowSpan/ColumnSpan, отображаемый Text, FontFamily, FontSizePoints, FontStyles, TextColorRGB, FillColorRGB, HasFill, WrapText, ShrinkToFit, RightToLeft, Horizontal, Vertical и четыре записи LeftBorder/TopBorder/RightBorder/BottomBorder |
TXLSPortableCells, TXLSPortableSizes | Динамические массивы сохранённых ячеек и физических размеров строк и столбцов в пунктах |
TXLSPortableRenderLimits | MaxGridCells, MaxStoredCells, MaxBytes и MaxTextCharacters ограничивают конструирование, захват и сериализацию |
XLSDefaultPortableRenderLimits | Возвращает 2000000 ячеек сетки, 2000000 сохранённых ячеек, 67108864 байт и 16777216 символов UTF-16-текста |
XLSDefaultPortableCell | Инициализирует одноячеечный span с Calibri в 11 пунктов и нулевым внешним видом по умолчанию; задайте позицию и желаемый вид до конструирования |
CreateXLSPortableRenderSnapshot | Проверяет и копирует поколение, высоты строк, ширины столбцов и сохранённые ячейки в отсоединённый неизменяемый интерфейс; ячейки должны быть уникальными, в порядке строк, в границах и с неперекрывающимися span |
IXLSPortableRenderSnapshot | Generation, RowCount, ColumnCount, CellCount только для чтения, RowHeightPoints, ColumnWidthPoints с отсчётом от нуля и скопированные записи Cells |
| Геттеры снимка | GetGeneration, GetRowCount, GetColumnCount, GetCellCount, GetRowHeight, GetColumnWidth и GetCell открывают те же значения; неверный индексированный доступ вызывает исключение |
SaveXLSPortableRenderSnapshot | Проверяет и сериализует один снимок в ограниченный приватный буфер, затем копирует полную полезную нагрузку HXRSNP01 или HXRSNP02 в указанный поток по его текущей позиции |
LoadXLSPortableRenderSnapshot | Читает версионированный little-endian снимок со строгим UTF-8-текстом, проверяет счётчики, геометрию, стили и span и отклоняет хвостовые данные; при сбое восстанавливается позиция входного потока |
Все лимиты должны быть положительными; проверенный максимум — 2000000 ячеек сетки и хранения, 1073741824 байт и 268435456 символов текста, с размерами не более 1048576 строк на 16384 столбцов
MaxGridCells считает весь прямоугольник, включая нехранимые пустые ячейки; CellCount считает сохранённые видимые ячейки и якоря объединений и может быть меньше
Generation записывает поколение источника или приложенное значение; это метаданные, а не живая ссылка на книгу и не автоматическая проверка свежести
Нативный рендеринг и явные шрифты
XLSPortableCairoBackendAvailable сообщает о доступности скомпилированного нативного backend'а; нативный вывод требует Free Pascal на Linux или macOS с доступными процессу библиотеками Cairo, FreeType, HarfBuzz и FriBidi
Сборки macOS линкуют четыре нативные библиотеки явно; приватный префикс зависимостей и явный путь загрузчика дочернего процесса могут поставить их, не трогая общие настройки компилятора и профили оболочки
Windows Delphi XE5, Win32 и Win64 могут скомпилировать переносимые интерфейсы и использовать сериализацию снимков, но подготовка нативной раскладки Cairo сообщает там о недоступности backend'а
Передайте явную цепочку шрифтов в PrepareXLSPortableCairoLayout; рендерер сначала пробует совпадение гарнитуры и стиля полужирный/курсив, затем fallback тех же стилей в заданном порядке, требуя покрытие глифами для каждого поддерживаемого текстового кластера
Поставьте фактические файлы regular, bold, italic и bold-italic, которые требует захваченный контент; системного поиска шрифтов и синтетической подстановки полужирного/курсива нет, а отсутствующие файлы, сопоставления стилей или покрытие глифами отклоняются
Байты шрифтов захватываются до шейпинга, поэтому смена файла влияет на поздние раскладки, а существующая раскладка хранит свои захваченные байты; FaceIndex выбирает неотрицательное начертание в файле шрифта или коллекции
Нативные операции сериализуются ради безопасности FreeType-начертаний; неизменяемые снимки и инспекция подготовленной раскладки не требуют живой книги
Fonts[0].FamilyName := 'Calibri'; Fonts[0].FileName := '/srv/fonts/Regular.ttf'; Fonts[0].FaceIndex := 0; Fonts[0].Bold := False; Fonts[0].Italic := False;
Здесь Calibri — явный псевдоним гарнитуры для выбранного файла, что даёт управляемое приложением сопоставление шрифтов; при сопоставлении с другим шрифтом проверяйте метрики вывода
Рендерер поддерживает жёсткие разрывы строк, расширение табуляций в четыре пробела, двунаправленный порядок абзацев, шейпинг лигатур и комбинируемых знаков, жадный перенос и сжатие по размеру; перенос имеет приоритет над сжатием
Перенос сохраняет реализованные границы кластеров комбинируемых знаков, селекторов вариантов, ZWJ и virama и отдаёт предпочтение пробелам и идеографическим пробелам; это не полная реализация графем UAX #29 и алгоритма разбиения строк Unicode, а границы переноса regional-indicator и Hangul-Jamo не гарантируются
Размеры шрифтов разрешаются в 1/64 пункта, а текст отсекается по границам ячейки; PDF встраивает явные шрифты с логическими отображениями текста, SVG использует векторные пути глифов, а PNG рисует те же позиционированные глифы с запрошенным DPI
Подготовка и инспекция раскладки
| Символ | Контракт |
|---|---|
TXLSPortableFontFile, TXLSPortableFontFiles | Одно явное сопоставление содержит FamilyName, FileName, FaceIndex, Bold и Italic; динамический массив упорядочен и содержит от 1 до 64 сопоставлений |
TXLSPortableCairoFormat, TXLSPortableOutputFiles | xpcfPDF, xpcfSVG или xpcfPNG, а также массив имён выходных файлов, возвращаемый файловым сохранением |
TXLSPortableCairoOptions | Ширина и высота страницы, четыре поля, отступ ячеек и растровый DPI, плюс лимиты страницы, глифов, строк, раскладки, вывода, шрифтов, шейпинга и рисования |
XLSDefaultPortableCairoOptions | Инициализирует каждую опцию ограниченными значениями по умолчанию; используйте его до переопределения отдельных полей |
PrepareXLSPortableCairoLayout | Проверяет и копирует снимок, захватывает явные байты шрифтов и возвращает собственную подготовленную TXLSPortableCairoLayout; освобождайте через Free |
TXLSPortableCairoLayout | Открывает PageCount, LineCount, CellCount, GetTextLine, GetCellGeometry, SaveToStream, Save и Destroy |
TXLSPortableTextLineInfo | Скопированная запись строки имеет CellIndex, GlyphCount, XPoints, BaselinePoints, WidthPoints, FontSizePoints и логический Text |
TXLSPortableCellGeometry | Скопированный прямоугольник имеет XPoints, YPoints, WidthPoints и HeightPoints в полной раскладке |
GetTextLine(Index), GetCellGeometry(Index) | Индексированная инспекция подготовленных строк и сохранённых ячеек с отсчётом от нуля; неверные индексы отклоняются |
Разбивка на страницы отсекает фиксированные плитки области печати в порядке «сначала по горизонтали, затем вниз»; ячейка или фрагмент текста, пересекающий границы страниц, появляется на каждой пересекаемой странице — без автоматического ужимания целых ячеек, повторения печатных заголовков листа и интерпретации настройки страниц книги
Опции и границы рендерера
| Поля | Значения по умолчанию и смысл |
|---|---|
PageWidthPoints, PageHeightPoints | 595 на 842 пункта |
MarginLeftPoints, MarginTopPoints, MarginRightPoints, MarginBottomPoints | По 36 пунктов; поля должны оставлять положительный печатный прямоугольник |
CellPaddingPoints, RasterDPI | 2 пункта и 96 DPI; DPI влияет на размеры PNG |
MaxPages, MaxGlyphs, MaxLines | 256 страниц, 2000000 шейпированных глифов и 200000 текстовых строк |
MaxLayoutBytes | 268435456 байт на ограниченную работу раскладки и проверки растровой поверхности |
MaxOutputBytes | 268435456 байт на буфер вывода рендеринга — весь PDF или одна страница SVG/PNG, а не сумма отдельных файлов страниц |
MaxFontBytes | 134217728 байт на файлы явных входных шрифтов одной раскладки |
MaxShapedCharacters, MaxDrawOperations | По 16000000, ограничивая работу шейпинга и рисование постранично-ячеечно |
Неверная или не-конечная геометрия и неположительные бюджеты работы отклоняются; размеры страницы ограничены 100000 пунктов, растровый DPI — 1200, с дополнительными проверками байтов, счётчиков и площади растра перед рендерингом
Нативный пул байтов шрифтов уровня процесса дополнительно допускает не более 256 различных буферов и 256 МиБ; точно идентичные байты могут разделять хранилище, а ёмкость освобождается только когда фактическое начертание, принадлежащее Cairo, освобождает свой буфер
Освобождайте каждую раскладку по завершении; библиотека не сбрасывает общие кэши Cairo, и логически завершённая раскладка может оставить байты шрифтов резидентными, пока нативный Cairo владеет начертанием
Запись вывода и обработка сбоев
SaveToStream(Stream, Format, PageIndex = 0) пишет все страницы для PDF, требуя PageIndex = 0; SVG и PNG пишут выбранную страницу с отсчётом от нуля
Сериализация снимка и нативный рендеринг завершаются в приватных ограниченных буферах до копирования в поток назначения; сбои проверки или рендеринга сохраняют его, но сбой записи в поток вызывающего может оставить частичные байты и следует собственному поведению сбоя этого потока
Save(FileName, Format) пишет один PDF-файл или по одному файлу SVG/PNG на страницу и возвращает их пути; многостраничные имена файлов вставляют суффиксы -0001, -0002 и далее перед расширением
Существующие файловые или каталоговые назначения отклоняются; каждое сохранение ставит все страницы в промежуточное состояние, публикует эксклюзивные новые назначения и удаляет собственные промежуточные и опубликованные выводы при сбое
Файловая система должна поддерживать нативные операции эксклюзивной постановки и публикации ссылок; отдельные сохранения PDF, SVG и PNG — отдельные операции и не образуют общей транзакции
Автономный Linux-потребитель
Tests/Portable/RenderPortableSnapshot.pas — полный потребитель, который загружает снимок, готовит одну раскладку и сохраняет все три формата; соберите его на Linux с установленными переносимыми модулями и нативными библиотеками
fpc -Mdelphiunicode -Fu/path/to/HotXLS/Lib RenderPortableSnapshot.pas ./RenderPortableSnapshot report.hxrs /srv/output/report fonts.tsv 595 842 96
fonts.tsv — UTF-8-текст с четырьмя полями через табуляцию на сопоставление: псевдоним гарнитуры, абсолютный Linux-путь к шрифту, индекс начертания и одно из regular, bold, italic или bolditalic
Calibri /srv/fonts/Regular.ttf 0 regular Calibri /srv/fonts/Bold.ttf 0 bold Calibri /srv/fonts/Italic.ttf 0 italic Calibri /srv/fonts/BoldItalic.ttf 0 bolditalic
Используйте фактические установленные или поставляемые приложением файлы шрифтов и выберите новую базу вывода, потому что существующие файлы назначения отклоняются; добавьте дополнительные fallback тех же стилей для письменностей, не покрытых первым сопоставлением
Stream := TFileStream.Create('report.hxrs', fmOpenRead or fmShareDenyWrite);
try
Snapshot := LoadXLSPortableRenderSnapshot(Stream,
XLSDefaultPortableRenderLimits);
finally
Stream.Free;
end;
Options := XLSDefaultPortableCairoOptions;
Layout := PrepareXLSPortableCairoLayout(Snapshot, Fonts, Options);
try
Files := Layout.Save('/srv/output/report.pdf', xpcfPDF);
Files := Layout.Save('/srv/output/report.svg', xpcfSVG);
Files := Layout.Save('/srv/output/report.png', xpcfPNG);
finally
Layout.Free;
end;
Запись кэшированных диаграмм
XLSRecordCachedChartScene в lxPagination записывает примитивы на основе пунктов существующего рендерера раскладки диаграмм в неизменяемое переносимое представление сцены; её источник должен быть отсоединённым TXLSXChart без владеющего листа и без сохранённого нативного XML, поэтому запись не может разрешать ссылки на лист и обновлять кэши книги
Текущее подмножество поддерживает столбчатые, линейчатые, графики, точечные, круговые, кольцевые и обычные односе́рийные графики площади с одной основной группой построения, конечными числовыми кэшами значений и строго возрастающими ограниченными индексами кэша; кэши категорий точечных диаграмм содержат числовые координаты X, а остальные семейства используют сохранённые подписи категорий
Кэши значений столбчатых, линейчатых, графиков и площади должны иметь непрерывные индексы с отсчётом от нуля; разреженные пропуски категорийных значений отклоняются, и запись никогда не разворачивает отсутствующие индексы в большой массив
Линейчатые графики сохраняют горизонтальную геометрию и категориальные подписи; круговые и кольцевые используют легенды категорий, соблюдают FirstSliceAng и HoleSize и опускают числовые оси, а обычный односе́рийный график площади сохраняет заполненный полигон вокруг нулевой базовой линии
Серии графиков и точечных диаграмм поддерживают независимую видимость линии, явный RGB-цвет и ширину точки через LineVisible, LineColorRGB и LineWidthPoints; LineStyleSet, LineColorSet и LineWidthSet отличают явные настройки от унаследованных значений по умолчанию, а EffectiveLineVisible разрешает существующее соглашение серий «только заливка»
Маркеры поддерживают автоматический круг, явный круг или отсутствие маркера; явный MarkerSize от 2 до 72 задаёт диаметр в пунктах, а MarkerFillSet и MarkerBorderSet отличают явный чёрный RGB-ноль от автоматического выбора цвета; соединяющие сегменты рисуются до непрозрачных маркеров данных
Явные границы маркеров без сохранённой ширины используют обычную линию 0.75 пункта, а образцы легенд ограничивают диаметр круга 6 пунктами; запрошенные шрифты заголовков пишутся и на фактическом rich-text run, и в его свойствах текста по умолчанию, сохраняя видимый размер, цвет и выделение при экспорте диаграммы Excel
Неподдерживаемые семейства диаграмм, составленные или многосерийные графики площади, многосерийные круговые, стили галереи, скруглённые углы, вторичные или объединённые группы построения, оси дат, пользовательские числовые форматы, логарифмические оси, пользовательское поведение пересечения, повёрнутый текст, линии тренда, планки ошибок, иерархические категории, подписи данных, другие формы маркеров и отсутствующие кэши значений вызывают EXLSPortableRender до рендеринга
Пользовательские шрифты делений оси значений, дополнительные (minor) сетки, явные основные/дополнительные единицы, неверные явные цвета серий и неподдерживаемые положения осей отклоняются; легендам линейчатых графиков сейчас требуется обычное размещение справа, а круговым — конечная ненулевая кэшированная сумма и ограниченная геометрия с ранним консервативным резервированием scratch-памяти под дуги
Возвращённый массив сохраняет порядок примитивов рисования, явные цвета, шрифты, выравнивание текста, непрозрачность и границы отсечения диаграммы; учёт элементов, байтов и текста включает консервативные резервирования scratch-памяти рендерера, а кооперативные проверки кэша предшествуют выделению scratch-массивов
XLSValidateCachedChartSceneModel выполняет ту же ограниченную preflight-проверку кэша и внешнего вида на модели без разрешения ячеек листа; мост захвата XLSX использует эту проверку до клонирования и записывает поддерживаемые авторские модели диаграмм с локальными одномерными ссылками A1, физическими нативными смещениями якорей, отсечением диапазонов и порядком рисования
Платформонезависимый рекордер живёт в lxPortableChart; существующие точки входа lxPagination разделяют те же тела раскладки и записи примитивов, сохраняя поведение рендерера Windows и совпадающие байты неизменяемой сцены и учёт бюджета для каждого поддерживаемого семейства
Нативный захват книги на Linux и macOS использует описанную ниже перегрузку с явной геометрией; импортированный RGB-цвет заливки серий, фон области построения, фон и граница диаграммы восстанавливаются из их собственных разрешённых по пространству имён свойств фигур, чтобы вложенный цвет серии не перезаписывал фон области построения
Импортированный сохранённый ChartML принимается только когда поток его элементов, атрибутов и значимого текста, развёрнутый по пространствам имён, совпадает с поддерживаемой типизированной реконструкцией; псевдонимы пространств имён и порядок атрибутов нормализуются, а несмоделированные нативные расширения, чужие атрибуты и неподдерживаемый внешний вид отклоняются консервативно
Бюджеты сырого XML и scratch-памяти реконструкции проверяются до работы клонирования и проецирования; только отсоединённая копия очищает свой проверенный сохранённый XML, а источник сохраняет нативные метаданные, хранилище ячеек, содержимое кэшей и поколение
Захват обходит основополагающий порядок рисунков OfficeArt, включая рамки диаграмм, отсутствующие в публичной обёртке Shapes, и отклоняет пересекающуюся неподдерживаемую рамку, а не молча её пропускает
Классические кэшированные диаграммы с объявленным внешним видом
Захват Classic BIFF8 поддерживает семь обычных семейств диаграмм выше, когда их основные записи, локальные сохранённые значения, явные линейные шкалы и внешний вид представимы; он читает удерживаемые записи и доступные кэши формул, не вычисляя формулы, не разворачивая разреженное хранилище и не клонируя скомпилированные деревья формул
Используйте TXLSWorkbook.CreateReadOnlyViewWithChartAppearance(Source, Limits, Geometry), чтобы создать отдельное read-only представление с замороженным набором значений TXLSClassicChartAppearanceDeclaration, поставляемым через IXLSClassicChartAppearanceSource; Geometry необязателен на Windows и поставляет явные нативные измерения шрифтов на Linux или macOS
TXLSClassicChartAppearanceDeclarations — динамический массив примитивных объявлений, которые приложение может использовать для реализации этого источника
Передайте это настроенное представление в CaptureXLSPortableViewRenderSnapshot(View, SheetIndex, Row1, Col1, Row2, Col2, Limits); координаты отсчитываются от 1, а адаптер восстанавливает активный лист вызывающего, когда захват завершается или отклоняется
Обычные точки входа захвата продолжают отклонять неразрешённый действующий шрифт раскладки или легенды Classic; отдельная точка входа представления использует уже замороженные объявления и поставщика геометрии
| Элемент объявления | Контракт |
|---|---|
Generation, SheetIndex, ObjectId | Закреплённое поколение книги, индекс листа с отсчётом от 1 и фактическая сохранённая идентичность объекта диаграммы; устаревшие поколения, отсутствующие или повторяющиеся идентичности и идентичности другого объекта отклоняются |
HasChartSize, ChartWidthPoints, ChartHeightPoints | Явный конечный положительный размер рамки диаграммы в пунктах; он сохраняет исходное начало якоря и порядок рисования, а false-флаг оставляет размеры, выведенные из якоря |
HasPlotInnerRectangle, PlotInnerRectangle | Явный внутренний прямоугольник построения без подписей и заголовков осей; для этого пути объявленного внешнего вида он обязателен |
HasTitleRectangle, TitleRectangle | Явный прямоугольник заголовка, когда у диаграммы есть заголовок; текст источника, гарнитура, выделение и цвет по-прежнему берутся из проверенных основных записей |
HasLegendRectangle, LegendRectangle | Объявленные границы легенды, когда легенда присутствует |
HasLegendFontSize, LegendFontSizePoints | Явный действующий размер в пунктах от вызывающего для присутствующей легенды; гарнитура, выделение и цвет основных шрифтов сохраняются |
TXLSPortableChartRectangle | Left, Top, Width и Height — конечные пункты относительно захваченной рамки диаграммы; активные прямоугольники требуют положительных размеров внутри этой рамки |
Count, GetCount, ReadDeclaration | Источник сообщает ограниченное количество и возвращает одну примитивную запись на каждый индекс с отсчётом от нуля, пока представление настроено; объявления копируются до последующего захвата |
Эти значения — объявленный вызывающим внешний вид, а не автоматическая раскладка Excel и не выведенное масштабирование шрифтов; берите их из независимо проверенного источника или определённой приложением раскладки и проверяйте вывод с явным нативным сопоставлением шрифтов, использованным для рендеринга
Явные размеры рамки и внутренние границы построения должны оставлять достаточно места для проверенных шрифтов подписей осей; недостаток места для подписей отклоняет операцию, а не обрезает текст и не применяет подобранный масштабный коэффициент
Приложения держат владельца книги живым, пока не освобождено представление; заимствованное представление удерживает аренду на чтение и источник объявлений, а результирующий неизменяемый снимок не удерживает ни книгу, ни поставщика
Поддерживаемая проекция основных данных включает литеральные сплошные заливки, видимые сплошные линии, круглые маркеры, текст заголовка и легенды, размещение категорий и ограниченные явные числовые деления; автоматические шкалы, неразрешённый автоматический вид маркеров, сглаживание, неизвестные rich-расширения, чужие или нелинейные ссылки серий и непредставимые стили точек отклоняются до вывода
Объявление геометрии или размера легенды не даёт права игнорировать неизвестные расширения диаграмм и непроверенные стили; байтовые, текстовые лимиты, лимиты сохранённых ячеек и сцены остаются действующими для удерживаемых исходных данных, объявлений, отсоединённых кэшей и scratch-памяти записи
Дополнительные перегрузки XLSValidateCachedChartSceneModel и XLSRecordCachedChartScene принимают TXLSCachedChartSceneAppearance для отсоединённой модели; инициализируйте её через XLSDefaultCachedChartSceneAppearance до установки явных элементов управления
Низкоуровневый XLSReadClassicChartScene в lxClassicChartScene возвращает принадлежащий вызывающему отсоединённый TXLSXChart и счётчики примитивного внешнего вида и бюджета из удерживаемого TXLSCustomChart, его точного исходного калькулятора и арендованного TXLSClassicChartSceneSource; освободите возвращённую модель после записи
TXLSClassicChartSceneSource.ReadAppearance поставляет примитивное объявление, ReadCell читает ограниченные закреплённые локальные сохранённые значения, ReadFont заполняет указанный текстовый стиль ограниченными действующими данными основного шрифта, а PaletteColor разрешает явные сохранённые записи палитры; реализации приложения должны сохранять закреплённый источник и соблюдать каждую заданную квоту байтов и символов
| Элемент внешнего вида сцены | Смысл |
|---|---|
SeriesMarkerSizePoints | Ограниченные диаметры точек на серию, включая дробные значения; ноль сохраняет размер маркера модели, а ненулевое переопределение должно быть от 2 до 72 пунктов |
OverrideBorder, BorderColorRGB, BorderWidthPoints | Явный внешний вид контура рамки диаграммы |
AxisColorRGB, TickColorRGB, GridlineColorRGB, AxisWidthPoints, TickWidthPoints, GridlineWidthPoints | Явные краски и ширины в пунктах для осей, делений и основных сеток |
AreaFillOpacity, SeriesFillAlpha | Непрозрачность площади и альфа-канал заливки серий |
UseAxisTickControls, CategoryBetween | Проверенные явные элементы управления осями и категориальное размещение |
TitleOffsetXPoints, TitleOffsetYPoints | Конечные смещения, применяемые к обычной позиции заголовка у рекордера |
OverridePlotInnerRectangle, OverrideTitleRectangle, OverrideLegendRectangle, PlotInnerRectangle, TitleRectangle, LegendRectangle | Литеральные прямоугольники в пунктах относительно рамки диаграммы |
PieRadiusRatio | Радиус кругового графика как ограниченная доля меньшего измерения области построения |
Примитивы диаграмм следуют существующей политике раскладки HotXLS; внешний вид галереи диаграмм, требующий несмоделированных значений Excel по умолчанию, остаётся явной неподдерживаемой границей
Прямой нативный захват книги
CreateXLSPortableCairoRenderGeometry(Fonts, Calibration, Generation, Backend, Options, CacheCapacity) возвращает IXLSRenderGeometry, опирающийся на те же явные файлы шрифтов, FreeType, HarfBuzz и шейпинг текста, что и нативный вывод; ширины столбцов используют фактически измеренную максимальную ширину цифры с калибровкой книги
Поставщик владеет отсоединёнными байтами шрифтов и ограниченным кэшем метрик, проверяет бюджеты шрифтов и раскладки до выделения памяти и проверяет запросы измерений до изменения кэшированного состояния; полный кэш может возвращать некэшированные измерения, не выходя за свою ёмкость
Захват проверяет, что поколение поставщика и все поля калибровки совпадают с текущим read-only представлением книги, удерживает поставщика для этого представления и оставляет фабрику геометрии книги по умолчанию без изменений; обычная нативная геометрия по умолчанию остаётся явной границей GDI
Захватите поколение через явно освобождённое представление до создания поставщика; удерживание временного результата интерфейса может удержать его аренду на чтение до конца окружающей области видимости
View := Owner.CreateReadOnlyView; Generation := View.Generation; View := nil; Geometry := CreateXLSPortableCairoRenderGeometry(Fonts, Workbook.CaptureRenderCalibration, Generation, xlsrgbBitmap, XLSDefaultPortableCairoOptions, 4096); Snapshot := CaptureXLSPortableRenderSnapshot(Owner, 1, 1, 1, 30, 6, XLSDefaultPortableRenderLimits, Geometry);
Нативные потребители компилируются с LX_PORTABLE_CORE и соответствующими нативными зависимостями; вызовы фабрики нативной геометрии Cairo на Windows отклоняются явно, а захват на Windows может использовать свою существующую фабрику геометрии через те же перегрузки с ограниченной областью
Фактический нативный захват поддерживает смоделированные скаляры, rich text, поддерживаемые растры, обычные фигуры и семь описанных выше семейств кэшированных диаграмм; захват диаграмм сохраняет исходный импортированный ChartML, кэшированные точки, разреженное хранилище ячеек, упакованное хранилище и поколение Workbook
О неизменяемых областях печати, полях, масштабировании по страницам или процентам, повторяющихся заголовках, ручных разрывах и постраничной разбивке целых и объединённых ячеек см. переносимые планы печати
Расширенный мост захвата
IXLSRenderCaptureSource в lxSemanticSnapshot — внутренний координационный интерфейс, реализуемый поддерживаемыми read-only представлениями книги; обычным приложениям следует вызывать перегрузки захвата на основе владельца
TXLSClassicReadOnlyWorkbookView и TXLSXReadOnlyWorkbookView реализуют IXLSRenderCaptureSource, включая восемь методов рендеринга ниже; эти классы координируют захват через read-only представления, а адаптер управляет их жизненным циклом, пока приложения удерживают интерфейс владельца книги и вызывают CaptureXLSPortableRenderSnapshot
Их существующий метод TryReadCell поставляет снимок сохранённой ячейки через read-only представление; методы рендеринга добавляют отсоединённый внешний вид и геометрию для переносимого захвата
| Элемент или хелпер | Назначение |
|---|---|
ValidateRenderRange | Проверяет границы прямоугольника с отсчётом от 1 и зоны неподдерживаемого внешнего вида до захвата |
ReadRenderStyle | Возвращает отсоединённые метаданные TXLSSemanticCellStyle и флаг наличия rich text для ячейки с отсчётом от 1 |
IXLSRenderRichTextCaptureSource, ReadRenderRichText | Необязательное расширение представления, возвращающее ограниченные отсоединённые TXLSRenderTextRuns; каждый TXLSRenderTextRun содержит Text и действующий семантический Style, используя указанный базовый стиль и положительные квоты run/байтов без материализации ячеек и изменения пулов стилей |
RenderRowHeightPoints, RenderColumnWidthPoints | Возвращают физическую геометрию, сводя скрытые размеры к нулю |
IXLSRenderGeometryCaptureSource, SetRenderCaptureGeometry | Необязательное расширение представления, удерживающее явного поставщика только после проверки поколения и калибровки; неверные поставщики оставляют удерживаемого поставщика представления без изменений |
ReadRenderMerge | Сообщает полный включающий прямоугольник объединения с отсчётом от 1, содержащий ячейку |
ResolveRenderColor | Разрешает семантический внешний вид темы/индексированный/RGB в переносимый RGB-цвет, используя указанное значение по умолчанию там, где поддерживается |
RenderDate1904, RenderRightToLeft | Открывают контекст системы дат книги и порядка чтения листа |
XLSRenderCaptureLiteral | Опознаёт поддерживаемое подмножество литералов Boolean, конечных чисел или простого текста в кавычках для захвата без вычисления |
XLSRenderCaptureIntersects | Проверяет разделённые пробелами локальные диапазоны A1 на пересечение с прямоугольником с отсчётом от 1, отклоняя неразрешённый синтаксис диапазонов |
XLSRenderCaptureCondition | Вычисляет поддерживаемое подмножество условий над существующим скаляром; коды операторов сравнения от 1 до 8 означают между, не-между, равно, не-равно, больше, меньше, больше-или-равно и меньше-или-равно |
XLSRenderCaptureApplyDxf | Применяет поддерживаемый отсоединённый дифференциальный внешний вид с маской AppliedSlots, сохраняя более приоритетное форматирование |
TXLSDxfStyle._MarkRenderUnsupportedAppearance, TXLSDxfStyle._HasRenderUnsupportedAppearance | Внутренние методы координации импорта с префиксом записывают и осматривают внешний вид, который типизированная дифференциальная модель не может безопасно отрендерить; Assign сохраняет маркер, а захват отклоняет отмеченный совпавший стиль |
Эти хелперы моста могут вызывать EXLSSemanticSnapshot; публичный адаптер захвата транслирует это исключение в EXLSPortableRender