スパンベースの単純オブジェクト解析

HPDFParser ユニットは、トークンまたはネストされたコンテナの部分文字列をコピーせずに、スタンドアロンの PDF ディクショナリと配列を解析します

エントリポイント

function HPDFParserParseSimpleDictionary(
  const Data: AnsiString;
  RecursionLevel: Integer = 0): THPDFDictionaryObject;

function HPDFParserParseSimpleDictionaryWithStatistics(
  const Data: AnsiString;
  out Statistics: THPDFParserViewStatistics;
  RecursionLevel: Integer = 0): THPDFDictionaryObject;

function HPDFParserParseSimpleArray(
  const Data: AnsiString): THPDFArrayObject;

function HPDFParserParseSimpleArrayWithStatistics(
  const Data: AnsiString;
  out Statistics: THPDFParserViewStatistics): THPDFArrayObject;

返されるディクショナリまたは配列は呼び出し側が所有し、ソース文字列の有効期間に依存しない通常の永続 HotPDF オブジェクトを含みます

ビュー統計

THPDFParserViewStatistics は、SourceBytes、TokenViewCount、MaterializedStringCount、MaterializedBytes、ObjectCount、ContainerCount、MaxDepth、ErrorCount、Valid を公開します

トークンビューは境界付きソース範囲をカウントし、具体化文字列カウンターは永続 PDF 名、キー、文字列にコピーされたバイトをカバーします

サポートされるオブジェクト

パーサーは、名前、整数、実数、ブール値、null、間接参照、リテラル文字列、16 進文字列、配列、ディクショナリを認識します

リテラル文字列は、ネストされた括弧、エスケープされた区切り文字、8 進エスケープ、エスケープされた行継続を保持し、PDF の空白とコメントは無視されます

エスケープされていない CR、CRLF、LF の行末は、リテラル文字列内で行末ごとに 1 つの LF にデコードされます。\r や \015 のようなエスケープされた復帰は CR バイトのまま残り、バックスラッシュによる行継続はバイトを追加しません

ネストされたコンテナは不変入力上の 1 つのカーソルを共有し、再帰は境界付きであり、重複したディクショナリキーは大文字小文字を区別したマッチングで以前の値を置き換えます

不正な区切り文字は、隣接する有効なトークンをスキップせずにリカバリーカーソルを進めます。開き括弧なしで供給された配列本体も、迷子の閉じ括弧から回復し、それを ErrorCount で報告します

パフォーマンス特性

名前と文字列は永続オブジェクト境界で 1 回具体化され、数値変換はソースバイトを直接読み取り、操作ローカルのオープンアドレス索引は大きなディクショナリ構築中の 2 次重複スキャンを防ぎます

30,000 ペアの Win32 回帰フィクスチャは、5 パス割り当てバイトを 50,866,510 から 17,936,800 に、経過時間を 3,656 ms から 46 ms に削減しました

関連項目: スケーラブルでランダムアクセスな PDF ローディング、境界付き PDF パーサー予算