fpPDF Fonts Umlaute/Dateigröße
- 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
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
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
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1355
- 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
Ich denke
Sollte tun, was du erreichen willst.
Code: Alles auswählen
Page.WriteText(x, y, UTF8Decode('Lustiger Text tralalal äöüß'));
- 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
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
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
-
- 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
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
V2
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.
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
V2
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.
- 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
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
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
Re: fpPDF Fonts Umlaute/Dateigröße
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
Müsste mit neueren FPC Sourcen klappen.
https://gitlab.com/freepascal.org/fpc/s ... sues/39554
-
- 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
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.
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.
Re: fpPDF Fonts Umlaute/Dateigröße
Hast du diese Version in "/packages/fcl-pdf/src/fppdf.pp"?
https://gitlab.com/freepascal.org/fpc/s ... c/fppdf.pp
- 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
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.
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.
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.
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.
- 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
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
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
-
- 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
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)
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)
- 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
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.
- 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
gelöscht (war doppelt)
Zuletzt geändert von Aidex am Mo 8. Aug 2022, 21:49, insgesamt 1-mal geändert.
- 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
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
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
-
- 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
Aidex: Option -> poSubsetFont ... Danke für den Tipp, werde ich testen !