宣言型レイアウト 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 を使用します
コンポーネント
THPDFDOMTextは Unicode テキストをラップし、幅と継承されたテキストメトリクスによって行境界をキャッシュし、ソーステキストをコピーせずにソース文字範囲を通じて分割しますTHPDFDOMSpacerは垂直スペースを予約し、ページをまたがって分割できますTHPDFDOMStackは、継承されたパディングとスペーシングで所有子を垂直に配置しますTHPDFDOMContainerは 1 つの所有子の周りにスタイル付きボックスを追加し、分割継続を転送しますTHPDFDOMTableは重み付き列を解決し、スタイル付き行とセルを描画し、継続ページで先頭ヘッダー行を繰り返しますTHPDFDOMListは、ラベルと本体コンポーネントを持つ番号付きまたは番号なしのリスト項目を作成しますTHPDFDOMImageは複製されたグラフィックを所有し、明示的な寸法を解決し、figure セマンティクスと圧縮制御を提供します
すべてのコンポーネントは、安定した 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 は、同じドキュメント、スタイル、コンポーネント、テーブル、セクション、レンダラー、統計サーフェスをエクスポートします