スパンベースの単純オブジェクト解析
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 に削減しました