[GELÖST] fcl-pdf TextMetrics WordWrap in Verbinung mit fpttf

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

[GELÖST] fcl-pdf TextMetrics WordWrap in Verbinung mit fpttf

Beitrag von petwey »

Hallo Forum,

ich experimentiere gerade mit fcl-pdf. Arbeite mich durch die Anleitung:
https://www.freepascal.org/~michael/art ... lazpdf.pdf
und hab mir auch das Beispiel angeschaut und zum Laufen gebracht. Dazu war es unter anderem auch notwendig FreeSans.ttf herunterzuladen und im fonts-Unterverzeichnis zu platzieren.

Jetzt bin ich an der Stelle angelangt, die Textabmasse zu bestimmen. Nach der Beschreibung und dem Beispiel geht es am einfachsten über gTTFontCache. Es funktioniert alles wenn ich FreeSans.ttf verwende, aber nicht wenn ich z.B. NotoSansJP-Bold.ttf (aus dem Internet) oder YuGothM (aus dem Win-Fonts-Verzeichnis und als TTF umgewandelt) verwende. In diesem Fall bekomme ich die Meldung dass der Font nicht gefunden werden kann.
Bei allen Fonts ist gleich: Sie liegen im fonts-Unterverzeichnis und sind nicht unter Windows installiert. Ich könnte sie auch installieren, aber warum funktioniert es dann mit FreeSans?

Für mich stellen sich 2 Fragenstellungen:
1.) Gibt es irgendwelche Restriktionen für die zu verwendenden ttf-Dateien (Version, etc)? Ich verwende fptff. Werden hier vielleicht noch weitere units benötigt? Wenn ja welche.
2.) Wie komme ich an die Abmasse der Standard-Schriftarten wie z.B. Courier?

Vielleicht kann ich mir das Ganze ja auch sparen. Ziel ist es auch Fliesstexte mit Zeilenumbruch im PDF zu erstellen. Vielleicht gibt es ja hier bereits Beispiele dafür.

Ich bin auch gerne bereit alternative Wege einzuschlagen und mir z.B. über einen Canvas die TextMetrics ausgeben zu lassen, aber die Font-Definitionen im fcl-pdf und graphics sind nicht das selbe. Wie könnte ich dem Canvas.Font beibringen, dass er den FreeSans.ttf aus dem fonts-Unterverzeichnis nutzen soll? Und auch hier wie kann ich Canvas.Font mit den PDF-Standard-Fonts verknüpfen?

Danke für Eure Hilfe im voraus. Im Endeffekt brauch ich nur einen Lösungsansatz.
Zuletzt geändert von petwey am Fr 9. Jun 2023, 06:08, insgesamt 1-mal geändert.
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

Re: fcl-pdf TextMetrics WordWrap in Verbinung mit fpttf

Beitrag von petwey »

Hallo Forum,

zu meiner ersten Fragestellung bin ich mittlerweile weitergekommen.

Die Funktion AddFont für die TTF-Fonts hat 2 Parameter: den FFT-Filename und einen Namen. Diesem Namen habe ich eine höhere Bedeutung beigemessen als er zu haben scheint.
Ich dachte dieser Name müsste dann auch bei der Bestimmung der Texthöhe und Breite verwendet werden, aber da lag ich falsch.

Code: Alles auswählen

Var
  lFC: TFPFontCacheItem;
  H, D, T : single;

  // Vorbereitung 
  gTTFontCache.SearchPath.Add(Doc.FontDirectory + 'fonts');
  gTTFontCache.BuildFontCache;
  
    // Font selektieren
    lFC := gTTFontCache.Find(FontName, False, False);
    if not Assigned(lFC) then
      raise Exception.Create(FontName + ' font not found');

   // H und D berechnen lassen
   H := lFC.TextHeight('ÁyÂg', FontSize, D);
   // Umrechnen auf mm
   H := (H * 25.4) / gTTFontCache.DPI; // Höhe über Basis-Linie
    D := (D * 25.4) / gTTFontCache.DPI;  // Bereich unter der Basis-Linie
    T := D + H; // Gesamte Höhe
  
Wichtig in diesem Code-Schnipsel ist der FontName. Er muss dem exakten Fontnamen entsprechen, wie er beispielsweise in Word zur Auswahl steht. Ich dachte er müsse mit dem Namen der in AddFont verwendet wird übereinstimmen. Das war mein Fehler.

Was noch offen steht ist die Frage wie kann ich diese Werte bei den PDF-Standard-Fonts ermitteln.
Wenn ich das ganze mit dem Fontnamen := 'Courier' ausführe erhalte ich die Meldung, dass es diesen Font nicht gibt, aber dieser Font gehört zu den Standard-Fonts für PDFs, siehe
https://www.ibm.com/docs/en/cmofi/7.3.0 ... -file-size

Also nochmal wie komme ich an die Höhen (und die Breite) bei PDF-Standard-Fonts?
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

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

Re: fcl-pdf TextMetrics WordWrap in Verbinung mit fpttf

Beitrag von theo »

petwey hat geschrieben:
Do 8. Jun 2023, 20:40
Also nochmal wie komme ich an die Höhen (und die Breite) bei PDF-Standard-Fonts?
Ich hatte mal so etwas gebastelt (Attachment).
Vielleicht ist es das, was du suchst.
Es ist ein Helper für TPDFPage. Also mit dieser Unit in der Uses bekommt TPDFPage weitere Methoden.

Wahrscheinlich brauchst du von dort einfach GetTextDimsMm, das sollte auch für Standard Fonts klappen.
Hab's nicht mehr getestet, aber es sollte funktionieren oder dich wenigstens auf die richtige Spur bringen.
Dateianhänge
pdfhelpers.zip
(4.08 KiB) 30-mal heruntergeladen

petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

Re: fcl-pdf TextMetrics WordWrap in Verbinung mit fpttf

Beitrag von petwey »

Hallo Theo,

vielen, lieben Dank. Das ist die Lösung. Aber ich wäre nie darauf gekommen!!

Zum einen hätte ich nicht gewusst, woher ich die ganzen Informationen für die großen Arrays wie FONT_HELVETICA_ARIAL zu nehmen sind.

Zum anderen ist mir die Technik mit der "class helper for" völlig neu. Ich musste erstmal nachlesen was das überhaupt ist.
https://wiki.freepascal.org/Helper_types
In meinen Woren:
Hiermit kann man eine Klasse um Funktionalität erweitern ohne sie ableiten zu müssen. Im Einsatz kann man den ursprüngllichen Klassennamen weiterhin verwenden, nur hat die Klasse jetzt neue, weitere Funktionen. Das ist einfach toll!!
Gibt es das schon lange? Ich bin völlig fasziniert.

Für den Einsatz hier sollte man noch sagen:
- Die unit pdfhelpers muss eingebunden werden.
- Danach stehen der Page die neuen Funktionen zur Verfügung

Code: Alles auswählen

uses
  ....
  pdfhelpers;
  
 Var
   W, H, D : TPDFFloat;
 begin  
 ....
    fPage.GetTextDimsMm('ÁyÂg', W, H, D); 
 ....
 end; 
Damit ist das Problem für mich gelöst.
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

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

Re: [GELÖST] fcl-pdf TextMetrics WordWrap in Verbinung mit fpttf

Beitrag von theo »

Schön, dass es klappt.
Achte noch darauf, dass du keinen alten FPC verwendest.
Ich hatte vor etwas mehr als einem Jahr noch einen Bug in diesem Bereich gemeldet:
https://gitlab.com/freepascal.org/fpc/s ... sues/39554
Deine FPC Version sollte also neuer sein.

Antworten