SVG Form XObject インポート

THotPDF.ImportSVGFormXObject は SVG を 1 回解析し、1 つの再利用可能な PDF Form XObject を登録します。THPDFPage.DrawSVGFormXObject は任意のサイズに配置し、オプションでページリンク注釈を作成します

宣言

function ImportSVGFormXObject(const Input: TBytes): AnsiString; overload;
function ImportSVGFormXObject(
  const Input: TBytes;
  out Statistics: THPDFSVGImportStatistics
): AnsiString; overload;

procedure DrawSVGFormXObject(
  const FormName: AnsiString;
  X, Y, W, H: Single;
  AddLinks: Boolean = True
);

ベクタープロファイル

テキストとペイントの境界

テキストは、単色の塗り、太字と斜体のバリアント、フォントサイズ、変換、アンカー、不透明度、幾何クリッピングに対応します。グラデーションのテキストペイントは fail closed で、各テキスト / tspan ノードは独立して配置されるランのままです。完全な SVG テキストフローレイアウトエンジンではありません

ドキュメントのテキストインポートは、スタイル対応のグリフチェックとフォールバックレイアウトを通じて選択された太字 / 斜体フェイスを保持し、計測済みのインク境界を維持し、本当に未解決のグリフは拒否します

UTF-8 テキストと 16 進 / 10 進の XML 文字参照は、Delphi と FPC のどちらでも同じ Unicode スカラーを保持します。UTF-16 サロゲートペアで表される補助スカラーも含みます

テキストビルダーを持たないスタンドアロンの HPDFBuildSVGFormData オーバーロードは、計測済みの Helvetica、Times、Courier Base 14 アドバンスを使用し、疑問符で置き換える代わりに WinAnsi 外の文字を拒否します。THPDFSVGTextRunBuilder を渡すオーバーロードは、呼び出し側が用意した埋め込みテキストフォームとメトリクスを受け付けます

グラデーションは境界付きベクターバンド近似を保持します。透過リソースには PDF 1.4 が必要で、PDF/A-1 strict プロファイルでは拒否されます

ストロークスタイル

stroke-dasharray、stroke-dashoffset、stroke-miterlimit は、プレゼンテーション属性、埋め込み CSS、インラインスタイル、継承を通じて機能します。グループやフラグメントのみの use インスタンスも含みます

破線配列はカンマまたは空白で区切られた数値と対応する長さを受け付けます。パーセントは正規化されたビューポート対角線、つまり sqrt((viewWidth * viewWidth + viewHeight * viewHeight) / 2) を使います

奇数長の配列は繰り返されて偶数長のパターンになり、各サブパスでパターンが再開します。正負どちらのオフセットも完全なパターンに沿って折り返します。none とすべてゼロの配列は実線になります

ゼロ長の描画破線は round / square のキャップマークを保持します。通常の実線ストローク、グラデーションストロークパターン、クリップ、マスク、分離不透明グループは、選択されたストローク設定を共有します

マイターリミットのデフォルトは 4 です。SVG 2 の 0 から 1 の値も受け付けられ、マイターがリミットを超える箇所ではベベルジョインが使われます。グラデーションと透過リソースの境界は、選択されたリミット内でシャープなジョインを保持します

ネイティブレンダリングは境界付き破線ジオメトリを使い、オフセット、小数の長さ、GDI ペン上限を超える配列を保持します。セグメント境界をまたぐ適応型の曲線フラット化と連続した描画ジョインが使われます

pathLength による破線の較正はこのプロファイルの範囲外です。非実線の破線配列と pathLength を組み合わせた形状は、未較正の長さを黙って使う代わりに fail closed します

ストロークのセマンティクスは、後述のパーサーとレンダラーの予算の範囲内で SVG 2 stroke model に従います

テキストシェーピングの設定

埋め込み SVG テキストは、インポート元ドキュメントの ShapingFeatures、AutoShapeArabic、AutoShapeSyriac、AutoShapeNko、AutoShapeAdlam、AutoShapeHanifiRohingya の各設定と、GSUB スクリプトと言語の選択、フォントフォールバックチェーンを使用します

これらの設定は、呼び出し側の設定を変更することなく、アドバンスの計測時と生成テキストの外観の両方で適用されます。シェーピングはオプトインのままで、要求されたグリフと OpenType テーブルを備えたフォントが必要です

生成されるテキスト外観ごとに、シェーピング用のフォント選択は最大 256 種類、累積の生フォントデータは 64 MiB まで受け付けます。未対応のフォントデータや上限超過は、インポートを原子的に失敗させます

オブジェクトとグループの不透明度

opacity はそのノードの描画結果全体に 1 回だけ適用され、子孫には継承されません。fill-opacity と stroke-opacity は、それぞれ独立した継承されるペイント値を保持します

<g opacity="0.5"> の中にある重なり合う 2 つの不透明な赤い矩形は、重なり部分でも同じ半透明のままです。一方、独立して半透明な 2 つの矩形は、重なり部分が濃くなります

入れ子のグループは順に合成されます。0.5 の外側不透明度を 2 段重ねすると、不透明な子孫の上で実効値は 0.25 になります。子孫自身の明示的な opacity 1 は、外側のグループを上書きしません

ルート SVG ノード、コンテナ、リンク、フラグメント参照、テキスト、画像、図形は、同じオブジェクト不透明度のパスを使います。フラグメントのみの use 参照は、インスタンスと参照先ノードの両方のスタイルを保持します

塗りとストロークのアルファは独立しており、半透明オブジェクト内の重なり部分でも同じです。グラデーションストップのアルファは、オブジェクト合成の前に関連するペイントのアルファと結合します

クリップとマスクの効果は子孫にペイント設定として継承されるのではなく、そのノードに属します。リンクの幾何は配置認識のまま、分離 Form の境界は変換後のストロークとキャップを保守的に保持します

インポーターは、ベクトルオペレータ、埋め込みテキストフォーム、画像リソース、パターン、マスクを分離グループ内に保持します。SVG 全体をビットマップにフラット化することはありません

対応する挙動は SVG object and group opacity model に従います。このページのその他のテキスト、グラデーション、幾何に関する境界付き制限も引き続き適用されます

セキュリティと予算

インポーターは、最大 8 MiB のプレーンまたは gzip 圧縮 SVG を受け入れ、展開入力を 32 MiB、メイン / パターン / マスク / グループの合計オペレータを 16 MiB、ノードを 4,096、ネストを 64 レベル、CSS ルールを 256、パス値を 100,000 に境界付けます

埋め込み画像は、厳密な Base64 の data:image/png;base64, と data:image/jpeg;base64, ペイロードのみを受け付けます。画像は最大 128 個、各次元 16,384 ピクセル、全画像合計で 16,777,216 デコード済みピクセルまでです。寸法はネイティブデコードの前にチェックされます

テキストは 128 ラン、ランあたり 65,536 UTF-16 単位に境界付けられ、グラデーションストロークパターン、マスク、分離不透明グループはそれぞれ 128 リソースまでです。再帰的なマスク参照は fail closed します

破線配列は、奇数長展開の前に最大 64 のソースエントリを含みます。正のエントリは 0.000001 ユーザー単位以上が必要で、個々の長さと正規化されたサイクルは 1,000,000,000 を超えてはならず、絶対オフセットは 1,000,000,000 を超えてはならず、マイターリミットは 0 から 1,000,000 の間になければなりません

実際に入れ子になる透過効果は、ネイティブレンダラーに合わせて 8 レベルまでに制限されます。SVG ツリーの深さ制限とは独立です。透過効果を持たない通常の入れ子コンテナはこの許容量を消費しません

透過効果の境界は有限でなければならず、各座標の絶対値は 1,000,000,000 以内でなければなりません。この境界付き座標プロファイルの外側にあるインポートは、グループやマスクの登録の前に失敗します

失敗したインポートは、生成されたオブジェクト、埋め込みテキストフォーム、レジストリエントリ、バージョンとデバイス色の状態をロールバックします。呼び出し側は同じドキュメントを再利用でき、外側のグラフトランザクションも保持されます

スクリプト、イベントハンドラー、DTD、foreignObject、未対応の data メディアタイプ、JavaScript URL、外部のペイントまたは画像リソース URL はフェイルクローズします

url(#gradient)、url(#clip)、href="#symbol" などのフラグメント参照は、解析されたドキュメント内に留まり、ファイルまたはネットワークアクセスを決してトリガーしません

統計

THPDFSVGImportStatistics は、ノード、CSS ルール、グラデーション、グラデーションストローク、マスク、画像、リンク、テキストラン、GroupCount による分離不透明グループ、および生成されたメイン / パターン / マスク / グループの各オペレータバイトの合計を報告します

HPDFBuildSVGFormData は、登録前に Form コンテンツ、固有寸法、不透明度リソース、画像ペイロード、パターンとマスクのストリーム、テキストリソース名、リンクメタデータを必要とする呼び出し側のために、境界付きパーサーを THPDFSVGFormData と THPDFSVGLinkInfo で別々に公開します。Groups は分離グループのオペレータストリームと保守的な Form 境界を提供します

例

Document.BeginDoc;
FormName := Document.ImportSVGFormXObject(SVGBytes, Statistics);
if FormName = '' then
  raise Exception.Create('SVG import failed');

Document.CurrentPage.DrawSVGFormXObject(
  FormName,
  36,
  72,
  240,
  120,
  True
);

Document.CurrentPage.DrawSVGFormXObject(
  FormName,
  320,
  72,
  120,
  60,
  False
);

関連項目: THotPDF.ImportSVGFormXObject、THPDFPage.DrawSVGFormXObject、HTML5 ページドメディアインポート