HTML5 ページドメディアインポート
THPDFHTMLImporter.RenderHTML5 は、寛容な HTML5 マークアップと印刷 CSS をページ分割された PDF コンテンツに変換し、コンパクトなレガシー RenderHTML パスを保持します
CSS の長さと、インポーターの Margin、BaseFontSize、ListIndent、BlockSpacing はポイント単位です。そのため THotPDF.Resolution に何を設定しても、両方のレンダラーは同じページを生成します。インポートの前後で自分が描く図形やテキストは、従来どおり 1/Resolution インチ単位のままです
宣言
function RenderHTML5(
const HTML: WideString;
const AuthorStyleSheet: WideString = ''
): Boolean;
function HPDFRenderHTML5Document(
Doc: THotPDF;
const HTML: WideString;
const AuthorStyleSheet: WideString = '';
MarginPt: Single = 72;
const FontName: AnsiString = 'Arial';
FontSize: Single = 12
): Boolean;
プロファイル契約
HTML5ProfileVersion は 1 を返し、HTML5ProfileMilestones はパーサーとカスケード、ページドレイアウト、テーブルとフォーム、境界付きリソースを報告します
- 寛容な DOM は一般的な省略された終了タグを受け入れ、テキスト順を保持し、非アクティブなドキュメント領域をスキップし、
MaxDOMNodesを適用します - カスケードは、型、クラス、ID、等値属性、子孫、直接子セレクター、ソース順、特異度、インライン宣言、
!important、@media print、@pageマージンをサポートします - ページドレイアウトは、ブロックフロー、見出し、リスト、境界線、背景、ボックス間隔、明示的なページブレーク、テーブル、画像、自動オーバーフローページ分割をサポートします
- テキスト入力、ボタン、チェックボックス、ラジオボタン、テキストエリア、セレクトコントロールは、
CreateAcroFormsが有効な場合、静的表示またはネイティブ AcroForm フィールドとしてレンダリングされます
計測済み段落と書字方向
段落は、現在のフォントの計測済みアドバンスを使って折り返されます。フォントの変更、太字 / 斜体ラン、文字間隔、単語間隔、明示的な改行、東アジア文字の境界も含まれます。配置と装飾は、結果として得られる各行に個別に適用されます
direction: ltr、direction: rtl、HTML の dir 属性が段落の方向を選択します。dir="auto" は最初の強い文字の Unicode 方向を使います
Windows では、双方向スクリプトのランは Uniscribe で解決され、スタイル境界をまたいで並べ替えられます。ラン内のグリフシェーピングは既存の PDF テキストエンジンが処理します。ドキュメントの方向、ビューア設定、保存済みページテキスト状態は行の処理後に復元されます
インラインでの方向上書き、bdi、bdo は現在のところ段落の順序を使い、hdkLayoutFallback の診断を出します。unicode-bidi はこのプロファイルの範囲外で、スクリプトのシェーピングは引き続きドキュメントのシェーピング設定に従います
段落の断片化
widows と orphans は継承される正の整数で、どちらもデフォルトは 2 です。ページ分割では、文字数の推定ではなく計測済みの行ボックスが使われます
インポーターは、ページブレークの前後に要求された最小行数を残すよう、段落を移動するか分割位置を調整します。break-inside: avoid は、新しいページに収まる場合に段落を 1 かたまりに保ちます
要求された制約を 1 ページに満たせない場合、レンダリングは制約を緩めて進行し、hdkPaginationConstraint を記録します。各ページ断片は独自の背景と境界線を受け取ります
オプションのハイフネーション
hyphens: none は任意の改行を抑制し、デフォルトの hyphens: manual は U+00AD または ­ を使います。可視のハイフンは、選択された改行が使われたときにだけ出力されます
hyphens: auto はさらに、単語と継承された HTML lang 値を渡して OnHyphenate を呼び出します。コールバックがなければ手動改行を保持し、レイアウトフォールバックを報告します。言語辞書は同梱されていないためです
改行位置は、単語の先頭から UTF-16 コード単位で数えます。無効な位置、範囲外の位置、サロゲートペアをまたぐ位置、基本的な結合記号をまたぐ位置は無視されます
THPDFHTMLHyphenationEvent = procedure(
Sender: TObject;
const WordText, Language: WideString;
var BreakPositions: TArray<Integer>
) of object;
境界付き flex と grid ボックス
display: flex は row、row-reverse、column、column-reverse に対応します。行の子は明示的な幅を使うか残りの幅を共有し、正の flex-grow 値は追加スペースの配分比率になります
行は justify-content の start、end、center、space-between、space-around、space-evenly と、start、end、center、stretch の交差軸配置に対応します。列フローは自然な縦レイアウトに対応し、未対応の固定高さ配分や交差軸配置では診断を出力します
display: grid は、正の固定長と fr の列トラックに対応し、最大 64 列の境界付き repeat(n, tracks) も含みます。セルはソース順に、1 行ずつ埋めながら配置されます
grid-column: span N と grid-column-end: span N は、子が連続するトラックとその間のギャップを占有することを許します。現在の行に収まらない項目は次の行へ移り、トラック数を超える span はレイアウトフォールバックになります
flex-wrap: wrap は、次の項目の明示的な幅とギャップが収まらないとき新しい行を開始します。各行は独立して flex-grow と justify-content を適用します。row-reverse と RTL は、項目を行間で移動させずに各行内の位置を反転させます
gap は 1 つまたは 2 つの長さを受け付け、独立した row-gap と column-gap の上書きも可能です。並列の行は 1 ページに収まり、描画前にチェックされます
並列の子は、インラインスタイル付きテキストブロック、パディング・境界線・背景を持つ再帰的にネストした通常ブロックコンテナ、ネストした flex と grid コンテナ、画像、静的またはネイティブなフォームコントロールに対応します
画像はコールバック提供または data URI のバイトを使い、高さを指定しなければ固有のアスペクト比を保持し、DOM ノードごとに 1 回だけデコードされます。プリフライトとフォールバックは同じキャッシュ済み画像を再利用し、リソース要求を追加で消費しません
すべての子ボックスは、並列の行を描画する前に計測されます。そのため未対応または過大なコンテンツは、描画済みの行を繰り返すことなく縦のページフローへフォールバックします。ネストした計画は 64 レベルに境界付けられ、既存のレイアウト操作予算を消費します
明示的な幅を持たない折り返し子は 1 行全体を占有します。並列の子の中のテーブルとリスト、flex basis と shrink、wrap-reverse、固有トラックサイズ、grid の行トラックと行 span、明示的な grid 配置は、このプロファイルの範囲外であり、観測可能な診断を出します
未対応 CSS の診断
Diagnostics は、Kind、Subject、Value、MessageText を含むレコードを公開します。OnDiagnostic はレンダリング中に同じ情報を受け取ります
未知のプロパティ、未対応の値、未対応のセレクター、未対応の at-rule は、診断付きで無視されます。それ以外では使われないスタイルシートルール内の宣言も含まれます。擬似セレクターは通常の型セレクターとして扱われずスキップされます
デフォルトで無効になっている StrictCSS は、診断時に EHPDFHTMLUnsupportedCSS を発生させます。それ以前のコンテンツはすでに出力済みの場合があるため、全か無かのインポートが必要な呼び出し側は別のドキュメントを使ってください
MaxDiagnostics のデフォルトは 256 で、保持されるレコードを境界付けます。保存上限に達した後も DiagnosticCount とコールバックの配信は観測可能で、非正の上限はレコード保存を無効にします
境界付きリソース
外部スタイルシート、画像、@font-face フォントは、OnResource がそれらのバイトを提供しない限り無効になるため、HTML インポートはファイルやネットワーク接続を暗黙的に開きません
@font-face は 1 つの url(...) ソース、省略可能な format('truetype') または format('opentype')、ファミリーエイリアス、normal / italic のスタイル、normal、bold、400、700 のウェイトに対応します。font-display は標準のポリシーを受け付けます。オフラインのインポートはリソースを同期的に読み込むためです
フォントは、31 文字以内の ASCII Windows ファミリー名を持つ、埋め込み可能な TrueType または OpenType sfnt リソースでなければなりません。WOFF、フォントコレクション、local(...)、可変フォントディスクリプタ、ソースリストは診断を出します
受け入れられたフォントは Windows ではプロセスメモリ内にプライベート登録され、ドキュメントが破棄されるまでドキュメントが所有し続けます。そのため EndDoc の前にインポーターを解放しても、遅延フォント埋め込みは無効になりません
data: リソースとコールバック結果は、MaxResources、MaxResourceBytes、MaxTotalResourceBytes の制限を共有します
MaxDecodedImageBytes のデフォルトは 128 MiB で、ピクセルあたり 4 バイトでデコード済み画像キャッシュを独立して境界付けます。BMP と PNG の寸法はデコード前にチェックされ、受け入れられた画像はすべて保持前にチェックされます
MaxDOMNodes、MaxCSSRules、MaxLayoutOperations は、解析、カスケード構築、レイアウト作業を個別に制限します
THPDFHTMLResourceEvent = procedure(
Sender: TObject;
const URI: WideString;
ResourceKind: THPDFHTMLResourceKind;
var Data: TBytes;
var ContentType: string;
var Handled: Boolean
) of object;
統計
THPDFHTMLImportStatistics は、プロファイルバージョン、解析されたノード、CSS ルール、レイアウト操作、ページブレーク、テーブル、フォームコントロール、リソース要求、受け入れ済みと拒否済みのロード、受け入れ済みリソースバイト、計測済みテキスト行、ハイフネーションされた行、診断、flex コンテナ、grid コンテナを報告します
OnLineLayout は、実際の PDF テキストが出力された後に、行の 0 始まりのページインデックスと段落行インデックス、原点、計測された幅と高さ、論理テキスト、方向、ハイフネーションフラグを受け取ります
すべての RenderHTML5 呼び出しは統計レコードをリセットし、予算違反は EHPDFHTMLImportBudget を発生させます
例
Importer := THPDFHTMLImporter.Create(Doc);
try
Importer.CreateAcroForms := True;
Importer.MaxResources := 16;
Importer.RenderHTML5(
'<style>@page { margin: 36pt } ' +
'table { width: 100% }</style>' +
'<h1>Invoice</h1>' +
'<table><tr><td>Total</td><td>42</td></tr></table>' +
'<input name="approved" type="checkbox">'
);
finally
Importer.Free;
end;