Τεχνικό Άρθρο

Μέτρηση Κειμένου PDF για Διάταξη και Αναδίπλωση Λέξεων στο Delphi

Η κλήση που (Η κλήση που) βάζει το κείμενο σε μια σελίδα (βάζει το κείμενο σε μια σελίδα) (P)PDF είναι (PDF είναι) απλή (απλή/straightforward). (Δ)Δίνετε στην (Δίνετε στην) AddText μια συμβολοσειρά (μια συμβολοσειρά), μια (μια) (γ)γραμματοσειρά (γραμματοσειρά), (έ)ένα μέγεθος (ένα μέγεθος), (κ)και μια (και μια) θέση (θέση), (κ)και τα (και τα) (γ)γλυφά (γλυφά/glyphs) (ε)εμφανίζονται (εμφανίζονται). Αυτό (Αυτό) (π)που δεν κάνει (που δεν κάνει) είναι (είναι) (ν)να σας (να σας) (π)πει πόσο πλάτος (πει πόσο πλάτος) θα έχει αυτή η συμβολοσειρά μόλις (θα έχει αυτή η συμβολοσειρά μόλις) (σχ)σχεδιαστεί (σχεδιαστεί), (κ)και (και) δεν (δεν) (σ)σπάει (σπάει) μια μεγάλη συμβολοσειρά (μια μεγάλη συμβολοσειρά) (σ)σε (σε) πολλές (πολλές) γραμμές (γραμμές/lines). Μια μονή κλήση ζωγραφίζει μια σειρά (Μια μονή κλήση ζωγραφίζει μια σειρά/run) κειμένου (κειμένου) σε μια (σε μια) θέση (θέση). Αν η σειρά (Αν η σειρά) είναι πιο φαρδιά από τη στήλη (είναι πιο φαρδιά από τη στήλη) (σ)στην (στην) οποία (οποία) (σ)σκοπεύατε να τη (σκοπεύατε να τη) (χ)χωρέσετε (χωρέσετε), (απ)απλά ξεφεύγει από την άκρη (απλά ξεφεύγει από την άκρη), (κ)και τίποτα (και τίποτα) (σ)στην (στην) κλήση σχεδίασης (κλήση σχεδίασης) (δ)δεν (δεν) σας προειδοποιεί (σας προειδοποιεί). Τη στιγμή που (Τη στιγμή που) (θ)θέλετε μια παράγραφο (θέλετε μια παράγραφο) (α)αντί για (αντί για) (μ)μια μεμονωμένη (μια μεμονωμένη) ετικέτα (ετικέτα/label), (τ)το (το) (κ)κομμάτι (κομμάτι) (π)που (που) λείπει είναι (λείπει είναι) το πλάτος (το πλάτος) μιας συμβολοσειράς στην επιλεγμένη γραμματοσειρά (μιας συμβολοσειράς στην επιλεγμένη γραμματοσειρά) (κ)και μέγεθος (και μέγεθος), (μ)μετρημένο (μετρημένο) (π)πριν (πριν) (τ)το (το) αναθέσετε στη (αναθέσετε στη) (σ)σελίδα (σελίδα)

Αυτό (Αυτό) είναι το (είναι το) κλασικό (κλασικό) πρόβλημα διάταξης (πρόβλημα διάταξης). (Γ)Για να (Για να) (α)αναδιπλώσετε μια (αναδιπλώσετε μια) (π)παράγραφο μέσα (παράγραφο μέσα) σε μια στήλη (σε μια στήλη) (π)πρέπει (πρέπει) (ν)να γνωρίζετε (να γνωρίζετε), λέξη (λέξη) προς (προς) (λ)λέξη (λέξη), (π)πόσο (πόσο) οριζόντιο χώρο (οριζόντιο χώρο) (θ)θα καταλάβει κάθε υποψήφια γραμμή (θα καταλάβει κάθε υποψήφια γραμμή), και (και) πρέπει να το γνωρίζετε (πρέπει να το γνωρίζετε) (π)πριν (πριν) (σχ)σχεδιάσετε οτιδήποτε (σχεδιάσετε οτιδήποτε). Η αναδίπλωση λέξεων (Η αναδίπλωση λέξεων) (ε)είναι (είναι) (έ)ένας βρόχος μέτρησης τυλιγμένος γύρω (ένας βρόχος μέτρησης τυλιγμένος γύρω) από μια (από μια) κλήση σχεδίασης (κλήση σχεδίασης), (κ)και ένα (και ένα) binding που μόνο σχεδιάζει (binding που μόνο σχεδιάζει) (σ)σας (σας) (δ)δίνει το (δίνει το) δεύτερο μισό (δεύτερο μισό). Η (Η) υποστήριξη μέτρησης (υποστήριξη μέτρησης) κειμένου στο στοιχείο (κειμένου στο στοιχείο) (P)PDFium (κ)κλείνει αυτό το (κλείνει αυτό το) (κ)κενό με δύο συναρτήσεις (κενό με δύο συναρτήσεις), την MeasureText (την) και την (και την) MeasureTextWidth, (π)που (που) (α)αναφέρουν τη ραστεροποιημένη (αναφέρουν τη ραστεροποιημένη) (έ)έκταση (έκταση/extent) (μ)μιας συμβολοσειράς χωρίς να (μιας συμβολοσειράς χωρίς να) βάλουν ούτε ένα (βάλουν ούτε ένα) σ(σημάδι/mark) σημάδι πάνω σε οποιαδήποτε σελίδα (πάνω σε οποιαδήποτε σελίδα)

Γιατί η (Γιατί η) μέτρηση είναι ένα (μέτρηση είναι ένα) class helper (class helper), όχι μια (όχι μια) (ν)νέα (νέα) μέθοδος στο (μέθοδος στο) TPdf

Η (Η) (υ)υποστήριξη μέτρησης (υποστήριξη μέτρησης) φτάνει ως (φτάνει ως) ένα (ένα) Delphi (Delphi) class helper για την (class helper για την) TPdf, (ζ)ζώντας (ζώντας) στο (στο) (δ)δικό (δικό) (τ)της unit (της unit), (α)αντί για (αντί για) (ν)νέες μεθόδους καρφωμένες (νέες μεθόδους καρφωμένες) (μ)μέσα στην κλάση (μέσα στην κλάση) TPdf. Ένα (Ένα) class helper είναι (class helper είναι) (έ)ένα χαρακτηριστικό της γλώσσας που σας (ένα χαρακτηριστικό της γλώσσας που σας) επιτρέπει (επιτρέπει) (ν)να επισυνάψετε (να επισυνάψετε) (μ)μεθόδους (μεθόδους) (σ)σε έναν υπάρχοντα (σε έναν υπάρχοντα) (τ)τύπο (τύπο) (απ)από (από) (έ)έξω από (έξω από) (τ)τη (τη) (δ)δήλωσή του (δήλωσή του). Μόλις το unit είναι εντός (Μόλις το unit είναι εντός) (ε)εμβέλειας (εμβέλειας/in scope), (ο)οι (οι) (ν)νέες μέθοδοι καλούνται ακριβώς (νέες μέθοδοι καλούνται ακριβώς) όπως (όπως) αν ανήκαν στην κλάση (αν ανήκαν στην κλάση), (ο)οπότε μια (οπότε μια) (μ)μέθοδος helper διαβάζεται ως (μέθοδος helper διαβάζεται ως) Pdf.MeasureTextWidth(...) (χ)χωρίς ξεχωριστό (χωρίς ξεχωριστό) (α)αντικείμενο (αντικείμενο) για (για) κατασκευή (κατασκευή) ή μετάδοση (ή μετάδοση)

Ο λόγος που στρωματοποιείται με αυτόν τον τρόπο (Ο λόγος που στρωματοποιείται με αυτόν τον τρόπο) (ε)είναι (είναι) ο διαχωρισμός (ο διαχωρισμός). Ο κεντρικός τύπος (Ο κεντρικός τύπος/core type) TPdf παραμένει ως έχει (παραμένει ως έχει), χωρίς να έχει (χωρίς να έχει) προστεθεί (προστεθεί) (κ)κανένα πεδίο και χωρίς να έχει αγγιχτεί καμία υπάρχουσα υπογραφή (κανένα πεδίο και χωρίς να έχει αγγιχτεί καμία υπάρχουσα υπογραφή), οπότε (οπότε) (έ)ένα project που δεν χρειάζεται ποτέ διάταξη (ένα project που δεν χρειάζεται ποτέ διάταξη) (δ)δεν (δεν) μεταφέρει ποτέ (μεταφέρει ποτέ) τον (τον) (κ)κώδικα (κώδικα) (μ)μέτρησης (μέτρησης). Ένα (Ένα) project που τον χρειάζεται προσθέτει ένα (που τον χρειάζεται προσθέτει ένα) unit (unit) σε μια ρήτρα (σε μια ρήτρα) uses (κ)και οι μεθόδοι (και οι μεθόδοι) "ανάβουν ("ανάβουν/light up). Η ικανότητα (Η ικανότητα) γίνεται (γίνεται) προαιρετική (προαιρετική) (σ)στην (στην) (κρ)κρυσταλλικότητα (κρυσταλλικότητα/granularity) (ε)ενός (ενός) μοναδικού unit (μοναδικού unit), (π)που (που) είναι ο (είναι ο) (π)πιο (πιο) καθαρός τρόπος (καθαρός τρόπος) για (για) (ν)να επεκτείνετε (να επεκτείνετε) έναν τύπο που (έναν τύπο που) (δ)δεν σας ανήκει ή δεν (δεν σας ανήκει ή δεν) (θ)θέλετε (θέλετε) (ν)να (να) (ε)ενοχλήσετε (ενοχλήσετε)

uses
  PDFium, FPdfView, FPdfEdit,
  FPdfMeasure;   // το helper unit; φέρνει την MeasureText εντός εμβέλειας στην TPdf

// Με το unit εντός εμβέλειας οι μεθόδοι διαβάζονται ως μέλη της TPdf:
var
  W, H: Double;
begin
  Pdf.MeasureText('Subtotal', 'Helvetica', 11, W, H);
  // Τα W και H είναι πλέον το ραστεροποιημένο πλάτος (width) και ύψος (height) σε μονάδες χρήστη PDF
end;

Μετρώντας χωρίς (Μετρώντας χωρίς) (ν)να (να) (αγ)αγγίζετε τη (αγγίζετε τη) (σ)σελίδα (σελίδα)

Η μέτρηση πρέπει να είναι απαλλαγμένη από παρενέργειες (Η μέτρηση πρέπει να είναι απαλλαγμένη από παρενέργειες). Πρέπει να (Πρέπει να) αναφέρει (αναφέρει) (έ)ένα πλάτος (ένα πλάτος) χωρίς να (χωρίς να) αφήνει τίποτα πίσω της (αφήνει τίποτα πίσω της), (ε)επειδή την καλείτε (επειδή την καλείτε) πολλές (πολλές) φορές καθώς (φορές καθώς) αποφασίζετε μια (αποφασίζετε μια) (δ)διάταξη (διάταξη) (κ)και η σελίδα (και η σελίδα) (π)πρέπει (πρέπει) (ν)να (να) φαίνεται (φαίνεται) ακριβώς όπως θα (ακριβώς όπως θα) φαινόταν αν δεν είχατε (φαινόταν αν δεν είχατε) (μ)μετρήσει (μετρήσει) ποτέ (ποτέ) τίποτα. Η (Η) (τ)τεχνική που (τεχνική που) (τ)το κάνει αυτό (το κάνει αυτό) δυνατό (δυνατό) (ε)είναι να (είναι να) δημιουργήσετε ένα αντικείμενο κειμένου (δημιουργήσετε ένα αντικείμενο κειμένου), (ν)να το (να το) (ρ)ρωτήσετε (ρωτήσετε) (γ)για το μέγεθός του (για το μέγεθός του), (κ)και (και) (ν)να το (να το) (π)πετάξετε (πετάξετε) (π)πριν καν επισυναφθεί (πριν καν επισυναφθεί) (σ)σε (σε) μια σελίδα (μια σελίδα)

Η (Η) (ακολουθία) ακολουθία (ακολουθία) (είναι τέσσερις) (είναι τέσσερις) είναι τέσσερις κλήσεις (κλήσεις) (P)PDFium. Η FPDFPageObj_NewTextObj (δ)δημιουργεί (δημιουργεί) (έ)ένα αντικείμενο (ένα αντικείμενο) κειμένου (κειμένου) (έ)έναντι του εγγράφου (έναντι του εγγράφου), δεδομένου (δεδομένου) (τ)του (του) (ο)ονόματος της γραμματοσειράς και του μεγέθους (ονόματος της γραμματοσειράς και του μεγέθους). Η FPDFText_SetText (ο)ορίζει τη (ορίζει τη) (συ)συμβολοσειρά που μεταφέρει (συμβολοσειρά που μεταφέρει) (τ)το (το) αντικείμενο (αντικείμενο). Η FPDFPageObj_GetBounds διαβάζει πίσω το οριοθετημένο κουτί (διαβάζει πίσω το οριοθετημένο κουτί/bounding box) (τ)του (του) (α)αντικειμένου (αντικειμένου). Η FPDFPageObj_Destroy (απ)απελευθερώνει το (απελευθερώνει το) αντικείμενο (αντικείμενο). Εξαιρετικά (Εξαιρετικά) (σ)σημαντικό (σημαντικό/crucially), (τ)τίποτα σε αυτήν την (τίποτα σε αυτήν την) (α)ακολουθία δεν καλεί (ακολουθία δεν καλεί) (τ)το (το) API (API) εισαγωγής (εισαγωγής) (σ)σελίδας (σελίδας). (Τ)Το (Το) (α)αντικείμενο (αντικείμενο) (δ)δημιουργείται (δημιουργείται), (ε)ερωτάται (ερωτάται/queried), (κ)και καταστρέφεται (και καταστρέφεται) (σ)σε (σε) απομόνωση (απομόνωση), (ο)οπότε (οπότε) το έγγραφο παραμένει (το έγγραφο παραμένει) αμετάβλητο όταν η συνάρτηση επιστρέφει (αμετάβλητο όταν η συνάρτηση επιστρέφει). (Ε)Είναι (Είναι) (έ)ένας ανιχνευτής (ένας ανιχνευτής/probe) μιας χρήσης (μιας χρήσης/throwaway) (τ)του οποίου η (του οποίου η) μόνη έξοδος είναι οι τέσσερις αριθμοί του οριοθετημένου του (μόνη έξοδος είναι οι τέσσερις αριθμοί του οριοθετημένου του) (κ)κουτιού (κουτιού)

Αυτός είναι (Αυτός είναι) ο (ο) (σ)στιβαρός (στιβαρός) τρόπος να το κάνετε αυτό επειδή (τρόπος να το κάνετε αυτό επειδή) (τ)το PDFium δεν εκθέτει (το PDFium δεν εκθέτει) (έ)ένα βολικό πλάτος (ένα βολικό πλάτος/advance width) προώθησης (προώθησης) (α)ανά γλυφό (ανά γλυφό) (π)που (που) (θ)θα μπορούσατε (θα μπορούσατε) να αθροίσετε (να αθροίσετε) (μ)μόνοι σας (μόνοι σας). Οι μετρικές των γλυφών (Οι μετρικές των γλυφών/Glyph metrics) (ε)εξαρτώνται από (εξαρτώνται από) το πρόγραμμα (το πρόγραμμα) (γρ)γραμματοσειράς (γραμματοσειράς), (απ)από (από) την (την) κωδικοποίηση (κωδικοποίηση), και από (και από) το πώς το (το πώς το) PDFium φορτώνει το (PDFium φορτώνει το) (πρ)πρόσωπο (πρόσωπο/face), (κ)και (και) δεν υπάρχει (δεν υπάρχει) (κ)καμία δημόσια (καμία δημόσια) (κλ)κλήση που να σας (κλήση που να σας) (π)παραδίδει (παραδίδει) την προώθηση (την προώθηση/advance) (κ)κάθε χαρακτήρα σε μια συμβολοσειρά (κάθε χαρακτήρα σε μια συμβολοσειρά). (Τ)Το οριοθετημένο (Το οριοθετημένο) (κ)κουτί (κουτί) ενός (ενός) (πρ)πραγματικού (πραγματικού) (α)αντικειμένου (αντικειμένου) (κ)κειμένου (κειμένου), (απ)από (από) (τ)την άλλη πλευρά (την άλλη πλευρά), (υ)υπολογίζεται (υπολογίζεται) (απ)από τον ίδιο μηχανισμό (από τον ίδιο μηχανισμό) (π)που θα διέτασσε τα (που θα διέτασσε τα) (γ)γλυφά για (γλυφά για) (σχ)σχεδίαση (σχεδίαση), (ο)οπότε αντικατοπτρίζει (οπότε αντικατοπτρίζει) την (την) πραγματική (πραγματική) (ρ)ραστεροποιημένη έκταση (ραστεροποιημένη έκταση) αντί (αντί) για μια (για μια) (πρ)προσέγγιση (προσέγγιση). Η (Η) δημιουργία ενός αντικειμένου μιας (δημιουργία ενός αντικειμένου μιας) χρήσης (χρήσης) (κ)και η ανάγνωση (και η ανάγνωση) (τ)των ορίων του (των ορίων του) (ε)είναι (είναι) (η) η (π)πιο (πιο) αξιόπιστη μέτρηση που (αξιόπιστη μέτρηση που) η βιβλιοθήκη (η βιβλιοθήκη) (μ)μπορεί (μπορεί) (ν)να δώσει (να δώσει)

// Το σχήμα (shape) της MeasureText, εκφρασμένο έναντι των επαληθευμένων (verified) κλήσεων PDFium.
// Ένα αντικείμενο κειμένου χτίζεται (built), μετριέται (measured), και καταστρέφεται (destroyed); καμία σελίδα δεν εμπλέκεται (involved).
procedure TPdfMeasureHelper.MeasureText(const Text, Font: WString;
  FontSize: Single; out Width, Height: Double);
var
  TextObject: FPDF_PAGEOBJECT;
  L, B, R, T: Single;
begin
  Width  := 0;
  Height := 0;
  if Self.Document = nil then
    Exit;
  TextObject := FPDFPageObj_NewTextObj(Self.Document,
    FPDF_BYTESTRING(AnsiString(Font)), FontSize);
  if TextObject = nil then
    Exit;
  try
    if FPDFText_SetText(TextObject, FPDF_WIDESTRING(WideString(Text))) = 0 then
      Exit;
    if FPDFPageObj_GetBounds(TextObject, L, B, R, T) <> 0 then
    begin
      Width  := R - L;
      Height := T - B;
    end;
  finally
    FPDFPageObj_Destroy(TextObject);   // ο ανιχνευτής (probe) απορρίφθηκε (discarded), η σελίδα έμεινε ανέπαφη (untouched)
  end;
end;

(Συντεταγμένες και) Συντεταγμένες (Συντεταγμένες) (κ)και μονάδες (και μονάδες) (τ)του (του) (απ)αποτελέσματος (αποτελέσματος)

Το οριοθετημένο κουτί (Το οριοθετημένο κουτί) (ε)επιστρέφει (επιστρέφει) (ω)ως (ως) τέσσερις ακμές (τέσσερις ακμές), (α)αριστερή (αριστερή), κάτω (κάτω), (δ)δεξιά (δεξιά), (κ)και (και) πάνω (πάνω), (κ)και οι (και οι) δύο (δύο) διαστάσεις (διαστάσεις) (π)προκύπτουν με αφαίρεση (προκύπτουν με αφαίρεση/fall out by subtraction). Το (Το) πλάτος είναι (πλάτος είναι) δεξιά μείον (δεξιά μείον) (α)αριστερά (αριστερά) (κ)και το (και το) ύψος (ύψος) (ε)είναι πάνω μείον (είναι πάνω μείον) κάτω (κάτω). Και τα (Και τα) δύο (δύο) εκφράζονται (εκφράζονται) σε μονάδες χρήστη (σε μονάδες χρήστη) PDF, (ό)όπου (όπου) (μ)μία μονάδα είναι το ένα (μία μονάδα είναι το ένα) εβδομηκοστό δεύτερο της ίντσας (εβδομηκοστό δεύτερο της ίντσας), (ο) ο ίδιος χώρος συντεταγμένων στον (ίδιος χώρος συντεταγμένων στον) οποίο (οποίο) τοποθετείτε (τοποθετείτε) (τ)το (το) κείμενο στη σελίδα (κείμενο στη σελίδα). Δεν (Δεν) (υ)υπάρχει (υπάρχει) κρυφή (κρυφή) μονάδα συσκευής (μονάδα συσκευής) και δεν (και δεν) εμπλέκεται (εμπλέκεται) (κ)κανένα (κανένα) pixel (pixel) σε (σε) (α)αυτό το στάδιο (αυτό το στάδιο). Ένα πλάτος (Ένα πλάτος) 36 (36) (σ)σημαίνει μισή (σημαίνει μισή) (ί)ίντσα (ίντσα) (σ)σελίδας (σελίδας), (ό)όποια κι αν (όποια κι αν) είναι η (είναι η) (τ)τελική ανάλυση απόδοσης (τελική ανάλυση απόδοσης)

Ο κάθετος άξονας (Ο κάθετος άξονας) (τ)τρέχει (τρέχει) (μ)με (με) (τ)τον (τον) (τ)τρόπο που το (τρόπο που το) (P)PDF τον (PDF τον) (ο)ορίζει (ορίζει), (μ)με το (με το) Y να (Y να) (α)αυξάνεται προς (αυξάνεται προς) (τ)τα πάνω (τα πάνω), πράγμα που (πράγμα που) (ε)είναι ο λόγος που (είναι ο λόγος που) το ύψος είναι πάνω μείον κάτω (το ύψος είναι πάνω μείον κάτω) (α)αντί (αντί) (γ)για το αντίστροφο (για το αντίστροφο). (Α)Αυτή η λεπτομέρεια (Αυτή η λεπτομέρεια) έχει (έχει) (σ)σημασία (σημασία) (ό)όταν (όταν) (π)προωθείτε (προωθείτε) (έ)έναν κέρσορα (έναν κέρσορα) (π)προς τα κάτω σε (προς τα κάτω σε) (μ)μια στήλη (μια στήλη). (Μ)Μετράτε το ύψος μιας γραμμής (Μετράτε το ύψος μιας γραμμής), (μ)μετά το αφαιρείτε (μετά το αφαιρείτε) (απ)από (από) (τ)την τρέχουσα (την τρέχουσα) (γ)γραμμή βάσης (γραμμή βάσης/baseline) (γ)για (για) να (να) βρείτε την επόμενη (βρείτε την επόμενη), (ε)επειδή η (επειδή η) (κ)κίνηση (κίνηση) (π)προς τα κάτω στη σελίδα σημαίνει (προς τα κάτω στη σελίδα σημαίνει) κίνηση (κίνηση) (π)προς μικρότερο (προς μικρότερο) Y. (Α)Αν ο (Αν ο) (πρ)προορισμός (προορισμός) (σ)σας (σας) είναι (είναι) (μ)μια οθόνη αντί για χαρτί (μια οθόνη αντί για χαρτί), μετατρέπετε (μετατρέπετε) (τ)τις μονάδες χρήστη (τις μονάδες χρήστη) (σ)σε (σε) pixels (pixels) (σ)συσκευής με (συσκευής με) (τ)την ανάλυση οθόνης (την ανάλυση οθόνης): μια τιμή (μια τιμή) (σ)σε (σε) μονάδες χρήστη (μονάδες χρήστη) πολλαπλασιασμένη με το (πολλαπλασιασμένη με το) DPI και (και) (δ)διαιρεμένη (διαιρεμένη) (μ)με (με) το 72 δίνει (το 72 δίνει) pixels, οπότε ένα πλάτος στήλης που ορίζετε (οπότε ένα πλάτος στήλης που ορίζετε) (σ)σε στιγμές (σε στιγμές/points) (μ)μπορεί (μπορεί) (ν)να αντιστοιχιστεί (να αντιστοιχιστεί/matched) (μ)με μια μετρημένη (με μια μετρημένη) σειρά πριν αποφασίσετε (σειρά πριν αποφασίσετε) (π)πού (πού) θα πάει (θα πάει) η (η) (α)αλλαγή γραμμής (αλλαγή γραμμής/break)

(Τι συμβαίνει) Τι συμβαίνει (Τι συμβαίνει) σε εκφυλισμένη είσοδο (σε εκφυλισμένη είσοδο/degenerate input)

Οι συναρτήσεις (Οι συναρτήσεις) (ε)είναι (είναι) γραμμένες για να αποτυγχάνουν ήσυχα (γραμμένες για να αποτυγχάνουν ήσυχα/fail quietly). (Α)Αν (Αν) (δ)δεν (δεν) (υ)υπάρχει ανοιχτό (υπάρχει ανοιχτό) έγγραφο, (ή) ή (ή) (α)αν (αν) (τ)το (το) αντικείμενο κειμένου δεν μπορεί να δημιουργηθεί (αντικείμενο κειμένου δεν μπορεί να δημιουργηθεί), το αποτέλεσμα είναι (το αποτέλεσμα είναι) μια έκταση ίση με μηδέν (μια έκταση ίση με μηδέν) (α)αντί για (αντί για) (τ)την έγερση μιας (την έγερση μιας) εξαίρεσης. (Τ)Το (Το) πλάτος (πλάτος) (κ)και το ύψος (και το ύψος) αρχικοποιούνται (αρχικοποιούνται) (σ)σε μηδέν (σε μηδέν) (σ)στην κορυφή και (στην κορυφή και) (ε)εγγράφονται από πάνω (εγγράφονται από πάνω) μόνο αφού (μόνο αφού) (έ)ένα οριοθετημένο κουτί (ένα οριοθετημένο κουτί) διαβαστεί (διαβαστεί) (ε)επιτυχώς (επιτυχώς). Μια άδεια (Μια άδεια) (σ)συμβολοσειρά (συμβολοσειρά), ένα (ένα) έγγραφο που λείπει (έγγραφο που λείπει), (μ)μια γραμματοσειρά (μια γραμματοσειρά) που η (που η) (β)βιβλιοθήκη (βιβλιοθήκη) δεν μπορεί (δεν μπορεί) (ν)να επιλύσει (να επιλύσει) σε αντικείμενο (σε αντικείμενο), (τ)το (το) (κ)καθένα από αυτά (καθένα από αυτά) επιστρέφει μηδέν αντί (επιστρέφει μηδέν αντί) (ν)να πετάξει (να πετάξει) εξαίρεση (εξαίρεση)

Αυτή (Αυτή) η επιλογή διατηρεί έναν (η επιλογή διατηρεί έναν) (β)βρόχο μέτρησης (βρόχο μέτρησης) απλό (απλό), επειδή ένας βρόχος (επειδή ένας βρόχος) (π)που τρέχει (που τρέχει) (π)πάνω από χιλιάδες (πάνω από χιλιάδες) (λ)λέξεις (λέξεις) δεν (δεν) (ε)είναι το κατάλληλο (είναι το κατάλληλο) μέρος για χειρισμό (μέρος για χειρισμό) (ε)εξαιρέσεων σε κάθε (εξαιρέσεων σε κάθε) (ε)επανάληψη (επανάληψη). Το κόστος είναι (Το κόστος είναι) ότι ο καλών φέρει (ότι ο καλών φέρει) τον έλεγχο (τον έλεγχο). (Έ)Ένα (Ένα) (μ)μηδενικό (μηδενικό) (π)πλάτος είναι ένας (πλάτος είναι ένας) (φ)φρουρός (φρουρός/sentinel), (ό)όχι ένα γεγονός για (όχι ένα γεγονός για) (τ)το (το) (κ)κείμενο (κείμενο), οπότε (οπότε) (ο) ο κώδικας που διαιρεί με (κώδικας που διαιρεί με) ένα μετρημένο πλάτος ή (ένα μετρημένο πλάτος ή) υποθέτει μια (υποθέτει μια) (θ)θετική τιμή (θετική τιμή) πρέπει (πρέπει) (ν)να προστατεύεται από (να προστατεύεται από) (τ)το (το) (μ)μηδέν πριν το (μηδέν πριν το) εμπιστευτεί (εμπιστευτεί). Χειριστείτε το (Χειριστείτε το) (μ)μηδέν (μηδέν) ως (ως) "δεν (δεν) μπόρεσε να μετρήσει" ("μπόρεσε να μετρήσει") και (και) (τ)το συμβόλαιο (το συμβόλαιο) (ε)είναι σαφές· αγνοήστε το (είναι σαφές· αγνοήστε το) (κ)και μια (και μια) εκφυλισμένη είσοδος αθόρυβα (εκφυλισμένη είσοδος αθόρυβα) γίνεται (γίνεται) (μ)μια διάταξη (μια διάταξη) (μ)με μια (με μια) στήλη (στήλη) από (από) (α)αλλεπάλληλα (αλλεπάλληλα/overlapping) γλυφά

(Μια) Μια άπληστη (άπληστη/greedy) (α)αναδίπλωση (αναδίπλωση) λέξεων χτισμένη πάνω (λέξεων χτισμένη πάνω) (σ)στη (στη) (μ)μέτρηση (μέτρηση)

Με μια συνάρτηση (Με μια συνάρτηση) πλάτους στο χέρι (πλάτους στο χέρι), η (η) αναδίπλωση λέξεων (αναδίπλωση λέξεων) (ε)είναι (είναι) ένας σύντομος (ένας σύντομος) άπληστος (άπληστος) (β)βρόχος (βρόχος). (Χ)Χωρίζετε την παράγραφο (Χωρίζετε την παράγραφο) σε (σε) λέξεις (λέξεις), (κ)κρατάτε μια (κρατάτε μια) τρέχουσα (τρέχουσα) (γ)γραμμή (γραμμή), και (και) για κάθε (για κάθε) (λ)λέξη μετράτε πώς (λέξη μετράτε πώς) θα ήταν (θα ήταν) η γραμμή (η γραμμή) αν προσαρτούσατε αυτή τη λέξη (αν προσαρτούσατε αυτή τη λέξη). (Ό)Όσο η (Όσο η) δοκιμαστική (δοκιμαστική) γραμμή ταιριάζει ακόμα (γραμμή ταιριάζει ακόμα) (σ)στο (στο) πλάτος της (πλάτος της) (σ)στήλης (στήλης) (σ)συνεχίζετε να (συνεχίζετε να) προσθέτετε· (προσθέτετε·) όταν αυτή (όταν αυτή) θα ξεχείλιζε (θα ξεχείλιζε/overflow), ξεπλένετε (ξεπλένετε/flush) την (την) τρέχουσα (τρέχουσα) (γ)γραμμή (γραμμή) με (με) (τ)την AddText (την) και ξεκινάτε (και ξεκινάτε) μια νέα (μια νέα) (μ)με τη (με τη) (λ)λέξη που (λέξη που) (δ)δεν ταίριαξε (δεν ταίριαξε). (Η) Η συσσώρευση γίνεται εξ ολοκλήρου (συσσώρευση γίνεται εξ ολοκλήρου) (μ)με την MeasureTextWidth (με την), (κ)και το μόνο πράγμα (και το μόνο πράγμα) που φτάνει ποτέ (που φτάνει ποτέ) (σ)στη (στη) (σ)σελίδα (σελίδα) είναι (είναι) μια (μια) (γ)γραμμή (γραμμή) (π)που έχετε (που έχετε) ήδη επιβεβαιώσει (ήδη επιβεβαιώσει) (ό)ότι χωράει (ότι χωράει)

procedure WrapParagraph(Pdf: TPdf; const Para, Font: WString;
  FontSize: Single; X, TopY, ColumnWidth, LineHeight: Double);
var
  Words: TArray<string>;
  Line, Trial: WideString;
  I: Integer;
  Y: Double;
begin
  Words := string(Para).Split([' ']);
  Line  := '';
  Y     := TopY;
  for I := 0 to High(Words) do
  begin
    if Line = '' then
      Trial := Words[I]
    else
      Trial := Line + ' ' + Words[I];
    // Μετρήστε (Measure) την υποψήφια (candidate) γραμμή πριν σχεδιάσετε οτιδήποτε.
    if (Line <> '') and (Pdf.MeasureTextWidth(Trial, Font, FontSize) > ColumnWidth) then
    begin
      Pdf.AddText(Line, Font, FontSize, X, Y);   // ξεπλύνετε (flush) τη γραμμή που χώρεσε (fit)
      Y    := Y - LineHeight;                    // Το Y μειώνεται πηγαίνοντας προς τα κάτω
      Line := Words[I];                          // η λέξη που ξεχειλίζει ξεκινά την επόμενη γραμμή
    end
    else
      Line := Trial;
  end;
  if Line <> '' then
    Pdf.AddText(Line, Font, FontSize, X, Y);      // ξεπλύνετε (flush) την τελική γραμμή
end;

Ο βρόχος μετράει τη δοκιμαστική γραμμή (Ο βρόχος μετράει τη δοκιμαστική γραμμή) (α)αντί να μετράει κάθε (αντί να μετράει κάθε) λέξη (λέξη) και να την προσθέτει (και να την προσθέτει), (ε)επειδή το (επειδή το) πλάτος μιας (πλάτος μιας) γραμμής δεν (γραμμής δεν) είναι το άθροισμα (είναι το άθροισμα) των (των) πλατών (πλατών) των (των) (λ)λέξεών της (λέξεών της). (Τ)Τα κενά (Τα κενά) ανάμεσα (ανάμεσα) (σ)στις (στις) λέξεις συνεισφέρουν (λέξεις συνεισφέρουν), και μια μετρημένη (και μια μετρημένη) (σ)σειρά (σειρά) (τ)το καταγράφει αυτό απευθείας (το καταγράφει αυτό απευθείας). (Ο) Ο άπληστος (άπληστος) κανόνας, βάλτε (κανόνας, βάλτε) όσες λέξεις επιτρέπει (όσες λέξεις επιτρέπει) (η) η στήλη (στήλη) (κ)και σπάστε (και σπάστε) στην τελευταία (στην τελευταία) (π)που χωράει (που χωράει), είναι ο (είναι ο) (ί)ίδιος κανόνας που γεμίζει (ίδιος κανόνας που γεμίζει) (τ)το κενό (το κενό) ανάμεσα (ανάμεσα) (σ)σε (σε) μια ακατέργαστη AddText (μια ακατέργαστη) και μια πραγματική παράγραφο (και μια πραγματική παράγραφο). Η κλήση (Η κλήση) (σχ)σχεδίασης δεν (σχεδίασης δεν) ήταν (ήταν) (π)ποτέ το δύσκολο (ποτέ το δύσκολο) κομμάτι. Η (Η) (μ)μέτρηση που πρέπει (μέτρηση που πρέπει) να προηγείται (να προηγείται) είναι (είναι), (κ)και (και) αυτό είναι (αυτό είναι) (α)ακριβώς (ακριβώς) (α)αυτό (αυτό) (π)που (που) (π)παρέχει ο (παρέχει ο) helper

Πού ταιριάζει (Πού ταιριάζει) (α)αυτό (αυτό)

Η μέτρηση (Η μέτρηση) (ε)είναι το (είναι το) (σ)στρώμα (στρώμα) ανάμεσα (ανάμεσα) (σ)στη δημιουργία του περιεχομένου (στη δημιουργία του περιεχομένου) (κ)και τη (και τη) (ρ)ραστεροποίησή του (ραστεροποίησή του), (ο)οπότε συνδυάζεται (οπότε συνδυάζεται) φυσικά (φυσικά) (μ)με την υπόλοιπη ροή (με την υπόλοιπη ροή) εργασιών ενός εγγράφου από το μηδέν (εργασιών ενός εγγράφου από το μηδέν/from-scratch). Αν (Αν) συναρμολογείτε σελίδες και τοποθετείτε κείμενο εξαρχής (συναρμολογείτε σελίδες και τοποθετείτε κείμενο εξαρχής), το (το) έδαφος (έδαφος) (β)βρίσκεται (βρίσκεται) στο άρθρο δημιουργία εγγράφων PDF από το μηδέν με (δημιουργία εγγράφων PDF από το μηδέν με) (τ)το (το) PDFium Component στο Delphi, (ό)όπου η (όπου η) AddText και η (και η) ρύθμιση σελίδας καλύπτονται πλήρως (ρύθμιση σελίδας καλύπτονται πλήρως). (Ό)Όταν η γραμματοσειρά που μετράτε (Όταν η γραμματοσειρά που μετράτε) (έ)έχει τόση σημασία όση (έχει τόση σημασία όση) και (και) η (η) (συ)συμβολοσειρά (συμβολοσειρά), (ε)επειδή οι (επειδή οι) (μ)μετρικές εξαρτώνται από το πρόσωπο (μετρικές εξαρτώνται από το πρόσωπο), η (η) ανάλυση των ιδιοτήτων της γραμματοσειράς (ανάλυση των ιδιοτήτων της γραμματοσειράς) PDF με το PDFium Component στο Delphi (δ)δείχνει (δείχνει) πώς η (πώς η) (β)βιβλιοθήκη (βιβλιοθήκη) αναφέρει (αναφέρει) (τ)τις πληροφορίες (τις πληροφορίες) της γραμματοσειράς (της γραμματοσειράς) που οδηγούν (που οδηγούν) αυτά τα οριοθετημένα (αυτά τα οριοθετημένα) (κ)κουτιά (κουτιά). Και (Και) (τ)τα (τα) (δ)δύο (δύο) βασίζονται (βασίζονται) στο ίδιο (στο ίδιο) binding, το PDFium Component για (για) Delphi (κ)και Lazarus, όπου ο (και Lazarus, όπου ο) (h)helper της μέτρησης (της μέτρησης) αποστέλλεται μαζί με τα (αποστέλλεται μαζί με τα) API (API) εγγράφου (εγγράφου), (σ)σελίδας (σελίδας), και κειμένου που περιγράφονται (και κειμένου που περιγράφονται) σε όλο αυτό το (σε όλο αυτό το) blog (blog)