XFA Packet DOM
TXFAPacketDOM загружает либо полный XDP-поток, либо упорядоченный массив пакетов PDF /XFA, открывает доступ к корням пакетов и ограниченным запросам по пути из локальных имён, а также поддерживает правку элементов, текста, CDATA и атрибутов, добавление, удаление и переименование пакетов
Нетронутые пакеты без потерь
Каждый загруженный поток или пакет хранит свои исходные байты и структурный отпечаток; сериализация возвращает ровно эти байты, пока DOM не тронут, а правка массива пакетов перезаписывает только изменённый пакет, сохраняя байт в байт всех нетронутых соседей
Канонический вывод после правок
Изменённые деревья сериализуются в UTF-8 XML с детерминированным порядком namespace и атрибутов, квалифицированными именами элементов, экранированием XML-сущностей, безопасным разбиением CDATA при встроенном ]]>, самозакрывающимися пустыми элементами и порядком пакетов из исходного массива
Канонический вывод представляет содержимое DOM, а не лексические мелочи, поэтому комментарии, инструкции обработки, исходные отступы, исходная XML-декларация и DOCTYPE из источника после правки не воспроизводятся; значения внутренних сущностей раскрываются как текст, а внешние сущности остаются неразрешёнными
Запросы и правки
var
DOM: TXFAPacketDOM;
Nodes: TArray<TXFANode>;
XDP: TBytes;
begin
DOM := TXFAPacketDOM.Create;
try
DOM.LoadXDPStream(SourceBytes);
Nodes := DOM.SelectNodes('datasets', '//customer/name');
if Length(Nodes) > 0 then
Nodes[0].SetText('Updated & verified', True);
XDP := DOM.SerializeXDPStream;
PDF.SetXFADocument(XDP);
finally
DOM.Free;
end;
end;
Ведущий // выполняет ограниченный поиск среди потомков, а сегменты, разделённые слэшем, выбирают прямых детей; * соответствует любому элементу, а суффикс [N] с нумерацией с нуля выбирает одно совпадение
Публикация массива пакетов
SerializePacketArray возвращает упорядоченные записи TXFAPacketData; передавайте каждую запись в THotPDF.AddXFAPacket или используйте SerializeXDPStream вместе с THotPDF.SetXFADocument для варианта с единым потоком
Лимиты
TXFADOMLimits.Default ограничивает суммарные байты ввода и вывода, число пакетов, число узлов, глубину, атрибуты на узел, суммарные байты атрибутов и текста, а также MaxQueryResults; разбор, валидация изменений, запросы, снятие отпечатков и сериализация завершаются ошибкой EHPDFXFAError при пересечении любой границы
См. также TXFAPacketDOM, TXFANode и TXFADOMLimits