Εισαγωγή 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, σελιδοποιημένη διάταξη, πίνακες και φόρμες, και οριοθετημένους πόρους

Μετρημένες παράγραφοι και διεύθυνση

Οι παράγραφοι τυλίγονται με τις μετρημένες προωθήσεις της τρέχουσας γραμματοσειράς, συμπεριλαμβανομένων αλλαγών γραμματοσειράς, εκτελέσεων 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