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
- La géométrie inclut les chemins avec arcs elliptiques, rectangles, rectangles arrondis, cercles, ellipses, lignes, polylignes, polygones, transformations, groupes, symboles et références
uselimitées aux fragments - La peinture inclut les couleurs RGB unies, l'opacité de remplissage et de trait, les règles de remplissage, les terminaisons et jonctions de trait, les dash arrays et offsets hérités, les miter limits, les bandes vectorielles de dégradés linéaires et radiaux, les traits en dégradé adossés à des tiling patterns colorés, et les clip paths
- L'opacité d'objet et de groupe utilise des Forms vectoriels de transparence isolés, si bien que les descendants qui se chevauchent sont composés avant l'application de l'opacité englobante
- Les masques deviennent des ressources Form de groupe de transparence avec soft masks PDF Alpha ou Luminosity, y compris clipping de région de masque,
maskUnits,maskContentUnitset références de masques imbriquées bornées - Le CSS inclut les sélecteurs de type, de classe, d'identifiant et composés embarqués, les attributs de présentation, les styles en ligne, la spécificité, l'ordre source et
!important - Les imports de documents embarquent des sous-ensembles de polices Unicode et des cartes
ToUnicodevia le moteur de création natif, utilisent les chaînes de secours de polices configurées, alignent les runs de secours sur une ligne de base alphabétique commune et calculent l'ancrage du texte à partir des avances réelles des glyphes - Les images PNG et JPEG embarquées deviennent des Image XObjects réutilisables, conservent l'alpha PNG comme soft mask, et prennent en charge
preserveAspectRatio="none",meetcentré etslicecentré - Les liens HTTP, HTTPS et mail sont conservés comme annotations de lien PDF tenant compte du placement sans entrer dans le flux Form réutilisable
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