PDFium Delphi Component Docs

トランザクションとして扱う書式付きテキスト置換

FPdfStyledEdit を追加し、IPdfRegexEngine を指定して、ネイティブのトップレベルテキストオブジェクトに対する置換を計画/実行します

PlanStyledPdfRegexReplacements は再現可能なソーススナップショットを取得し、実際の Unicode glyph をページ/オブジェクト順で連結して、一致箇所を安定したオブジェクトアンカーに対応付けます。抽出時に生成された空白や改行は含めません

ExecuteStyledPdfReplacements はスナップショットの SHA-256、現在のソース識別、アンカー、重複しない区間を検証してから、独立して読み込んだ文書を変更します

ソース識別には元ファイルのバイトではなく、時刻と識別子を正規化した再現可能なシリアライズを使います。計画には実際のスナップショットバイトと SHA-256 を保存します

可能な限りネイティブフォント、文字サイズ、色、行列を再利用します。オブジェクトやページをまたぐ置換は最初のオブジェクトの書式を使い、後続オブジェクトの消費した文字だけを削除して、残りのテキストとページ順を維持します

FallbackFontName はネイティブの Unicode を再現できない場合の標準 PostScript フォントを明示します。ForceFallbackFont はこの経路を直接要求します

fallback は描画順、行列、描画モード、塗り、線の属性を保持します。clip、透明、marked、tagged のオブジェクトは、グラフィックスの意味を黙って失わずに拒否します

元の境界より広いテキストは、行列が直立して shear がない場合に水平方向へ縮小できます。MinHorizontalScale は既定で 0.5 で、幅が狭い置換テキストは元の行列を維持します

単一行の置換テキストと上限付きの水平 fitting に対応します。入れ子の Form XObject の走査、Tagged PDF の意味の書き換え、段落の reflow は行いません

署名または暗号化された文書と XFA は拒否します。キャンセル、古い計画、不正な UTF-16、未対応のフォント、上限超過では呼び出し元の文書を変更しません

PreviewOnly は呼び出し元を置き換えず、独立して開き直した結果を PreviewPdf に返します。正常な commit でも、保存/再読み込み後の glyph 抽出とページ数を確認してから文書を置き換えます

ネイティブオブジェクトを変更する前に、すべての一致を最終テキストへ組み立てます。fitting と最小倍率は元の境界に対して一度だけ確認し、繰り返し一致による過剰な縮小を防ぎます

空の置換で完全に消費されたテキストオブジェクトは、すべてのアンカー編集後に削除します。複数置換は逆順に実行し、前方のソースオフセットを維持します

既定の上限は文書 256 MiB、10,000 ページ、100,000 テキストオブジェクト、16,777,216 UTF-16 単位、100,000 置換です。テキスト走査の作業上限はネイティブ文字の訪問と UTF-16 計画コピーの合計 67,108,864 単位です

ハード上限もページ、オブジェクト、文字、置換は同じで、文書は 512 MiB、走査訪問は 1,073,741,824 までです。fallback フォント名は 1,024 バイトまでです

報告にはソースと出力の SHA-256、適用した置換、fallback、縮小の件数、オブジェクトごとの元/最終テキストと PDF ユーザー空間のポイント境界を含みます。ページとオブジェクト番号は 0 始まりのソース番号です

置換処理は安全な墨消しの手順ではありません。機密内容と関連する文書データの削除には専用の墨消し API を使ってください

Options := TPdfStyledEditOptions.Default;
Plan := PlanStyledPdfRegexReplacements(Pdf, Pattern, Replacement, Engine, Options);
Options.PreviewOnly := True;
if not ExecuteStyledPdfReplacements(Pdf, Plan, Options, PreviewPdf, Report) then
  raise EPdfProduction.Create(Report.ErrorMessage);

公開宣言

type
  TPdfStyledEditOptions= record
    MaxDocumentBytes: Integer;
    MaxPages, MaxTextObjects, MaxCharacters, MaxReplacements: Integer;
    MaxTextScanWork: Int64;
    MinHorizontalScale: Double;
    FallbackFontName: AnsiString;
    ForceFallbackFont: Boolean;
    PreviewOnly: Boolean;
    CancellationToken: IPdfCancellationToken;
    class function Default: TPdfStyledEditOptions; static;
  end;
  TPdfStyledEditPlan= record
    SourceSha256: string;
    SourceBytes: TBytes;
    Spans: TPdfStyledSpans;
    Replacements: TPdfStyledReplacements;
  end;
  TPdfStyledObjectChange= record
    PageIndex, ObjectIndex: Integer;
    BeforeText, AfterText: WideString;
    BeforeBounds, AfterBounds: TPdfRectangle;
    HorizontalScale: Double;
    FontFallback: Boolean;
  end;
  TPdfStyledObjectChanges= array of TPdfStyledObjectChange;
  TPdfStyledEditReport= record
    Succeeded, Cancelled, PreviewOnly: Boolean;
    AppliedReplacementCount, FontFallbackCount, ScaledObjectCount: Integer;
    SourceSha256, OutputSha256, ErrorMessage: string;
    Changes: TPdfStyledObjectChanges;
  end;

function PlanStyledPdfRegexReplacements(Pdf: TPdf;
  const Pattern, Replacement: WideString; Engine: IPdfRegexEngine;
  const Options: TPdfStyledEditOptions): TPdfStyledEditPlan;
function ExecuteStyledPdfReplacements(Pdf: TPdf;
  const Plan: TPdfStyledEditPlan; const Options: TPdfStyledEditOptions;
  out PreviewPdf: TBytes; out Report: TPdfStyledEditReport): Boolean;