宣言型レイアウト DOM

HPDFLayoutDOM は、THPDFLayoutElement、MeasureLayoutElement、PlaceLayoutElement、所有オーバーフローフラグメント、ImmediateFlushLayout の上に再利用可能なドキュメントコンポーネントを構築します

ドキュメントとセクションの構成

Document := THPDFDOMDocument.Create;
Renderer := THPDFDOMRenderer.Create;
try
  Section := Document.AddSection;
  Section.PageWidth := 595.28;
  Section.PageHeight := 841.89;
  Section.Header := THPDFDOMText.Create('Quarterly report');
  Section.Footer := THPDFDOMText.Create('Confidential');
  Section.Body.Style.Padding := 12;
  Section.Body.Style.Spacing := 8;
  Section.Body.AddText(BodyText, 'Narrative');

  PDF.OutputStream := Output;
  PDF.ImmediateFlushLayout := True;
  Statistics := Renderer.Render(Document, PDF);
finally
  Renderer.Free;
  Document.Free;
end;

THPDFDOMDocument はそのセクションを所有し、各 THPDFDOMSection は本文、ヘッダー、フッター、スタイルを所有し、各スタックまたはコンテナはそれに接続されたコンポーネントを所有します

THPDFDOMRenderer.Render はターゲットドキュメントを開始および終了し、各セクションごとに新しいページを作成し、継続ページでセクションファニチャを繰り返し、ページ、配置、分割、ファニチャ、構造、マーク付きコンテンツ、アーティファクト、最大継続統計を返します

すべての THotPDF 出力、圧縮、適合性、レイヤー、即時フラッシュオプションを Render を呼び出す前に設定してください

GenerateStructure はデフォルトで True になるため、レンダラーは継続安全な論理構造ツリーも構築し、ターゲットに言語がない場合は THPDFDOMDocument.Language を使用します

コンポーネント

すべてのコンポーネントは、安定した Name、Path、Style、Clone、Measure、Draw、Split コントラクトに加えて、セマンティックロール、言語、代替テキスト、置換テキスト、展開テキスト、アーティファクトオーバーライドを公開します

トップレベルの本文走査は線形であり、コンポーネントを複製しません。テキストとテーブルの継続は、完全なコンテンツツリーをコピーする代わりに、範囲または行スライスのメタデータを保持します

スタイルの継承

THPDFDOMStyle は、フォント名、サイズ、スタイル、テキスト色、背景、境界線、パディング、スペーシング、行の高さを親チェーンを通じて解決します

セクションスタイルは本文とファニチャの親であり、スタックまたはコンテナスタイルは子の親であり、テーブルスタイルは行を介してセルに流れます

明示的に割り当てられた値だけが親を上書きします。Clear はローカル割り当てと親リンクを削除し、Assign は所有権や祖先をコピーせずにローカル割り当てをコピーします

64 レベルより深い親チェーンは、循環または無制限として拒否されます

再利用可能なコンポーネントファクトリー

THPDFDOMComponentFactory は、呼び出しごとに 1 つの呼び出し元所有の THPDFDOMComponent インスタンスを作成する匿名関数です

Document.RegisterComponent('notice',
  function: THPDFDOMComponent
  begin
    Result := THPDFDOMContainer.Create(
      THPDFDOMText.Create('Reusable notice'));
  end);

Section.Body.Add(Document.CreateComponent('notice'));

ファクトリー名は大文字と小文字を区別せず一意であり、各呼び出しは新しいコンポーネントインスタンスを返す必要があり、受信コンテナは Add の後に所有権を取得します

宣言された 1 つのコンポーネントを複数の所有サイトで再利用する必要がある場合は、SetHeaderClone、SetFooterClone、または Clone を使用してください

反復ヘッダーのテーブル

Table := THPDFDOMTable.Create('Orders');
Table.AddColumn(1);
Table.AddColumn(3);
Header := Table.AddRow(18, True);
Header[0].Text := 'ID';
Header[1].Text := 'Description';

Row := Table.AddRow(22);
Row[0].Text := '1001';
Row[1].Text := 'Bounded streaming layout';
Section.Body.Add(Table);

ヘッダー行は連続していて本文行より前に置く必要があり、正の列重みが利用可能な幅を分割し、行の高さは明示的な正の値です

RepeatHeaders が true の場合、分割ではすべての先頭ヘッダー行と少なくとも 1 つの本文行のための余地が必要になり、ヘッダーのみの継続ページを防ぎます

ページ分割と失敗境界

レンダラーはまず各コンポーネントを残りの本文長方形に対して再測定し、可能な場合は分割不可能な最小フラグメントを新しいページに移動し、すべての有効な分割を PlaceLayoutElement に委任します

空の本文ページに収まらない要素は、コンテンツを黙って破棄せずに、安定した要素パス付きの例外を発生させます

MaximumContinuationDepth はデフォルトで 100,000 で、進捗しない継続を繰り返し返す不正なコンポーネントを制限します

セクションページの寸法は正である必要があり、マージンとファニチャの間隔は負にできず、ヘッダーとフッターのジオメトリは正の本文長方形を残す必要があります

C++Builder

std::unique_ptr<THPDFDOMDocument> document(new THPDFDOMDocument());
THPDFDOMSection* section = document->AddSection();
section->Header = new THPDFDOMText(L"Report", "Header");
section->Body->AddText(L"Declarative content", "BodyText");

std::unique_ptr<THPDFDOMRenderer> renderer(new THPDFDOMRenderer());
THPDFDOMRenderStatistics statistics =
    renderer->Render(document.get(), pdf.get());

生成された HPDFLayoutDOM.hpp は、同じドキュメント、スタイル、コンポーネント、テーブル、セクション、レンダラー、統計サーフェスをエクスポートします

関連 API