上限付き段落編集
HPDFParagraphReflow は明示的なソース矩形内の読み込み済みグリフ中心を選択し、同じページの明示的なターゲット矩形内に新たに計測した段落を書き込みます
受け入れプロファイルは Delphi Win32 / Win64 と Windows FPC / Lazarus をカバーします。計測フォント生成は既存のドキュメント外観ビルダーとそのインストール済みフォント対応を使います
選択、レイアウト、保存
座標は回転なし PDF ページユーザー空間ポイントで、y 軸は上向きです。両矩形は有限で、寸法は正かつ 14400 ポイント以下、ページ MediaBox に収まる必要があります
選択は複数の元ベースラインと複数のページコンテンツストリームにまたがれます。リテラル、16 進、TJ、一重引用符、二重引用符のテキストオペランドは選択された文字コード境界で書き換えられます
保持されたプレフィックス / サフィックス、テキスト送り、元の数値カーニング調整はその場に残ります。ソーステキストは背景矩形で隠されるのではなく、実際のオペランドから除去されます
ネストした Form XObject は自身の Matrix と BBox を使います。選択された各呼び出しとその祖先リソースはプライベートにコピーされ、元の Form を共有する他の呼び出しや他のページは保存されます
Form BBox の外にあるグリフ中心は除外されます。部分的なソースグリフ境界はデフォルトで拒否され、RejectPartialSourceGlyphs = False を指定すると、中心が選択された文字コード全体の除去を明示的に許します
Appearance がインストール済みフォント、スタイル、サイズ、色、パディング、配置、オーバーフローポリシーを選びます。ターゲット幅が折り返しを制御し、shrink-to-fit は実際の EffectiveFontSize を報告します
生成されたグリフ形状は独立に解釈され、ターゲット矩形に対してチェックされます。この上限付きヘルパーでは回転は 0、不透明度は 1 に固定です
空の置換テキストは選択されたソーステキストを削除します。空のソース領域へ段落を挿入するには RequireSourceText = False を設定してください
衝突エビデンス
選択されていない空白以外のテキスト、XObject / インライン画像、ペイントされたパス境界、注釈矩形が、生成された置換グリフ境界と比較されます
各衝突は種類、ページ空間境界、省略可能な隣接テキスト、置換グリフインデックスを特定します。返される衝突リストが上限に達しても総数は保持されます
パス制御点、変換された Form クリップ境界、ストローク幅 / miter 上限は保守的なボックスを生成します。ペイント範囲の不明なシェーディングは保守的にターゲット矩形全体を占有します
この形状テストは、透過画像、ペイントされていない注釈領域、曲線、クリップされたパス、回転された Form エンベロープを過大報告しえます。ピクセル完全なインク分離を実証するものではなく、任意のクリッピングパス、ブレンド合成、フォントアウトラインを検査しません
RejectCollisions = True は変更なしで重なる置換を拒否します。false にすると、呼び出し側の意図的な重なりポリシーを許しつつレポートを保持します
プレビュー、コミット、ロールバック
HPDFPreviewParagraphReflow は呼び出し側所有の封印済みプラン、セマンティック置換レイアウト、フィンガープリント、衝突エビデンスを返し、その後生成されたドキュメントオブジェクトをロールバックします
HPDFCommitParagraphReflow は上限付き分析を繰り返し、ソースコンテンツ、Form 境界、注釈ジオメトリー、置換フォント形状がまだプレビューと一致するときにのみプランをアトミックに適用します
プランは同じライブドキュメントインスタンスに属します。使い終えたら解放し、あいだ中ドキュメントを生存させ、別のドキュメントをロードしたり選択コンテンツを変更したりしたらプレビューを再生成してください
THPDFParagraphReflowSession は適用済みレビュー状態を追加します。Apply が抽出 / レンダリング用に編集済みドキュメントを公開し、Commit が発行し、Rollback または破棄が元のグラフを復元します
セッションは直列に使ってください。ドキュメントはセッションより長く生存しなければならず、Pending が true のあいだは他のグラフトランザクションや編集呼び出しを挟めません
ロールバックはインメモリードキュメント状態を復元します。すでに保存された外部ファイルは呼び出し側の責任のままです
有限作業と失敗時の挙動
デフォルト上限は、デコードコンテンツ 64 MiB、生成ストリーム 64 MiB、作業ユニット 100000000、グリフ 100000、トークン 250000、Form レベル 12、Form 呼び出し 256、返される衝突 256、クローンされたリソースノード 100000 です
エンコード済み文字列バイトはグリフ解釈の前に残りグリフ上限に対してチェックされるため、マルチバイト文字エンコーディングは可視グリフ数より保守的に多くの予算を消費しえます
デコード / 生成上限はヘルパーが扱うコンテンツをカバーします。生成ストリームサイズは公開前にチェックされますが、プロセスのピークメモリー上限を表すものでも、すべてのインストール済みフォントビルダー割り当てを上限付けするものでもありません
キャンセルはコンテンツトークン化とヘルパーループを通じて協調的に行われ、既存のフォント生成呼び出しの周囲にもチェックがあります。トークンは呼び出しが完了するまで保持してください
ソース欠落、不正な入力、衝突、古いプラン、未対応コンテンツ、予算枯渇、キャンセル、通常の失敗は false と明示的なステータスを返し、元のオブジェクトグラフを保存します
選択された縦書き / 単一テキスト、循環 / 未解決 Form、未対応のペイント XObject タイプ、署名フィールドを含むドキュメントは拒否されます。署名を保持するインクリメンタル編集には別のワークフローが必要です
例
Options := HPDFDefaultParagraphReflowOptions;
Options.Appearance.FontName := 'Arial';
Options.Appearance.FontSize := 11;
Source.Left := 55; Source.Bottom := 659;
Source.Right := 350; Source.Top := 714;
Target := Source;
Plan := nil;
try
if HPDFPreviewParagraphReflow(Document, 0, Source, Target,
'The Supplier must deliver signed monthly reports.', Options,
Plan, Report, CancellationToken) then
if HPDFCommitParagraphReflow(Document, Plan, Report, CancellationToken) then
Document.SaveLoadedDocument('reviewed-contract.pdf');
finally
Plan.Free;
end;
受け入れと保存出力
専用の Delphi / FPC ランナーは、マルチベースライン段落、部分オペランド、ネスト共有 Form、クリップされた Form テキスト、幅 / フォント変更、衝突種別、キャンセル、グラフロールバックに実際のロード済み PDF フィクスチャーを使います
繰り返される file / file と stream / file の保存は編集済みグラフを保持します。新規の変更なしロード済みドキュメントは正確なソースバイトを保ち、注入された出力書き込み失敗の後に成功するリトライが可能です
Tests/Fixtures/ParagraphReflow/loaded-repeat-save.pdf は、段落ヘルパーを使わずに保存リグレッションを分離します。ロード、マーカー挿入、2 回の保存、2 つ目のファイルの独立読み取りを行います
Tests/Delphi/Run-ParagraphReflowTests.ps1 -Platform Win64 または Tests/FPC/Run-ParagraphReflowTests.ps1 -Platform Win64 を実行し、もう一方のアーキテクチャーは Win32 を選択してください
オプションの Python 検証器 Tests/Fixtures/ParagraphReflow/verify_output.py は PyMuPDF で実際に保存された Unicode テキストを抽出し、編集済みページをレンダリングします。すべてのランナーはビュアー自動起動を抑止します