XFA Packet DOM

TXFAPacketDOM은 완전한 XDP stream 또는 순서 있는 PDF /XFA packet array를 로드하고, packet root와 bounded local-name path query를 노출하며, 요소, text, CDATA, attribute, packet 추가/제거/이름 바꾸기 편집을 지원합니다

무손실 untouched packet

로드된 각 stream이나 packet은 원본 바이트와 구조 fingerprint를 유지합니다. DOM이 손대지 않은 채면 serialization은 그 바이트를 그대로 돌려주고, packet-array 편집은 바뀐 packet만 다시 쓰며 손대지 않은 형제 packet은 바이트 단위로 보존합니다

수정된 출력의 canonical 형태

수정된 트리는 UTF-8 XML, 결정적인 namespace와 attribute 순서, qualified element 이름, XML entity escaping, 끼워 넣은 ]]>를 위한 안전한 CDATA 분할, self-closing 빈 요소, 소스 array의 packet 순서를 사용합니다

canonical 출력은 lexical 잔물경이 아니라 DOM 콘텐츠를 대표하므로, 편집 뒤에는 주석, processing instruction, 소스 들여쓰기, 원본 XML declaration, 소스 DOCTYPE이 재생되지 않습니다. 내부 entity 값은 text로 확장되고 외부 entity는 resolve되지 않은 채 남습니다

query와 편집

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;

앞에 붙은 //는 bounded descendant query를 수행하고, 슬래시로 구분된 segment는 직계 자식을 고릅니다. *는 임의 요소에 대응하고, 0부터 세는 [N] 접미사는 일치 항목 하나를 고릅니다

packet-array 공개

SerializePacketArray는 순서 있는 TXFAPacketData 레코드를 돌려줍니다. 각 레코드를 THotPDF.AddXFAPacket에 넘기거나, 단일 stream 형태에는 THotPDF.SetXFADocument와 함께 SerializeXDPStream을 쓰세요

Budget

TXFADOMLimits.Default는 입출력 바이트 합계, 패킷 수, 노드 수, 깊이, 노드당 속성 수, 속성 및 텍스트 바이트 합계, MaxQueryResults의 상한을 정합니다. 이 한계를 넘으면 파싱, 변경 검증, 쿼리, 핑거프린트 계산, 직렬화가 EHPDFXFAError와 함께 실패합니다

TXFAPacketDOM, TXFANode, TXFADOMLimits 참조