Εισαγωγή SVG Form XObject

Η THotPDF.ImportSVGFormXObject αναλύει το SVG μία φορά και καταχωρεί ένα επαναχρησιμοποιήσιμο PDF Form XObject, ενώ η THPDFPage.DrawSVGFormXObject το τοποθετεί σε οποιοδήποτε μέγεθος και προαιρετικά δημιουργεί επισημειώσεις link σελίδας

Δήλωση

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

Vector προφίλ

Όρια κειμένου και βαφής

Το κείμενο υποστηρίζει συμπαγές γέμισμα, παραλλαγές bold και italic, μέγεθος γραμματοσειράς, μετασχηματισμούς, αγκύρωση, αδιαφάνεια, και γεωμετρικό clipping· η βαφή κειμένου από gradient αποτυγχάνει με ασφάλεια, και κάθε κόμβος text ή tspan παραμένει μια ανεξάρτητα τοποθετημένη εκτέλεση, όχι μια πλήρης μηχανή διάταξης ροής κειμένου SVG

Οι εισαγωγές κειμένου εγγράφου διατηρούν το επιλεγμένο πρόσωπο bold και italic μέσω ελέγχων γλυφών με επίγνωση στυλ και διάταξης fallback, διατηρούν τα μετρημένα όρια μελανιού, και απορρίπτουν γνήσια ανεπίλυτους γλύφους

Το κείμενο UTF-8 και οι δεκαεξαδικές ή δεκαδικές αναφορές χαρακτήρων XML διατηρούν τα ίδια Unicode scalars σε Delphi και FPC, συμπεριλαμβανομένων συμπληρωματικών scalars που παριστάνονται από ζεύγη υποκατάστασης UTF-16

Η αυτόνομη overload του HPDFBuildSVGFormData χωρίς text builder χρησιμοποιεί μετρημένες προωθήσεις των Base 14 Helvetica, Times, και Courier και απορρίπτει χαρακτήρες εκτός WinAnsi αντί να αντικαθιστά με ερωτηματικά· η overload με THPDFSVGTextRunBuilder δέχεται ενσωματωμένες φόρμες κειμένου και μετρικά που παρέχει ο caller

Τα gradients διατηρούν τη φραγμένη προσέγγιση vector ζωνών· οι διαφανείς πόροι απαιτούν PDF 1.4 και απορρίπτονται από το αυστηρό προφίλ PDF/A-1

Στυλ περιγράμματος (stroke)

Τα stroke-dasharray, stroke-dashoffset, και stroke-miterlimit δουλεύουν μέσω presentation attributes, ενσωματωμένου CSS, inline styles, και κληρονομικότητας, συμπεριλαμβανομένων groups και στιγμιότυπων use μόνο-θραύσματος

Τα dash arrays δέχονται αριθμούς διαχωρισμένους με κόμμα ή κενό και υποστηριζόμενα μήκη· τα ποσοστά χρησιμοποιούν την κανονικοποιημένη διαγώνιο του viewport, υπολογιζόμενη ως sqrt((viewWidth * viewWidth + viewHeight * viewHeight) / 2)

Πίνακες περιττού μήκους επαναλαμβάνονται για να σχηματίσουν pattern άρτιου μήκους, κάθε subpath ξεκινά το pattern από την αρχή, και θετικά ή αρνητικά offsets τυλίγονται γύρω από το πλήρες pattern· το none και οι πίνακες με όλα μηδενικά παράγουν συμπαγή strokes

Ζωγραφισμένα dashes μηδενικού μήκους διατηρούν ακμές round ή square cap· τα συνηθισμένα συμπαγή strokes, τα gradient stroke patterns, τα clips, οι μάσκες, και οι απομονωμένες ομάδες αδιαφάνειας μοιράζονται τις επιλεγμένες ρυθμίσεις stroke

Το προεπιλεγμένο miter limit είναι 4· τιμές SVG 2 μεταξύ 0 και 1 γίνονται δεκτές και χρησιμοποιούν bevel joins όπου ένα miter θα υπερβαίνει το όριο, ενώ τα όρια πόρων gradient και διαφάνειας διατηρούν αιχμηρά joins εντός του επιλεγμένου ορίου

Το εγγενές rendering χρησιμοποιεί φραγμένη dash γεωμετρία για να διατηρεί offsets, κλασματικά μήκη, και πίνακες μεγαλύτερους από το όριο πένας GDI, με προσαρμοστική flattening καμπυλών και συνεχείς ζωγραφισμένους joins across όρια τμημάτων

Η βαθμονόμηση dashes με pathLength παραμένει εκτός αυτού του προφίλ· σχήματα που συνδυάζουν μη συμπαγή dash array με pathLength αποτυγχάνουν με ασφάλεια, αντί να χρησιμοποιούν σιωπηλά αβαθμονόμητα μήκη

Η σημασιολογία stroke ακολουθεί το μοντέλο stroke της SVG 2 εντός των προϋπολογισμών parser και renderer που περιγράφονται παρακάτω

Ρύθμιση shaping κειμένου

Το ενσωματωμένο κείμενο SVG χρησιμοποιεί τις ρυθμίσεις ShapingFeatures, AutoShapeArabic, AutoShapeSyriac, AutoShapeNko, AutoShapeAdlam, και AutoShapeHanifiRohingya του εισαγόμενου εγγράφου, μαζί με τις επιλογές GSUB script και γλώσσας του και τις αλυσίδες font fallback του

Αυτές οι ρυθμίσεις εφαρμόζονται τόσο κατά τις μετρημένες προωθήσεις όσο και στις παραγόμενες εμφανίσεις κειμένου, χωρίς να αλλάζει η ρύθμιση του caller· το shaping παραμένει opt-in και απαιτεί γραμματοσειρά που παρέχει τους ζητούμενους γλύφους και τους πίνακες OpenType

Κάθε παραγόμενη εμφάνιση κειμένου δέχεται το πολύ 256 διακριτές επιλογές shaping γραμματοσειράς και 64 MiB αθροιστικών ακατέργαστων δεδομένων γραμματοσειράς· μη υποστηριζόμενα δεδομένα γραμματοσειράς ή υπέρβαση ορίου αποτυγχάνει την εισαγωγή ατομικά

Αδιαφάνεια αντικειμένου και ομάδας

Η opacity εφαρμόζεται μία φορά στο πλήρες ζωγραφισμένο αποτέλεσμα του κόμβου της και δεν κληρονομείται από τους απογόνους· τα fill-opacity και stroke-opacity διατηρούν τις ξεχωριστές κληρονομημένες τιμές βαφής τους

Δύο επικαλυπτόμενα αδιαφανή κόκκινα ορθογώνια μέσα σε <g opacity="0.5"> παραμένουν εξίσου ημιδιαφανή στην επικάλυψή τους, ενώ δύο ανεξάρτητα ημιδιαφή ορθογώνια σκουραίνουν στο σημείο όπου επικαλύπτονται

Εμφωλευμένα groups συντίθενται με σειρά: δύο περικλείουσες αδιαφάνειες 0.5 δίνουν effective 0.25 πάνω από έναν αδιαφανή απόγονο, και η ρητή opacity 1 ενός απογόνου δεν παρακάμπτει την περικλείουσα ομάδα του

Ριζικοί κόμβοι SVG, containers, links, αναφορές θραύσματος, κείμενο, εικόνες, και σχήματα ακολουθούν την ίδια διαδρομή opacity αντικειμένου· οι αναφορές use μόνο-θραύσματος διατηρούν τα στυλ τόσο του στιγμιότυπου όσο και του αναφερόμενου κόμβου

Το alpha fill και stroke παραμένουν ανεξάρτητα, συμπεριλαμβανομένης της επικάλυψής τους μέσα σε ένα ημιδιαφές αντικείμενο, και το alpha των stops ενός gradient συνδυάζεται με το σχετικό alpha βαφής πριν τη σύνθεση του αντικειμένου

Τα εφέ clip και mask ανήκουν στον κόμβο τους, αντί να κληρονομούνται ως ρυθμίσεις βαφής απογόνων· η γεωμετρία link παραμένει με επίγνωση τοποθέτησης, και τα όρια απομονωμένων Forms διατηρούν συντηρητικά μετασχηματισμένα strokes και caps

Ο importer διατηρεί vector τελεστές, ενσωματωμένα Forms κειμένου, πόρους εικόνων, patterns, και μάσκες μέσα σε απομονωμένα groups· δεν ισοπεδώνει ολόκληρο το SVG σε bitmap

Η υποστηριζόμενη συμπεριφορά ακολουθεί το μοντέλο opacity αντικειμένου και ομάδας της SVG· οι υπόλοιποι φραγμένοι περιορισμοί κειμένου, gradient και γεωμετρίας της σελίδας εξακολουθούν να ισχύουν

Ασφάλεια και προϋπολογισμοί

Ο importer δέχεται απλό ή συμπιεσμένο με gzip SVG μέχρι 8 MiB, φράσσει την αναπτυγμένη είσοδο σε 32 MiB, τους συνδυασμένους τελεστές main, pattern, mask και group σε 16 MiB, τους κόμβους σε 4.096, την ένθεση (nesting) σε 64 επίπεδα, τους κανόνες CSS σε 256, και τις τιμές path σε 100.000

Οι ενσωματωμένες εικόνες δέχονται μόνο αυστηρά payloads Base64 data:image/png;base64, και data:image/jpeg;base64,, με το πολύ 128 εικόνες, 16.384 pixels ανά διάσταση, και 16.777.216 αποκωδικοποιημένα pixels στο σύνολο· οι διαστάσεις ελέγχονται πριν την εγγενή αποκωδικοποίηση

Το κείμενο φράσσεται σε 128 εκτελέσεις και 65.536 μονάδες UTF-16 ανά εκτέλεση, και τα gradient stroke patterns, οι μάσκες, και οι απομονωμένες ομάδες αδιαφάνειας σε 128 πόρους το καθένα· αναδρομικές αναφορές μάσκας αποτυγχάνουν με ασφάλεια

Τα dash arrays περιέχουν το πολύ 64 καταχωρίσεις πηγής πριν την επέκταση περιττού πίνακα· οι θετικές καταχωρίσεις πρέπει να είναι τουλάχιστον 0.000001 μονάδες χρήστη, τα μεμονωμένα μήκη και ο κανονικοποιημένος κύκλος δεν πρέπει να υπερβαίνουν τα 1.000.000.000, τα απόλυτα offsets δεν πρέπει να υπερβαίνουν τα 1.000.000.000, και τα miter limits πρέπει να παραμένουν μεταξύ 0 και 1.000.000

Τα πραγματικά εμφωλευμένα εφέ διαφάνειας περιορίζονται σε οκτώ επίπεδα για να ταιριάζουν με τον εγγενή renderer, ανεξάρτητα από το όριο βάθους δέντρου SVG· τα συνηθισμένα εμφωλευμένα containers χωρίς εφέ διαφάνειας δεν καταναλώνουν αυτό το επίδομα

Τα όρια εφέ διαφάνειας πρέπει να είναι πεπερασμένα και κάθε συντεταγμένη πρέπει να παραμένει εντός απόλυτης τιμής 1.000.000.000· εισαγωγές εκτός αυτού του φραγμένου προφίλ συντεταγμένων αποτυγχάνουν πριν την καταχώρηση group ή μάσκας

Αποτυχημένες εισαγωγές κάνουν rollback στα παραγόμενα αντικείμενα, τα ενσωματωμένα Forms κειμένου, τις καταχωρίσεις μητρώου, και την κατάσταση έκδοσης και χρωμάτων συσκευής, ώστε οι καλούντες να μπορούν να επαναχρησιμοποιήσουν το ίδιο έγγραφο και να διατηρήσουν μια περικλείουσα συναλλαγή γραφήματος

Scripts, event handlers, DTD, foreignObject, μη υποστηριζόμενοι τύποι μέσων δεδομένων, URL JavaScript, και εξωτερικά URL βαφής ή πόρων εικόνων αποτυγχάνουν με ασφάλεια (fail closed)

Αναφορές θραύσματος (fragment) όπως url(#gradient), url(#clip) και href="#symbol" παραμένουν μέσα στο αναλυμένο έγγραφο, και δεν πυροδοτούν ποτέ πρόσβαση σε αρχείο ή δίκτυο

Στατιστικά

Το THPDFSVGImportStatistics αναφέρει τους κόμβους, τους κανόνες CSS, τα gradients, τα gradient strokes, τις μάσκες, τις εικόνες, τα links, τα text runs, τις απομονωμένες ομάδες αδιαφάνειας μέσω του GroupCount, και τα συνδυασμένα bytes παραγόμενων τελεστών main, pattern, mask και group

Η HPDFBuildSVGFormData εκθέτει τον φραγμένο parser ξεχωριστά, μέσω των THPDFSVGFormData και THPDFSVGLinkInfo, για καλούντες που χρειάζονται περιεχόμενο Form, εγγενείς διαστάσεις, πόρους αδιαφάνειας, payloads εικόνων, streams pattern και μάσκας, ονόματα πόρων κειμένου, ή μεταδεδομένα link πριν την καταχώρηση· το Groups παρέχει τα streams απομονωμένων group τελεστών και συντηρητικά όρια 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 Paged-Media