fpPDF Fonts Umlaute/Dateigröße

Rund um die LCL und andere Komponenten
Benutzeravatar
Aidex
Beiträge: 60
Registriert: Do 24. Sep 2020, 07:02
OS, Lazarus, FPC: Win10 64bit, Laz v2.0.10
CPU-Target: AMD64

fpPDF Fonts Umlaute/Dateigröße

Beitrag von Aidex »

Hi!
Ich verwende fpPDF (fcl-pdf) mit Lazarus v2.0.10 auf Win10 64.

- Wenn ich einen internen Font wie "Helvetica" benutze, werden Umlaute nicht dargestellt.
Ist das so oder mache ich etwas falsch?

- Wenn ich externe TTF-Fonts per Dateiname einbette, gibt's Umlaute, aber die erzeugte PDF-Datei ist z.B. 1 MB statt vorher 30 kb groß.
Wenn ich deshalb die Option poSubsetFont aktiviere, wird die PDF-Datei schön klein, aber z.B. bei "Courier New" fehlen Buchstaben bzw. es sieht kaputt aus.

Kann das jemand bestätigen oder mache ich etwas falsch?
Ich hätte gerne Umlaute im PDF, aber nicht so riesige PDF-Dateien (für ein paar Zeilen Text).
Bin für Tipps dankbar. Grüße, Jörg

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: fpPDF Fonts Umlaute/Dateigröße

Beitrag von fliegermichl »

Ich denke

Code: Alles auswählen

 Page.WriteText(x, y, UTF8Decode('Lustiger Text tralalal äöüß'));
Sollte tun, was du erreichen willst.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: fpPDF Fonts Umlaute/Dateigröße

Beitrag von Winni »

Hi!

Mal ein paar Infos zum Einbetten der Fonts.

Die embedded Fonts wurden von PostScript übernommen, mit dem Ziel, aus der PDF einen graphischen Container zu erstellen. Dies ist wichtig für die Übermittlung graphischer Daten, die exact so erscheinen sollen, ohne dass der Zielrechner nun die gleichen Fonts wie der Quellrechner besitzt. Ein wichtiges Moment für den Datenaustausch von Verlagen, Graphik-Büros, Werbeagenturen und Druckereien.

Was macht PDF nun mit seinen embedded Fonts. Für *jeden* benutzten Buchstaben in *jedem* Font und in *jeder* Fontgröße wird eine hexadezimale Matrix der Bitmap dieses Buchstabens erstellt. Deshalb bläht sich die PDF sofort auf, wenn man auf embedded Fonts umstellt.

Wenn man es abstellt, steht da nur der Font, die Größe, etwaige Attribute (fett, kursiv, ...) und fertig. Wenn dieser Font auf der Zielmaschine nicht vorhanden ist, kann es dazu führen, dass ein Ersatzfont automatisch ausgewählt wird, der nicht passt. Und schon sieht es unschön aus.

Solange nur der Inhalt des Textes wichtig ist, mag das ja alles OK sein.
Wenn das aber die nächste Print-Anzeige für VW sein soll, dann muss die Schrift aber die hauseigene VAG.ttf sein. Sonst gibt's Mecker und weniger Geld....

Winni

xos
Beiträge: 13
Registriert: Mi 26. Dez 2007, 17:49
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Schweiz

Re: fpPDF Fonts Umlaute/Dateigröße

Beitrag von xos »

Ich stolpere gerade über die gleichen Probleme wie Aidex:

Punkt 1 Umlaute
Variante 1
ActPDFPage.WriteText(x/PDFScale, PageHeight-(y/PDFScale),'Lustiger Text tralalal äöüß');
Variante 2
ActPDFPage.WriteText(x/PDFScale, PageHeight-(y/PDFScale), UTF8Decode('Lustiger Text tralalal äöüß'));

ergibt im fpPDF V1
u1.jpg
u1.jpg (2.23 KiB) 1752 mal betrachtet
V2
u2.jpg
u2.jpg (1.84 KiB) 1752 mal betrachtet

Im Notepad++ schaut das PDF V1 so aus:
BT
39.12 666.25 TD
(Lustiger Text tralalal äöüß) Tj
ET

das PDF V2
BT
39.12 666.25 TD
(Lustiger Text tralalal ????) Tj
ET

Ähnliches mit AnsiToUtf8 oder Utf8ToAnsi oder UTF8Encode…

Im Notepad++ ist die PDF Textdatei jeweils eine Coding UTF-8 Datei. Wird nun die Variante 1 im Notepad++ auf eine ANSI Datei konvertiert, zeigt sich das PDF mit den korrekt dargestellten Umlauten.

Soweit so unklar.

Punkt 2 Dateigrösse
So wie ich die PDF Datei verstehe wird nicht ein «hexadezimale Matrix der Bitmap» abgelegt sondern ein Stream des ganzen Fonts. Ein TTF-Standardfont hat dabei oft eine Grösse von gegen 1MB. Mit allen Untergruppen (Fett, Fett Kursiv…) kommen da schnell mehrere MB zusammen.
Ein optimiertes PDF-Save speichert aber nur die in der Datei verwendeten Buchstaben des Fonts ab. Wie es aktuell aussieht, wird beim fpPDF immer der ganze Font in die Datei gespeichert.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: fpPDF Fonts Umlaute/Dateigröße

Beitrag von Winni »

Hi!

Zu Punkt 2:

Das wäre ein gravierender Rückschritt, denn:

PDF hat die Grafik-Mechanismen von Postscript übernommen. Und das hatte schon die Optimierung:

Wenn nur vier verschiedene Buchstaben eines Fonts in einer bestimmten Größe benutzt werden, so werden auch nur diese 4 gerendert und als Hex-Bitmap im PostScript-Code abgelegt.

So gesehen solltest Du das als Bug melden.

Winni

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: fpPDF Fonts Umlaute/Dateigröße

Beitrag von theo »

Den mit den eingebauten Fonts hatte ich mal gemeldet.
Müsste mit neueren FPC Sourcen klappen.
https://gitlab.com/freepascal.org/fpc/s ... sues/39554

xos
Beiträge: 13
Registriert: Mi 26. Dez 2007, 17:49
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Schweiz

Re: fpPDF Fonts Umlaute/Dateigröße

Beitrag von xos »

theo: habe 2.2.0/3.2.2 vom 26.6.22

winni: habe unter Delphi ein llPDFLib PDF Paket das sehr kompakte PDF schreibt. So wie ich fpPDF verstehe, wird mit fpPDF da der ganze Stream des Fonts gespeichert. Da ich aber von Delphi auf Lazarus portieren will, sollte der PDF Export in etwa gleich funktionieren.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: fpPDF Fonts Umlaute/Dateigröße

Beitrag von theo »

xos hat geschrieben:
Mo 8. Aug 2022, 16:05
theo: habe 2.2.0/3.2.2 vom 26.6.22
Hast du diese Version in "/packages/fcl-pdf/src/fppdf.pp"?
https://gitlab.com/freepascal.org/fpc/s ... c/fppdf.pp

Benutzeravatar
Aidex
Beiträge: 60
Registriert: Do 24. Sep 2020, 07:02
OS, Lazarus, FPC: Win10 64bit, Laz v2.0.10
CPU-Target: AMD64

Re: fpPDF Fonts Umlaute/Dateigröße

Beitrag von Aidex »

Schön, dass der Umlaut-Bug inzwischen behoben wurde. Werde ich demnächst mal testen.
Das wird meine Nutzer sehr freuen, denn wegen des Umlaut-Bugs konnte ich das interne Helvetica bisher nicht nutzen, sondern musste Arial als externen Font einbinden, was das PDF erheblich und unnötig vergrößerte.
xos hat geschrieben:
Mo 8. Aug 2022, 16:05
So wie ich fpPDF verstehe, wird mit fpPDF da der ganze Stream des Fonts gespeichert.
In fpPDF ist standardmäßig poCompressFonts aktiviert, siehe FOptions in TPDFDocument.Create(). Somit werden von einem externen Font nur die Buchstaben-Layouts eingebettet, die tatsächlich im Text verwendet werden - wenn ich das richtig verstehe. EDIT: die Option, die ich hier eigentlich meinte, heißt poSubsetFont und ist nicht standardmäßig aktiviert.

Die Info von Winni, dass zu jeder verwendeten Fontgröße quasi ein Bitmap gerendet und gespeichert würde, ist meiner Meinung nach falsch. TTF enthält Outline-Vektoren und so wie ich das Postscript-Prinzip verstehe, wird es vom Zielgerät in der benötigen Größe gerendert. Ich habe bisher nicht beobachten können, dass mehrere Größen derselben Schriftart (externer Font) die PDF-Datei zusätzlich vergrößern würden. Bei zusätzlicher Fettschrift und Kursiv ist dies jedoch leider der Fall, da dafür die entsprechenden Bold/Italic-Dateien jener Fontfamilie zusätzlich benötigt und eingebettet werden.
Zuletzt geändert von Aidex am Mo 8. Aug 2022, 21:34, insgesamt 1-mal geändert.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: fpPDF Fonts Umlaute/Dateigröße

Beitrag von Winni »

Hallo Aidex!

Also Adobe sagt, dass die graphische Engine von PostScript zu PDF rübergewandert ist. Und da war es so:

Nehmen wir einen einzelnen Buchstaben in 10 und 24 Punkt Größe. Der wurde in der jeweiligen Größe zweimal in PS als HexBitmap abgelegt. Das hatte den Vorteil, dass der Zielrechner nicht den TTF des Quellrechners haben musste. Das war wichtig, wenn Du Zeitung/Magazin/Werbung gemacht hast und so Deine 500 und mehr TTFs in benutzt hattest. Du konntest von der Druckerei nicht verlangen, dass die die gleichen Fonts wie der Quellrechner installiert hatte.

Das hat leider die PostScript-Dateien reichlich aufgebläht. Und geschätzt die erste Hälfte der PS-Datei waren erstmal gerenderte Buchstaben in allen ,möglichen Fonts und Größen.

Aus den Zeiten vor PDF, als wir des Nächtens riesige PostScript-Dateien per ISDN (Kanalbündelung! 128 kbit/s !) zur Druckerei schickten.

Winni

xos
Beiträge: 13
Registriert: Mi 26. Dez 2007, 17:49
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Schweiz

Re: fpPDF Fonts Umlaute/Dateigröße

Beitrag von xos »

theo: nein es ist die OriginalDatei von der 2.2.0 Installation. Ich kann aber die gitlab fppdf.pp Datei nicht nehmen da dann auch die sysutils.pp neuer sein sollte.... Da müsste ich vermutlich eine komplette Neuinstallation machen.

Aides: würde auch denken dass ein poCompressFonts nur die nötigen Buchstaben nimmt. Aber wenn ich den Code so anschaue, wird der Fontstream nur via einem TCompressionstream (ZStream.pp) komprimiert. Also nicht wirklich die verwendeten Buchstaben ausgelesen. (In der Datei fpPDF.pp -> procedure WriteEmbeddedFont -> TMemoryStream - > CompressStream)

Benutzeravatar
Aidex
Beiträge: 60
Registriert: Do 24. Sep 2020, 07:02
OS, Lazarus, FPC: Win10 64bit, Laz v2.0.10
CPU-Target: AMD64

Re: fpPDF Fonts Umlaute/Dateigröße

Beitrag von Aidex »

xos hat geschrieben:
Mo 8. Aug 2022, 20:58
wird der Fontstream nur via einem TCompressionstream (ZStream.pp) komprimiert
Ups, ich habe es vorhin mit der Option poSubsetFont verwechselt.
So wie ich es grob überflogen sehe, wird durch poSubsetFont ein TextMapping für die tatsächlich verwendeten Buchstaben gemacht und daraus ein kleineres SubsetFont.ttf gespeichert und eingebettet.
Die Option poSubsetFont ist nicht standardmäßig aktiviert, sondern muss bei Bedarf nach einem TPDFDocument.Create zu den Options addiert werden.

@Winni: Aber heutzutage werden halt die TTFs auf Wunsch eingebettet (außer bei Abschaltung durch die Option poNoEmbeddedFonts in fpPDF).
Hat wohl auch den Vorteil, dass man ein PDF zumindest bzgl. der Schrift beliebig zoomen kann, ohne dass die Buchstaben eckig werden, auch wenn die Schriftart auf dem Zielrechner nicht installiert ist.
Zuletzt geändert von Aidex am Mo 8. Aug 2022, 21:35, insgesamt 1-mal geändert.

Benutzeravatar
Aidex
Beiträge: 60
Registriert: Do 24. Sep 2020, 07:02
OS, Lazarus, FPC: Win10 64bit, Laz v2.0.10
CPU-Target: AMD64

Re: fpPDF Fonts Umlaute/Dateigröße

Beitrag von Aidex »

gelöscht (war doppelt)
Zuletzt geändert von Aidex am Mo 8. Aug 2022, 21:49, insgesamt 1-mal geändert.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: fpPDF Fonts Umlaute/Dateigröße

Beitrag von Winni »

Hi!

Wir lernen dazu:

----snip---------

Schriftenverwaltung - Alle im PDF verwendeten Schriften können direkt im
Dokument eingebettet werden. Das garantiert, dass der Text bei der Darstel-
lung immer exakt gleich aussieht. Um Platz zu sparen, lassen sich die
Schriften einschränken, sodass sie nur noch über diejenigen Zeichen verfü-
gen, die auch wirklich verwendet werden

----snap-------

Aus: https://www.pdf-tools.com/public/downlo ... gen-DE.pdf


Das heisst PDF bietet zwei Optionen:

a) liefere nur die Zeichen mit, die benötigt werden - wie ich es bei PostScript beschrieben habe,
b) liefer den gesamten Font mit. Das ist von der Programmierung her bestimmt einfacher, weil die Buchhaltung über die benutzten Buchstaben enfällt. Es wirft aber auch Fragen bzgl. des Copyrights auf.

In wieweit nun Option a) (Der PostScript-Standard) nun in fpPDF implementiert ist, ist mir unbekannt.

Obiger Link ist zu empfehlen - geballte Information ohne Schnörkel und Laberei.

Winni

xos
Beiträge: 13
Registriert: Mi 26. Dez 2007, 17:49
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Schweiz

Re: fpPDF Fonts Umlaute/Dateigröße

Beitrag von xos »

Aidex: Option -> poSubsetFont ... Danke für den Tipp, werde ich testen !

Antworten