Εισαγωγή 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 προφίλ
- Η γεωμετρία περιλαμβάνει paths με ελλειπτικά arcs, ορθογώνια, ορθογώνια με στρογγυλεμένες γωνίες, κύκλους, ελλείψεις, γραμμές, polylines, polygons, μετασχηματισμούς, groups, symbols, και αναφορές
useμόνο-θραύσματος - Η βαφή περιλαμβάνει συμπαγή χρώματα RGB, αδιαφάνεια fill και stroke, κανόνες γεμίσματος, line caps και joins, κληρονομημένα dash arrays και offsets, miter limits, vector ζώνες γραμμικών και ακτινικών gradients, gradient strokes με στήριγμα από έγχρωμα tiling patterns, και clip paths
- Η αδιαφάνεια αντικειμένου και ομάδας χρησιμοποιεί απομονωμένα vector Forms διαφάνειας, ώστε οι επικαλυπτόμενοι απόγονοι να συντίθενται πριν εφαρμοστεί η αδιαφάνεια της περικλείουσας ομάδας
- Οι μάσκες γίνονται Form πόροι transparency group με PDF soft masks Alpha ή Luminosity, συμπεριλαμβανομένου clipping περιοχής μάσκας,
maskUnits,maskContentUnits, και φραγμένων εμφωλευμένων αναφορών μάσκας - Το CSS περιλαμβάνει ενσωματωμένους selectors type, class, ID και σύνθετους, presentation attributes, inline styles, specificity, σειρά πηγής, και
!important - Οι εισαγωγές εγγράφων ενσωματώνουν Unicode subsets γραμματοσειρών και χάρτες
ToUnicodeμέσω της εγγενής μηχανής συγγραφής, χρησιμοποιούν τις ρυθμισμένες αλυσίδες font fallback, ευθυγραμμίζουν τις εκτελέσεις fallback σε κοινή αλφαβητική γραμμή βάσης, και υπολογίζουν την αγκύρωση κειμένου από πραγματικά glyph advances - Οι ενσωματωμένες εικόνες PNG και JPEG γίνονται επαναχρησιμοποιήσιμα Image XObjects, διατηρούν το alpha του PNG ως soft mask, και υποστηρίζουν
preserveAspectRatio="none", κεντραρισμένοmeet, και κεντραρισμένοslice - Τα links HTTP, HTTPS, και mail διατηρούνται ως PDF link annotations με επίγνωση τοποθέτησης, χωρίς να γίνονται μέρος του επαναχρησιμοποιήσιμου stream του Form
Όρια κειμένου και βαφής
Το κείμενο υποστηρίζει συμπαγές γέμισμα, παραλλαγές 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