Anmelden

Zeichensatz

Standardmäßig kennt RM nur die Kodierung Windows 1252 (WinAnsiEncoding , westeurop. http://de.wikipedia.org/wiki/Latin1). Die zur Darstellung von Zeichen aus anderen Kodierungen (z.B. mitteleurop. cacute ć) erforderliche Strategie fehlt in der originalen Implementierung von Report Manager.

Als einfache Lösung werden verzichtbare Zeichen aus Latin1 durch häufig benötigte Zeichen Latin2 global (statisch für gesamte PDF-Datei) ersetzt.

  • zusätzlich benötigte Zeichen Latin2: ěšćč
  • verzichtbare Zeichen Latin1: ¿¯¬æ
  • Sonstige wünschenswerte Zeichen: „“

Latin2

Latin1

ć

E6,230,cacute

æ

E6,230

č

E8,ccaron

¿

BF,191

ě EC,ecaron ¬ AC,172
š B9,scaron ¯ AF,175

Hintergrund

Daten: Vßäöüáàćéèëúùíìóòý ÄÖÜÁÀÉÈÚÙÍÌÓÒÝ (Latin1 mit ć)

Ohne Maßnahmen werden die nicht in der Zielkodierung enthaltenen Unicode-Zeichen durch ? ersetzt, Esetzung erfolgt PDFCanvas.UnicodeToWin(). Ergebnis der ANSI-PDF-Datei (ANSI) ist:

0.00 0.00 0.00 RG
0.00 0.00 0.00 rg
BT
/F1 8 Tf
127.55 679.30 Td
(Vßäöüáà?éèëúùíìóòý ÄÖÜÁÀÉÈÚÙÍÌÓÒÝ) Tj
ET

Ändert man in PrintOutPDF.DrawObject() bzw. PDFCanvas.UnicodeToWin() die Kodierung auf 1250 bringt es garnichts, wird ć als ANSI æ ausgegeben. Latin1-Umlaute verschwinden.

0.00 0.00 0.00 RG
0.00 0.00 0.00 rg
BT
/F1 8 Tf
127.55 679.30 Td
(Vßäöüá?æé?ëú?í?ó?ý ÄÖÜÁ?É?Ú?Í?Ó?Ý) Tj
ET

Korrekt muss ć auf Latin1-Zeichen æ ersetzt werden. Die Rückersetzung wird durch Differenzes geregelt. es lauten (funktioniert auch im Reader mit korrekten Zeichenbreiten):

0.00 0.00 0.00 RG
0.00 0.00 0.00 rg
BT
/F1 8 Tf
127.55 679.30 Td
(Vßäöüáàæéèëúùíìóòý ÄÖÜÁÀÉÈÚÙÍÌÓÒÝ) Tj
ET

RM-Eingriff

Siehe Kompilierung. Suchen nach dem Tag "Win1250Encoding".

Insgesamt erfolgt der Eingriff folgendermaßen:

  1. Ersetzen der Nicht in 1252 enthaltenen Zeichen durch nichtbenötigte 1252-Zeichen in PDFCanvas.UnicodeToWin(). Möglicherweise müssen auch HTML-Entity erkannt werden (hängt vermutlich von ODBC-Schnittstelle und Linux-System ab). Wurde abe auf aktuellen Linux-Systemen nicht benötigt.
  2. Erstellung eines Encoding-Objektes mit /Differences in PDFFile.SetFontType()
  3. optional Einstellung der Zeichenbreiten PDFFile.CreateFont(). Vermutlich werden die Zeichenbreiten auch intern für dern Rendering verwendet (Berechnung der Umbrüche) und wären damit notwendig. Die Zeichenbreiten der Umlaute können fast ausnahmslos von den Basislauten übernimmen werden (c > ć).

Das Ersetzen und Zuweisen der Encoding-Objekte kann vermutlich je Textelement erfolgen, wodurch praktisch in einer PDF-Datei beliebige Kodierungen zusammengeführt werden können. Lediglich das Textelement ist an eine Kodierung gebunden. Der Eingriff dafür ist aber größer.

PDF-Standard

Der PDF-Standard sieht für die Problematik weitreichend Mittel vor. Grundlegend wird das PDF-Dokument um Kodierungsinformationen und Zeichenbreiteninformationen erweitert. Die Zeichen selbst sind bei Standard-Fonts bzw. Linked Fonts im Zielsystem bzw. im Reader enthalten.

Entsprechend der PDF-Standards ergeben sich folgende Aufgaben:

  • aus dem Unicodezeichen müssen die 1. Byte-Codes entsprechend Kodierung ermittelt werden, dazu muss für das jeweilige Textobjekt eine passende Kodierung ermittelt, oder gar eine eigene Kodierung erschaffen werden (da gemischte Darstellung von Zeichen aus verschiedenen europäischen Regionen theoretisch möglich ist)
  • es wird ein Encoding-Objekt mit Differences benötigt
  • im Textobjekt das entsprechende Encoding-Objekt zuweisen
  • im Font-Objekt können die Zeichenbreiten mitgeliefert werden, wenn Zeichenbreiten enthalten sind müssen vermutlich auch die gemappten Zeichen angepasst werden, da der Reader offenbar die Breiten vorrangig verwendet. Ob der komplette Zeichensatz erforderlich ist, oder einzelne differierende Zeichen werden können ist unklar. Die Übermittlung der Zeichenbreiten kann aber komplett entfallen.

http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_reference_1-7.pdf

Zeichensätze und Kodierungen

obj
< < /Type /Font
/BaseFont /Helvetica-Bold
/Subtype /Type1
/Encoding 21 0 R

/FirstChar 32 /LastChar 255 /Widths [278 278 ...]

>>
endobj
21 0 obj
< < /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [230 /cacute]
>>
endobj

Die Differences bewerkstelligen die Kodierung z.B. CP 1250 (mitteleuropäisch). Die werden berücksichtigt, allerdings war in der PDF-Anzeige die Zeichenbreite zu schmal (etwa ein Leerzeichen breit, durch anhängen eines zweiten Leerzeichens hinter cacute war die Ausgabe brauchbar) Ausgabe tuto1.php.

Linked Fonts

FontInfoGDI.GetCharWidth() liefert für Unicode-Zeichen Breite. Liefert bei mitteleurop. Sonderzeichen (cacute) falsche Breite (begründet) und für Leerzeichen 0. Verwendet aber SystemDrawing.

Embedded

Hierbei ist der Font komplett Bestandteil der PDF.

Erzeugung der .php und .z Datei basierend auf eine.ttf (System) und der Kodierung erfolgt mit makefont.php (fpdf). Die .z Datei wird direkt in die PDF eingebunden. Die .php enthält einige Metadaten, auch die Kodierung per Differences.

Mit dem erstellten Font klappt die Ausgabe problemlos.

MakeFont('c:\\Windows\\Fonts\\arial.ttf','cp1250');

http://localhost/nsoft/sys/fpdf/tutorial/makefont.php

einlesen arial.z erfolgt in rpinfoprovgdi.cs, Allerdings meldet Reader einen Fehler. Laut pdf Tutorial 7 funktioniert es aber grundsätzlich (pdfs vergleichen)

   
Top

Wir arbeiten mit Software von http://www.campus21.de.

Verantwortlich für angezeigte Daten ist der Webdomain-Eigentümer laut Impressum.

Suche