Εισαγωγή HTML5 Paged-Media
Η THPDFHTMLImporter.RenderHTML5 μετατρέπει ανεκτική (tolerant) σήμανση HTML5 και CSS εκτύπωσης σε σελιδοποιημένο περιεχόμενο PDF, διατηρώντας παράλληλα τη συμπαγή παλαιότερη διαδρομή RenderHTML
Τα μήκη CSS και τα Margin, BaseFontSize, ListIndent και BlockSpacing του importer είναι σε points, οπότε και οι δύο renderers παράγουν την ίδια σελίδα ό,τι τιμή κι αν έχει το THotPDF.Resolution· το δικό σας σχέδιο πριν και μετά την εισαγωγή συνεχίζει να χρησιμοποιεί 1/Resolution της ίντσας
Δήλωση
function RenderHTML5(
const HTML: WideString;
const AuthorStyleSheet: WideString = ''
): Boolean;
function HPDFRenderHTML5Document(
Doc: THotPDF;
const HTML: WideString;
const AuthorStyleSheet: WideString = '';
MarginPt: Single = 72;
const FontName: AnsiString = 'Arial';
FontSize: Single = 12
): Boolean;
Συμβόλαιο προφίλ
Η HTML5ProfileVersion επιστρέφει 1, και η HTML5ProfileMilestones αναφέρει parser και cascade, σελιδοποιημένη διάταξη, πίνακες και φόρμες, και οριοθετημένους πόρους
- Το ανεκτικό DOM δέχεται συνηθισμένα παραλειπόμενα end tags, διατηρεί τη σειρά κειμένου, παραλείπει ανενεργές περιοχές εγγράφου και επιβάλλει
MaxDOMNodes - Το cascade υποστηρίζει selectors τύπου, class, ID, ισότητας attribute, απόγονου και απευθείας θυγατρικού, σειρά πηγής, specificity, inline δηλώσεις,
!important,@media printκαι περιθώρια@page - Η σελιδοποιημένη διάταξη υποστηρίζει block flow, επικεφαλίδες, λίστες, περιγράμματα, backgrounds, αποστάσεις κουτιών, ρητά page breaks, πίνακες, εικόνες και αυτόματη σελιδοποίηση υπερχείλισης
- Πεδία κειμένου, κουμπιά, check boxes, radio buttons, text areas και select controls αποδίδονται ως στατικές εμφανίσεις ή ως native πεδία AcroForm όταν το
CreateAcroFormsείναι ενεργό
Μετρημένες παράγραφοι και διεύθυνση
Οι παράγραφοι τυλίγονται με τις μετρημένες προωθήσεις της τρέχουσας γραμματοσειράς, συμπεριλαμβανομένων αλλαγών γραμματοσειράς, εκτελέσεων bold και italic, letter spacing, word spacing, ρητών αλλαγών γραμμής, και ορίων χαρακτήρων Ανατολικής Ασίας· η στοίχιση και η διακόσμηση εφαρμόζονται ξεχωριστά σε κάθε προκύπτουσα γραμμή
Το direction: ltr, το direction: rtl, και το HTML attribute dir επιλέγουν διεύθυνση παραγράφου· το dir="auto" χρησιμοποιεί τη Unicode διεύθυνση του πρώτου ισχυρού χαρακτήρα
Σε Windows, οι εκτελέσεις bidirectional script επιλύονται με Uniscribe και αναδιατάσσονται across όρια στυλ, ενώ η υπάρχουσα μηχανή κειμένου PDF αναλαμβάνει το shaping γλυφών εντός κάθε εκτέλεσης· η διεύθυνση του εγγράφου, τα viewer preferences, και η αποθηκευμένη κατάσταση κειμένου σελίδας επανέρχονται μετά τη γραμμή
Τα inline overrides διεύθυνσης, τα bdi, και τα bdo προς το παρόν χρησιμοποιούν τη σειρά της παραγράφου και παράγουν διαγνωστικό hdkLayoutFallback· το unicode-bidi είναι εκτός αυτού του προφίλ, και το shaping script ακολουθεί ακόμα τη ρύθμιση shaping του εγγράφου
Κατάτμηση παραγράφων
Τα widows και orphans είναι κληρονομούμενοι θετικοί ακέραιοι, και οι δύο με προεπιλογή 2· η σελιδοποίηση χρησιμοποιεί τα μετρημένα line boxes αντί για εκτιμώμενο πλήθος χαρακτήρων
Ο importer μετακινεί μια παράγραφο ή προσαρμόζει το split της ώστε να μείνει το ζητούμενο ελάχιστο πλήθος γραμμών πριν και μετά από ένα page break· το break-inside: avoid κρατά μια παράγραφο ενωμένη όταν χωράει σε φρέσκια σελίδα
Όταν μια σελίδα δεν χωράει τον ζητούμενο περιορισμό, το rendering προχωρά χαλαρώνοντας τον περιορισμό και καταγράφοντας hdkPaginationConstraint· κάθε θραύσμα σελίδας λαμβάνει δικό του background και περιγράμματος
Προαιρετικός συλλαβισμός
Το hyphens: none καταστέλλει τις διακριτικές διακοπές, και το προεπιλεγμένο hyphens: manual χρησιμοποιεί U+00AD ή ­· ορατή παύλα εκπέμπεται μόνο όταν χρησιμοποιηθεί η επιλεγμένη διακοπή
Το hyphens: auto καλεί επιπλέον το OnHyphenate με τη λέξη και την κληρονομημένη τιμή HTML lang· χωρίς callback διατηρεί τις χειροκίνητες διακοπές και αναφέρει layout fallback, επειδή δεν δένεται κανένα γλωσσικό λεξικό
Οι θέσεις διακοπής μετρούν UTF-16 code units από την αρχή της λέξης· μη έγκυρες, εκτός εύρους, θέσεις που κόβουν surrogate ζεύγη, και θέσεις που κόβουν βασικά combining marks αγνοούνται
THPDFHTMLHyphenationEvent = procedure(
Sender: TObject;
const WordText, Language: WideString;
var BreakPositions: TArray<Integer>
) of object;
Φραγμένα κουτιά flex και grid
Το display: flex υποστηρίζει row, row-reverse, column, και column-reverse· τα θυγατρικά της σειράς χρησιμοποιούν ρητά πλάτη ή μοιράζονται το υπόλοιπο πλάτος, και θετικές τιμές flex-grow σταθμίζουν τον πρόσθετο χώρο
Οι σειρές υποστηρίζουν justify-content start, end, center, space-between, space-around, και space-evenly, συν στοίχιση cross-axis start, end, center, και stretch· η ροή στήλης υποστηρίζει φυσική κάθετη διάταξη και εκπέμπει διαγνωστικό για μη υποστηριζόμενη κατανομή σταθερού ύψους ή στοίχιση cross-axis
Το display: grid υποστηρίζει θετικά tracks σταθερού μήκους και fr στηλών, συμπεριλαμβανομένου φραγμένου repeat(n, tracks) με έως 64 στήλες· τα κελιά τοποθετούνται με τη σειρά πηγής, γεμίζοντας μία γραμμή τη φορά
Τα grid-column: span N και grid-column-end: span N επιτρέπουν σε ένα θυγατρικό να καταλάβει συνεχόμενα tracks και τα ενδιάμεσα gap τους· ένα στοιχείο που δεν χωράει στην τρέχουσα γραμμή μετακινείται στην επόμενη, και spans μεγαλύτερα από το πλήθος tracks παράγουν layout fallback
Το flex-wrap: wrap ξεκινά άλλη γραμμή όταν το ρητό πλάτος και το gap του επόμενου στοιχείου δεν χωράνε· κάθε γραμμή εφαρμόζει ανεξάρτητα flex-grow και justify-content, ενώ τα row-reverse και RTL αντιστρέφουν θέσεις εντός κάθε γραμμής χωρίς να μετακινούν στοιχεία ανάμεσα σε γραμμές
Το gap δέχεται ένα ή δύο μήκη, με ανεξάρτητα overrides row-gap και column-gap· οι παράλληλες σειρές μένουν σε μία σελίδα και ελέγχονται πριν τη ζωγραφική
Τα παράλληλα θυγατρικά υποστηρίζουν blocks κειμένου με inline στολίσιμο, recursively εμφωλευμένα συνηθισμένα block containers με padding, περιγράμματα και backgrounds, εμφωλευμένα flex και grid containers, εικόνες, και στατικά ή native controls φορμών
Οι εικόνες χρησιμοποιούν bytes από callback ή data URI, διατηρούν την εγγενή αναλογία διαστάσεων τους όταν δεν ορίζεται ύψος, και αποκωδικοποιούνται μία φορά ανά DOM κόμβο· preflight και fallback επαναχρησιμοποιούν την ίδια cached εικόνα χωρίς να καταναλώνουν άλλο αίτημα πόρου
Όλα τα θυγατρικά κουτιά μετρώνται πριν ζωγραφιστεί κάθε παράλληλη σειρά, οπότε μη υποστηριζόμενο ή υπερμεγέθες περιεχόμενο πέφτει σε κάθετη ροή σελίδας χωρίς επανάληψη ήδη ζωγραφισμένων σειρών· ο εμφωλευμένος σχεδιασμός φράσσεται σε 64 επίπεδα και καταναλώνει τον υπάρχοντα προϋπολογισμό λειτουργιών διάταξης
Τυλιγόμενα θυγατρικά χωρίς ρητό πλάτος καταλαμβάνουν μία ολόκληρη γραμμή· πίνακες και λίστες μέσα σε παράλληλα θυγατρικά, flex basis και shrink, wrap-reverse, εγγενές sizing tracks, grid row tracks και row spans, και ρητή grid τοποθέτηση παραμένουν εκτός αυτού του προφίλ και παράγουν παρατηρήσιμα διαγνωστικά
Διαγνωστικά μη υποστηριζόμενου CSS
Τα Diagnostics εκθέτουν εγγραφές με Kind, Subject, Value, και MessageText· το OnDiagnostic λαμβάνει τις ίδιες πληροφορίες κατά το rendering
Άγνωστες ιδιότητες, μη υποστηριζόμενες τιμές, μη υποστηριζόμενοι selectors, και μη υποστηριζόμενοι at-rules αγνοούνται με διαγνωστικό, συμπεριλαμβανομένων δηλώσεων σε αλλιώς αχρησιμοποίητους κανόνες stylesheet· οι pseudo selectors παραλείπονται αντί να μεταχειρίζονται ως συνηθισμένοι type selectors
Το StrictCSS, απενεργοποιημένο από προεπιλογή, σηκώνει EHPDFHTMLUnsupportedCSS σε διαγνωστικό· προηγούμενο περιεχόμενο μπορεί να έχει ήδη εκπεμφθεί, οπότε callers που απαιτούν εισαγωγή όλα-ή-τίποτα πρέπει να χρησιμοποιήσουν ξεχωριστό έγγραφο
Το MaxDiagnostics έχει προεπιλογή 256 και φράσσει τις διατηρούμενες εγγραφές· το DiagnosticCount και η παράδοση στο callback παραμένουν παρατηρήσιμα αφού επιτευχθεί το όριο αποθήκευσης, και μη θετικό όριο απενεργοποιεί την αποθήκευση εγγραφών
Οριοθετημένοι πόροι
Εξωτερικά stylesheets, εικόνες και γραμματοσειρές @font-face είναι απενεργοποιημένες εκτός αν το OnResource δώσει τα bytes τους, οπότε η εισαγωγή HTML δεν ανοίγει ποτέ αρχείο ή σύνδεση δικτύου implicit
Το @font-face υποστηρίζει μία πηγή url(...), προαιρετικό format('truetype') ή format('opentype'), ψευδώνυμο οικογένειας, στυλ normal ή italic, και βάρος normal, bold, 400, ή 700· το font-display δέχεται τις τυπικές πολιτικές, επειδή η offline εισαγωγή φορτώνει πόρους συγχρονισμένα
Οι γραμματοσειρές πρέπει να είναι ενσωματώσιμοι πόροι TrueType ή OpenType sfnt με ASCII όνομα οικογένειας Windows έως 31 χαρακτήρες· WOFF, font collections, local(...), variable descriptors, και λίστες πηγών παράγουν διαγνωστικά
Οι αποδεκτές γραμματοσειρές καταχωρούνται ιδιωτικά στη μνήμη της διεργασίας σε Windows και παραμένουν ιδιοκτησία του εγγράφου μέχρι να καταστραφεί, οπότε η απελευθέρωση του importer πριν το EndDoc δεν ακυρώνει την αναβληθείσα ενσωμάτωση γραμματοσειρών
Οι πόροι data: και τα αποτελέσματα του callback μοιράζονται τα όρια MaxResources, MaxResourceBytes και MaxTotalResourceBytes
Το MaxDecodedImageBytes έχει προεπιλογή 128 MiB και φράσσει ανεξάρτητα την cache αποκωδικοποιημένων εικόνων στα τέσσερα bytes ανά pixel· οι διαστάσεις BMP και PNG ελέγχονται πριν την αποκωδικοποίηση, και κάθε αποδεκτή εικόνα ελέγχεται πριν διατηρηθεί
Τα MaxDOMNodes, MaxCSSRules και MaxLayoutOperations οριοθετούν ανεξάρτητα την ανάλυση, την κατασκευή του cascade και τη δουλειά διάταξης
THPDFHTMLResourceEvent = procedure(
Sender: TObject;
const URI: WideString;
ResourceKind: THPDFHTMLResourceKind;
var Data: TBytes;
var ContentType: string;
var Handled: Boolean
) of object;
Στατιστικά
Η THPDFHTMLImportStatistics αναφέρει την έκδοση προφίλ, τους parsed κόμβους, τους κανόνες CSS, τις λειτουργίες διάταξης, τα page breaks, τους πίνακες, τα controls φορμών, τα αιτήματα πόρων, τις αποδεκτές και απορριφθείσες φορτώσεις, τα αποδεκτά bytes πόρων, τις μετρημένες γραμμές κειμένου, τις συλλαβισμένες γραμμές, τα διαγνωστικά, τα flex containers, και τα grid containers
Το OnLineLayout λαμβάνει τους μηδενικά-βασισμένους δείκτες σελίδας και γραμμής παραγράφου της γραμμής, την αρχή, το μετρημένο πλάτος και ύψος, το λογικό κείμενο, τη διεύθυνση, και τη σημαία συλλαβισμού, αφού το πραγματικό κείμενο PDF έχει εκπεμφθεί
Κάθε κλήση RenderHTML5 μηδενίζει την εγγραφή στατιστικών, και παραβιάσεις προϋπολογισμού σηκώνουν EHPDFHTMLImportBudget
Παράδειγμα
Importer := THPDFHTMLImporter.Create(Doc);
try
Importer.CreateAcroForms := True;
Importer.MaxResources := 16;
Importer.RenderHTML5(
'<style>@page { margin: 36pt } ' +
'table { width: 100% }</style>' +
'<h1>Invoice</h1>' +
'<table><tr><td>Total</td><td>42</td></tr></table>' +
'<input name="approved" type="checkbox">'
);
finally
Importer.Free;
end;
Δείτε επίσης: THPDFPage.TextOutHTML, Declarative Layout DOM, Υποστήριξη AcroForm