Umlaute und Sonderzeichen

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Benutzeravatar
Lincoln Six Echo
Beiträge: 138
Registriert: Di 26. Aug 2014, 16:42
OS, Lazarus, FPC: Win10, Debian
CPU-Target: I7/I9/Q9650/u.a.
Wohnort: Hamburg

Umlaute und Sonderzeichen

Beitrag von Lincoln Six Echo »

Ich weiß - das ist hier schon oft besprochen worden. Dennoch habe ich ein ganz spezielles Problem mit Umlauten und Sonderzeichen:

Es geht um die Erstellung von PDF-Dokumenten mit Lazarus. Die können erstmal ohne weiteres keinen Unicode. Wenn man bedenkt aus welcher Zeit das PDF-Format stammt wundert das auch nicht.

Mit Lazarus habe ich ja nun viele Möglichkeiten: UnicodeString, RawByteString; Ansi usw.

Aber, egal was ich mache, schreibe ich etwas anderes als ANSI in einen Stream, macht JEDER PDF Reader daraus Murks, teilweise verweigern die das Öffnen des Dokuments komplett.

Bei HTML kann ich immerhin mit Ü usw arbeiten. Bei PDF geht das nicht.

Bitte keine Ausführungen "mit Delphi geht das alles....". Ich nutze Lazarus seit es Lazarus gibt und denke, das es eine der besten und ausgereifesten IDEs ist die es gibt Im Bereich Object-Pascal für mich klar die No. 1.

Hat hierzu jemand eine Idee ?

Hier noch ein paar Fakten:

Den PDF Quelltext erstellt mit 1. Stream.Write('äöäüäöäöü') oder 2. TStringList.Add('äöäüäöäöü') bringt das gleiche Ergebnis.

Im Texteditor von Win 10 z.B. werden die Umlaute im Quelltext korrekt angezeigt, unten wird in beiden Versionen "UTF-8" als Codierung angezeigt.

Alle Browser sowie alle PDF-Reader zeigen aber Murks an.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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: Umlaute und Sonderzeichen

Beitrag von af0815 »

Gibt es PDFs die das trotzdem können ? Wenn ja, was steht dort drinnen im Vergleich zu dem mit Lazarus generierten.

PDF ist ja auch nur eine Beschreibungssprache. Und die englischen Programmierer haben kein Problem mit Umlauten 😀
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Lincoln Six Echo
Beiträge: 138
Registriert: Di 26. Aug 2014, 16:42
OS, Lazarus, FPC: Win10, Debian
CPU-Target: I7/I9/Q9650/u.a.
Wohnort: Hamburg

Re: Umlaute und Sonderzeichen

Beitrag von Lincoln Six Echo »

Genau. Meine PDF-Engine ist ca. 9 Jahre alt. Bisher alles kein Problem, da nur englische PDFs erstellt wurden.

Texte die in PDF Readern korrekt dargestellt werden sind im Quelltext nicht anders als andere auch. Das ist ja gerade das Seltsame.

Öffne ich so ein PDF z.B. in Lazarus werden die Zeichen auch als "Ö Ä Ü" dargstellt.

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

Re: Umlaute und Sonderzeichen

Beitrag von theo »

Mit eingebauten (Standard-) Fonts funktionieren Umlaute jetzt in fpPDF
https://gitlab.com/freepascal.org/fpc/s ... sues/39554

Mit externen FontDateien müsste es sowieso funktionieren.

Benutzeravatar
Lincoln Six Echo
Beiträge: 138
Registriert: Di 26. Aug 2014, 16:42
OS, Lazarus, FPC: Win10, Debian
CPU-Target: I7/I9/Q9650/u.a.
Wohnort: Hamburg

Re: Umlaute und Sonderzeichen

Beitrag von Lincoln Six Echo »

PDF ist ja auch nur eine Beschreibungssprach
Jain, PDFs können auch Binäre Daten/Objekte usw enthalten. Und Z.B. Embedded Fonts.

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

Re: Umlaute und Sonderzeichen

Beitrag von theo »

Was genau geht denn nicht?
Wie wär's mal mit einem Code Beispiel?
Ich sehe soweit keine Probleme mit der Version vom "Trunk".
test.pdf
(19.14 KiB) 63-mal heruntergeladen
Hast du {$codepage UTF8} in der Unit gesetzt (bei Nutzung in der Lazarus Umgebung).

Benutzeravatar
Lincoln Six Echo
Beiträge: 138
Registriert: Di 26. Aug 2014, 16:42
OS, Lazarus, FPC: Win10, Debian
CPU-Target: I7/I9/Q9650/u.a.
Wohnort: Hamburg

Re: Umlaute und Sonderzeichen

Beitrag von Lincoln Six Echo »

Ein einfaches Testprogramm für fpPDF bringt mit eingebetteten Fonts die folgenden Ergebnisse:

Font: Arial
Die Schrift wird in allen PDF-Readern richtig dargestellt, 'Ä Ö Ü' ergibt Müll.

Font: Verdana
Die Schrift wird in allen PDF-Readern richtig dargestellt, 'Ä Ö Ü' ergibt Müll.

Font: Comic Sans MS
Die Schrift wird in allen PDF-Readern richtig dargestellt, 'Ä Ö Ü' ergibt Müll.

Die einzige Lösung die funktioniert ist die folgende:

Code: Alles auswählen

begin
  PDF := TPDFDocument.Create(NIL)
  ...
  PDF.AddFont('c:\windows\fonts\verdana.ttf','verdana.ttf');
  PDF.SetFont(0,25);
  PDF.WriteText(UTF8Decode('Ä Ö Ü ß'));
  
  PDF.SaveToFile('test.pdf')
end;  
Leider werden durch die Fonts die PDF-Dateien relativ groß.

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

Re: Umlaute und Sonderzeichen

Beitrag von theo »

Du hast die Frage nicht beantwortet, die ich dir oben gestellte hatte. (Ganz am Ende, unter dem Link).
UTF8Decode brauchst du mMn nicht.

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

Re: Umlaute und Sonderzeichen

Beitrag von theo »

Ich habe hier mal was gebastelt, damit wir vom Gleichen reden.
Damit die Umlaute beim eingebauten Font funktionieren, muss man die letzte Version von "fppdf" haben.
Für die User-Pfad Demo, braucht es "./'fonts/FreeSans.ttf". Kann man auch auskommentieren.

Code: Alles auswählen

unit Unit1;

{$mode objfpc}{$H+}
{$codepage UTF8}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, LCLIntf, fpTTF, fpPDF;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private

  public

  end;

  { TPDFDocumentHelper }

  TPDFDocumentHelper = class helper for TPDFDocument
  public
    function AddSystemFont(const AFontName: string; ABold: boolean;
      AItalic: boolean): integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  PDF: TPDFDocument;
  StdFtHelvetica, FreeSans, ComicSans, ArialItalic: integer;
  P: TPDFPage;
begin
  PDF := TPDFDocument.Create(nil);
  PDF.Infos.Producer := 'Test';
  PDF.Infos.CreationDate := Now;
  PDF.Options := [poPageOriginAtTop, {poNoEmbeddedFonts,} poSubsetFont,
    poCompressFonts, poCompressImages];
  PDF.DefaultOrientation := ppoPortrait;
  PDF.DefaultPaperType := ptA4;
  PDF.DefaultUnitOfMeasure := uomMillimeters;
  PDF.StartDocument;
  PDF.Sections.AddSection;
  PDF.Sections[0].AddPage(PDF.Pages.AddPage);
  gTTFontCache.ReadStandardFonts;

  //Eingebauter Font, kein Unicode, aber Umlaute:
  StdFtHelvetica := PDF.AddFont('Helvetica');
  //Embedded Font aus User-Pfad, Unicode:
  FreeSans := PDF.AddFont(Application.Location + 'fonts/FreeSans.ttf', 'FreeSans');
  //Embedded Fonts aus System, Unicode:
  ArialItalic := PDF.AddSystemFont('Arial', False, True);
  ComicSans := PDF.AddSystemFont('Comic Sans MS', False, False);

  P := PDF.Pages[0];
  P.SetFont(StdFtHelvetica, 14);
  P.WriteText(10, 10, ('FPC Demo: PDF öäü ÖÄÜ Test (Helvetica Builtin)'));
  P.SetFont(FreeSans, 14);
  P.WriteText(10, 20, ('FPC Demo: PDF öäü ÖÄÜ Test + Unicode: Ф (FreeSans Embedded)'));
  P.SetFont(ArialItalic, 14);
  P.WriteText(10, 30,
    ('FPC Demo: PDF öäü ÖÄÜ Test + Unicode: Ф (Arial Italic Embedded)'));
  P.SetFont(ComicSans, 14);
  P.WriteText(10, 40, ('FPC Demo: PDF öäü ÖÄÜ Test + Unicode: Ф (Comic Sans Embedded)'));
  PDF.SaveToFile(Application.Location + 'test.pdf');
  OpenDocument(Application.Location + 'test.pdf');
  PDF.Free;
end;

{ TPDFDocumentHelper }

function TPDFDocumentHelper.AddSystemFont(const AFontName: string;
  ABold: boolean; AItalic: boolean): integer;
var
  AFontFile, APSName: string;
  lNewFC, aBaseFont: TFPFontCacheItem;
begin
  aBaseFont := gTTFontCache.FindFont(aFontName);
  if not Assigned(aBaseFont) then
    raise Exception.Create('Basefont ' + AFontName + ' not found!');
  // find corresponding font style (bold and/or italic)
  lNewFC := gTTFontCache.Find(aBaseFont.FamilyName, aBold, aItalic);
  if not Assigned(lNewFC) then
    raise Exception.Create('Font Style not found!');
  APSName := lNewFC.PostScriptName;
  AFontFile := gTTFontCache.Find(APSName).FileName;
  Result := AddFont(AFontFile, APSName);
end;

end.
Ergibt hier:
test.pdf
(36.37 KiB) 61-mal heruntergeladen
Getestet auf Lazarus 2.3.0 (rev main-2_3-2366-g4fba69291d) FPC 3.2.2 x86_64-linux-gtk2

Benutzeravatar
Lincoln Six Echo
Beiträge: 138
Registriert: Di 26. Aug 2014, 16:42
OS, Lazarus, FPC: Win10, Debian
CPU-Target: I7/I9/Q9650/u.a.
Wohnort: Hamburg

Re: Umlaute und Sonderzeichen

Beitrag von Lincoln Six Echo »

Ja UTF8 ist aktiviert.

in fpPDF und auch in meiner Engine werden die Umlaute nur korrekt dargestellt wenn ich eine Fontdatei integriere.

Die Umlaute werden dann auch nur mit dieser Schriftart richtig dargestellt.

Ich denke das liegt nicht an den jeweiligen PDF-Engines sondern am PDF-Format.

Mit den dadurch größeren PDF-Dateien kann ich gut leben :-)

Wie kann denn eigentlich in einem PDF-Dokument ein Link auf eine Seite innerhalb des Dokuments gesetzt werden ? Dazu habe ich in fpPDF leider nichts gefunden...

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

Re: Umlaute und Sonderzeichen

Beitrag von theo »

Irgendwie weiss ich nie genau, wovon du sprichst.
In dem test.pdf oben sind 3 Fonts (Subset) integriert und es hat 36.37 KiB.
Ist das für dich schon "Grösser"?

Benutzeravatar
Lincoln Six Echo
Beiträge: 138
Registriert: Di 26. Aug 2014, 16:42
OS, Lazarus, FPC: Win10, Debian
CPU-Target: I7/I9/Q9650/u.a.
Wohnort: Hamburg

Re: Umlaute und Sonderzeichen

Beitrag von Lincoln Six Echo »

Naja, ohne die Fonts und nur mit Text ist so ein PDF < 1k.

Das Einfügen von JPEGs funktioniert bei mir zumindest nicht. Weder per Stream noch per LoadFromFile.

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

Re: Umlaute und Sonderzeichen

Beitrag von theo »

Lincoln Six Echo hat geschrieben:
Do 18. Aug 2022, 16:55
Naja, ohne die Fonts und nur mit Text ist so ein PDF < 1k.
Dann nimmst du halt nur die eingebauten Fonts. ist oben in der Demo auch drin. :roll:

Benutzeravatar
Lincoln Six Echo
Beiträge: 138
Registriert: Di 26. Aug 2014, 16:42
OS, Lazarus, FPC: Win10, Debian
CPU-Target: I7/I9/Q9650/u.a.
Wohnort: Hamburg

Re: Umlaute und Sonderzeichen

Beitrag von Lincoln Six Echo »

Die Grösse ist in diesen Bereichen völlig unerheblich.

Ich habe hier z.B. die komplette PDF-Reference von ADOBE, das sind 31 MB. Da sind nicht einmal viele Grafiken drin.

Mit den JPEGs funktioniert es doch: Bei AddJPEGStream() müssen Breite und Höhe des JPEGs angegeben werden, nicht die gewünschte Ausgabegröße, die wiederum muss bei DrawImage rein. ;-)

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

Re: Umlaute und Sonderzeichen

Beitrag von theo »

:?: :?: :?: :?: :?: :?: :?: :?: :?: :?:

Antworten