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