Import de Form XObject SVG

THotPDF.ImportSVGFormXObject analyse le SVG une fois et enregistre un Form XObject PDF réutilisable unique, tandis que THPDFPage.DrawSVGFormXObject le place à n'importe quelle taille et crée en option des annotations de lien de page

Déclaration

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
);

Profil vectoriel

Frontières de texte et de peinture

Le texte prend en charge le remplissage uni, les variantes grasse et italique, la taille de police, les transformations, l'ancrage, l'opacité et le clipping géométrique ; la peinture de texte en dégradé échoue de manière sûre, et chaque nœud text ou tspan reste un run positionné indépendamment plutôt qu'un moteur complet de mise en page de flux de texte SVG

Les imports de texte de document conservent la variante grasse ou italique sélectionnée via des contrôles de glyphes sensibles au style et la mise en page de secours, préservent les bornes d'encre mesurées et rejettent les glyphes réellement non résolus

Le texte UTF-8 et les références de caractères XML hexadécimales ou décimales préservent les mêmes scalaires Unicode sur Delphi et FPC, y compris les scalaires supplémentaires représentés par des paires de substitution UTF-16

La surcharge autonome de HPDFBuildSVGFormData sans text builder utilise les avances mesurées Base 14 Helvetica, Times et Courier et rejette les caractères hors WinAnsi au lieu de substituer des points d'interrogation ; la surcharge avec THPDFSVGTextRunBuilder accepte des Forms de texte embarqués et des métriques fournis par l'appelant

Les dégradés conservent l'approximation par bandes vectorielles bornée ; les ressources transparentes exigent PDF 1.4 et sont rejetées par le profil strict PDF/A-1

Styles de trait

stroke-dasharray, stroke-dashoffset et stroke-miterlimit fonctionnent via les attributs de présentation, le CSS embarqué, les styles en ligne et l'héritage, y compris les groupes et les instances use limitées aux fragments

Les dash arrays acceptent des nombres séparés par des virgules ou des espaces et des longueurs prises en charge ; les pourcentages utilisent la diagonale normalisée du viewport, calculée comme sqrt((viewWidth * viewWidth + viewHeight * viewHeight) / 2)

Les tableaux de longueur impaire se répètent pour former un motif de longueur paire, chaque sous-chemin redémarre le motif, et les offsets positifs ou négatifs bouclent sur le motif complet ; none et les tableaux tout à zéro produisent des traits pleins

Les tirets peints de longueur nulle conservent leurs marques de bout rondes ou carrées ; les traits pleins ordinaires, les patterns de traits en dégradé, les clips, les masques et les groupes d'opacité isolés partagent les réglages de trait sélectionnés

Le miter limit par défaut est 4 ; les valeurs SVG 2 entre 0 et 1 sont acceptées et utilisent des jointures biseautées là où une pointe dépasserait la limite, tandis que les bornes de ressources de dégradé et de transparence conservent des jointures vives dans la limite sélectionnée

Le rendu natif utilise une géométrie de tirets bornée pour conserver les offsets, les longueurs fractionnaires et les tableaux plus longs que la limite de stylo GDI, avec aplatissement adaptatif des courbes et jointures peintes continues aux frontières de segments

L'étalonnage des tirets avec pathLength reste hors de ce profil ; les formes combinant un dash array non plein avec pathLength échouent de manière sûre plutôt que d'utiliser silencieusement des longueurs non étalonnées

La sémantique des traits suit le modèle de trait SVG 2 dans les budgets d'analyseur et de renderer décrits ci-dessous

Configuration du façonnage du texte

Le texte SVG embarqué utilise les réglages ShapingFeatures, AutoShapeArabic, AutoShapeSyriac, AutoShapeNko, AutoShapeAdlam et AutoShapeHanifiRohingya du document importeur, ainsi que ses sélections de script et de langue GSUB et ses chaînes de secours de polices

Ces réglages s'appliquent à la fois aux avances mesurées et aux apparences de texte générées sans modifier la configuration de l'appelant ; le façonnage reste opt-in et exige une police fournissant les glyphes et tables OpenType demandés

Chaque apparence de texte générée accepte au plus 256 sélections de polices de façonnage distinctes et 64 Mio de données de polices brutes cumulées ; des données de police non prises en charge ou une limite dépassée font échouer l'import atomiquement

Opacité d'objet et de groupe

opacity s'applique une fois au résultat peint complet de son nœud et n'est pas héritée par les descendants ; fill-opacity et stroke-opacity conservent leurs valeurs de peinture héritées distinctes

Deux rectangles rouges opaques qui se chevauchent à l'intérieur de <g opacity="0.5"> restent également translucides dans leur chevauchement, tandis que deux rectangles indépendamment translucides deviennent plus foncés là où ils se chevauchent

Les groupes imbriqués se composent dans l'ordre : deux opacités englobantes de 0,5 donnent 0,25 effectif sur un descendant opaque, et l'opacité explicite de 1 d'un descendant ne remplace pas son groupe englobant

Les nœuds SVG racine, conteneurs, liens, références de fragments, textes, images et formes suivent le même chemin d'opacité d'objet ; les références use limitées aux fragments préservent à la fois les styles de l'instance et du nœud référencé

Les alpha de remplissage et de trait restent indépendants, y compris à leur chevauchement à l'intérieur d'un objet translucide, et l'alpha des stops de dégradé se combine avec l'alpha de peinture concerné avant la composition d'objet

Les effets de clip et de masque appartiennent à leur nœud plutôt que d'être hérités comme réglages de peinture des descendants ; la géométrie des liens reste sensible au placement, et les bornes des Forms isolés conservent prudemment les traits et bouts transformés

L'importateur conserve les opérateurs vectoriels, Forms de texte embarqués, ressources d'images, patterns et masques à l'intérieur de groupes isolés ; il n'aplatit pas tout le SVG en bitmap

Le comportement pris en charge suit le modèle d'opacité d'objet et de groupe SVG ; les autres restrictions bornées de texte, de dégradé et de géométrie de cette page s'appliquent toujours

Sécurité et budgets

L'importateur accepte le SVG brut ou compressé gzip jusqu'à 8 Mio, borne l'entrée décompressée à 32 Mio, les opérateurs combinés principal, pattern, masque et groupe à 16 Mio, les nœuds à 4 096, l'imbrication à 64 niveaux, les règles CSS à 256 et les valeurs de chemin à 100 000

Les images embarquées n'acceptent que des charges strictement Base64 data:image/png;base64, et data:image/jpeg;base64,, avec au plus 128 images, 16 384 pixels par dimension et 16 777 216 pixels décodés sur toutes les images ; les dimensions sont vérifiées avant le décodage natif

Le texte est borné à 128 runs et 65 536 unités UTF-16 par run, et les patterns de traits en dégradé, masques et groupes d'opacité isolés à 128 ressources chacun ; les références de masques récursives échouent de manière sûre

Les dash arrays contiennent au plus 64 entrées sources avant expansion des tableaux impairs ; les entrées positives valent au moins 0,000001 unités utilisateur, les longueurs individuelles et le cycle normalisé ne dépassent pas 1 000 000 000, les offsets absolus ne dépassent pas 1 000 000 000, et les miter limits restent entre 0 et 1 000 000

Les effets de transparence réellement imbriqués sont limités à huit niveaux pour correspondre au renderer natif, indépendamment de la limite de profondeur de l'arbre SVG ; les conteneurs imbriqués ordinaires sans effets de transparence ne consomment pas ce quota

Les bornes des effets de transparence doivent être finies et chaque coordonnée rester dans une valeur absolue de 1 000 000 000 ; les imports hors de ce profil de coordonnées borné échouent avant l'enregistrement des groupes ou masques

Les imports échoués annulent les objets générés, Forms de texte embarqués, entrées de registry, et l'état de version et de couleur périphérique, si bien que les appelants peuvent réutiliser le même document et préserver une transaction de graphe englobante

Les scripts, gestionnaires d'événements, DTD, foreignObject, types de média de données non pris en charge, URL JavaScript et URL externes de peinture ou de ressources d'images échouent de manière sûre

Les références de fragments telles que url(#gradient), url(#clip) et href="#symbol" restent dans le document analysé et ne déclenchent jamais d'accès fichier ou réseau

Statistiques

THPDFSVGImportStatistics rapporte les nœuds, règles CSS, dégradés, traits en dégradé, masques, images, liens, runs de texte, groupes d'opacité isolés via GroupCount, et les octets d'opérateurs générés combinés principal, pattern, masque et groupe

HPDFBuildSVGFormData expose séparément l'analyseur borné via THPDFSVGFormData et THPDFSVGLinkInfo pour les appelants qui ont besoin du contenu Form, des dimensions intrinsèques, des ressources d'opacité, des charges d'images, des streams de patterns et de masques, des noms de ressources de texte ou des métadonnées de lien avant l'enregistrement ; Groups fournit les streams d'opérateurs de groupes isolés et les bornes prudentes des Forms

Exemple

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
);

Voir aussi : THotPDF.ImportSVGFormXObject, THPDFPage.DrawSVGFormXObject, Import de pages HTML5