Wie geht das: rechtsbündiger Text mit fpPDF?

Rund um die LCL und andere Komponenten
kirchfritz
Beiträge: 227
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win11 (L 3.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Re: Wie geht das: rechtsbündiger Text mit fpPDF?

Beitrag von kirchfritz »

Es sind Windows-Pfade
und ja, du hast recht, da ist ein Tippfehler mit dem "\" am Anfang des Pfades.
Richtiger ist das hier:

Code: Alles auswählen

  if not FileExists('C:\Lazarusprojekte\trunk\PDF_Archiv\fonts\NotoSansSymbols-Regular.ttf') then
  begin
    Writeln('Fontdatei nicht gefunden: '+ 'C:\Lazarusprojekte\trunk\PDF_Archiv\fonts\NotoSansSymbols-Regular.ttf');
    exit;
  end;
  AndererFontID := Document.AddFont('C:\Lazarusprojekte\trunk\PDF_Archiv\fonts\NotoSansSymbols-Regular.ttf','NotoSansSymbols-Regular');      
das problem ist aber weiterhin ungelöst.
Die Font-Datei wird gefunden, trotzdem wirft das

Code: Alles auswählen

Document.AddFont('C:\Lazarusprojekte\trunk\PDF_Archiv\fonts\NotoSansSymbols-Regular.ttf','NotoSansSymbols-Regular');     
eine exception. Was läuft da verkehrt?
Die Fonts-Datei findet man gezippt im Anhang.
Dateianhänge
NotoSansSymbols.zip
(832.63 KiB) 47-mal heruntergeladen

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

Re: Wie geht das: rechtsbündiger Text mit fpPDF?

Beitrag von theo »

Keine Ahnung auf Linux geht's.
Der Code ist ja nicht von mir, der ist in fpPDF

Code: Alles auswählen

function TPDFDocument.AddFont(AFontFile: String; AName: String): Integer;     
Musst halt mal debuggen um zu sehen, wo es hängt.

Benutzeravatar
Zvoni
Beiträge: 396
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Wie geht das: rechtsbündiger Text mit fpPDF?

Beitrag von Zvoni »

Wenn man in den Quellcode schaut:

Code: Alles auswählen

function TPDFDocument.AddFont(AFontFile: String; AName: String): Integer;
var
  F: TPDFFont;
  i: integer;
  lFName: string;
begin
  { reuse existing font definition if it exists }
  Result:=Fonts.FindFont(AName);
  if Result>=0 then exit;
  F := Fonts.AddFontDef;
  if ExtractFilePath(AFontFile) <> '' then
    // assume AFontFile is the full path to the TTF file
    lFName := AFontFile
  else
    // assume it's just the TTF filename
    lFName := IncludeTrailingPathDelimiter(FontDirectory)+AFontFile;
  F.FontFile := lFName;
  F.Name := AName;
  F.IsStdFont := False;
  Result := Fonts.Count-1;
end;
Benutz mal selbst "ExtractFilePath" bzw. " IncludeTrailingPathDelimiter(FontDirectory)+AFontFile;"
und schau nach ob was gescheites rauskommt
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

kirchfritz
Beiträge: 227
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win11 (L 3.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Re: Wie geht das: rechtsbündiger Text mit fpPDF?

Beitrag von kirchfritz »

Die Exception fliegt auch nicht beim fppdf sondern bei pdfhelpers
Screenshot 2025-06-04 124749.png
Screenshot 2025-06-04 124749.png (56.99 KiB) 267 mal betrachtet

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6846
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Wie geht das: rechtsbündiger Text mit fpPDF?

Beitrag von af0815 »

Der ist nicht im Fontcache. Der Fontcache ist ein Singleton, der normal in den Standard Verzeichnissen nach Fonts sucht. Legt man den Font nicht in die Verzeichnisse des Systems ab, so muss man den Fontcache selbst mit den richtigen Verzeichnissen aufrufen. Auch kann man den Fontcache gleich nutzen um an die Namen der gefundenen Fonts heran zu kommen, weil das macht auch schon Mal Probleme. Umgekehrt, ist der Font im Fontcache, so wird er auch gefunden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: Wie geht das: rechtsbündiger Text mit fpPDF?

Beitrag von theo »

Auf Linux geht das. Auf Windows müsste es jemand anderes debuggen.
Es geht um den Code in fpTTF.

Ich sagte ja bereits: "Das PDF Zeug ist immer eine Tüftelei, da muss man sich etwas hineindenken. "
S.a. FamilyName vs PostScriptName

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 385
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Wie geht das: rechtsbündiger Text mit fpPDF?

Beitrag von Jorg3000 »

Hi!
Ich habe gerade in meine alten Units geschaut, was ich damals beim gleichen PDF-Problem für die Textgröße gebastelt hatte.

Code: Alles auswählen

uses fpTTF;

function findFPFontCacheItem_byFamilyName(const aFamilyName: String; aBold, aItalic: Boolean): TFPFontCacheItem;
begin
  if aFamilyName='' then Exit(nil);

  if (gTTFontCache.Count<=0) or (gTTFontCache.SearchPath.Count=0) then gTTFontCache.ReadStandardFonts();

  Result := gTTFontCache.Find(aFamilyName,aBold,aItalic);  // 'Arial' <= PostScriptName="ArialMT" // gTTFontCache.Find(pf.Name) wäre für PostScriptName!
end;
Der FamilyName ist z.B. einfach nur "Arial", während der PostScriptName z.B. "ArialMT" wäre.
Übergibt man der Find-Funktion 3 Parameter, ist der FamilyName anzugeben, bei der gleichnamigen Funktion mit einem Parameter wäre der PostScriptName erforderlich.

Der Schlüssel zum erfolgreichen Auffinden des Fonts ist gTTFontCache.ReadStandardFonts() wodurch alle vorhandenen Fonts eingelesen werden, denn der Cache ist standardmäßig leer, weshalb dann kein Font gefunden wird.

Das resultierende TFPFontCacheItem hat die Methoden .TextWidth() und .TextHeight()

Grüße, Jörg

Antworten