Umlaute und Sonderzeichen
- 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
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.
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.
- af0815
- Lazarusforum e. V.
- Beiträge: 6209
- 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
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
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).
- 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
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.
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.
Re: Umlaute und Sonderzeichen
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.
https://gitlab.com/freepascal.org/fpc/s ... sues/39554
Mit externen FontDateien müsste es sowieso funktionieren.
- 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
Jain, PDFs können auch Binäre Daten/Objekte usw enthalten. Und Z.B. Embedded Fonts.PDF ist ja auch nur eine Beschreibungssprach
Re: Umlaute und Sonderzeichen
Was genau geht denn nicht?
Wie wär's mal mit einem Code Beispiel?
Ich sehe soweit keine Probleme mit der Version vom "Trunk".
Hast du {$codepage UTF8} in der Unit gesetzt (bei Nutzung in der Lazarus Umgebung).
Wie wär's mal mit einem Code Beispiel?
Ich sehe soweit keine Probleme mit der Version vom "Trunk".
Hast du {$codepage UTF8} in der Unit gesetzt (bei Nutzung in der Lazarus Umgebung).
- 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
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:
Leider werden durch die Fonts die PDF-Dateien relativ groß.
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;
Re: Umlaute und Sonderzeichen
Du hast die Frage nicht beantwortet, die ich dir oben gestellte hatte. (Ganz am Ende, unter dem Link).
UTF8Decode brauchst du mMn nicht.
UTF8Decode brauchst du mMn nicht.
Re: Umlaute und Sonderzeichen
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.
Ergibt hier:
Getestet auf Lazarus 2.3.0 (rev main-2_3-2366-g4fba69291d) FPC 3.2.2 x86_64-linux-gtk2
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.
- 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
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...
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...
Re: Umlaute und Sonderzeichen
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"?
In dem test.pdf oben sind 3 Fonts (Subset) integriert und es hat 36.37 KiB.
Ist das für dich schon "Grösser"?
- 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
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.
Das Einfügen von JPEGs funktioniert bei mir zumindest nicht. Weder per Stream noch per LoadFromFile.
Re: Umlaute und Sonderzeichen
Dann nimmst du halt nur die eingebauten Fonts. ist oben in der Demo auch drin.Lincoln Six Echo hat geschrieben: ↑Do 18. Aug 2022, 16:55Naja, ohne die Fonts und nur mit Text ist so ein PDF < 1k.
- 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
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.
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.