Compart - Dokumenten und Output-Management

DocBridge Mill, AFPDS und Encoding Lists

DocBridge Mill, AFPDS und "Encoding Lists"

Experten-Tipp für DocBridge Mill AFPDS-Dokumente die von Dritt-Software erstellt wurden

 

Werden DocBridge Mill AFPDS-Dokumente, die von Dritt-Software erstellt wurden, konvertiert, kommt es gelegentlich vor, dass nach Text im Dokument nicht gesucht werden kann oder dass spezielle Zeichen nicht in die gewünschten Zeichen im Zieldokument konvertiert werden können.

Die Ursache dafür ist, dass die Dritt-Software keine Standard IBM GCGIDs benutzte. Um dieses Verhalten zu verstehen, ist etwas Grundlagenwissen über die Präsentation von AFP-Text hilfreich.

Innerhalb von AFP werden zur Darstellung von Zeichen benötigte Fonts durch eine Code-Page sowie einen Font-Zeichensatz definiert:

AFP-Code-Pages sind Tabellen, die Graphic Character Global IDentifiers (GCGID) in sogenannte Code-Points oder Hexadezimal-Werte übersetzen
AFP-Font-Zeichensätze enthalten die Beschreibung und metrische Information des gesamten Fonts. Jedes Zeichen im Zeichensatz ist definiert durch eine eindeutige GCGID.

Bei der Formatierung und Darstellung von Text wird zu jedem Code-Point mittels der Code-Page die GCGID zugeordnet. Anschließend wird die Glyph-Charakterstik im entsprechenden Zeichensatz gelesen und der Text präsentiert.

DocBridge Mill konvertiert intern alle Text-Items in Unicode, deshalb müssen die Unicode-Werte für alle Code-Points, die im Text vorhanden sind, bekannt sein. Falls die benutzen GCGID-Namen nicht mit den in den IBM Expanded Core Fonts definierten GCGID-Namen übereinstimmen, benötigt DocBridge Mill die entsprechenden Informationen. In diesem Fall muss von den Anwendern im DocBridge Mill AFP-Filter-Profil die GCGID-Unicode Encoding List definiert werden.

Falls die IBM Expanded Core Fonts zum Einsatz kommen, ist kein weiteres GCGID-Unicode-Mapping erforderlich.

Um eine eigene Encoding List zu erstellen, ist folgendermaßen vorzugehen:

1. Erzeugen eines Dumps der AFPDS Datei – am einfachsten mit dem Compart AFP Utility afpdump

afpdump -v <filename>  >>  <dumpoutput.txt>

2. Suchen des Text-Items im AFPDS Dump Output

0xDB:    TRN Transparent Data [7]
Text:    "25.03 A"
(hex:)    F2 F5 4B F0 F3 40 41

3. Notieren des Hex-Wertes des Zeichens, welches nicht wie gewünscht präsentiert wurde

4. Bestimmen der aktiven Font-Id, indem nach dem vorangestellten Text "Set Coded Font Local" gesucht wird, z.B.: 41

0xF1:    SCFL Set Coded Font Local [1]
CFLid:    0x02 (2)

5. Bestimmen der Code-Page und des Zeichensatznamens, indem nach dem vorangestellten "Map Coded Font" und innerhalb dieses Abschnitts nach der entsprechenden "Resource Local ID" gesucht wird, z.B.:

T02:    Fully Qualified Name [10]
FQNType:    0x85 (Code Page Name Reference)
FQNFmt:    0x00 (Character string)
FQName:    "T1001000"
T02: Fully Qualified Name [10]
FQNType:    0x86 (Font Character Set Name Reference)
FQNFmt:    0x00 (Character string)
FQName:    "C0040TPN"
T24:    Resource Local ID [2]
ResType:    0x05 (Coded Font)
ResLID:    0x02 (2)

6. Suchen von "Code Page" im AFPDS Dump Output: Falls die Code-Page im AFP Dump Output nicht gefunden werden kann, muss die externe Ressource-Datei mit gleichem Namen gefunden und gedumpt werden, z.B.:

0xD3A8CE:    BR Begin Resource [20] (Offset 279706)
"T1001000"
(hex:)    E3 F1 F0 F0 F1 F0 F0 F0
Reserved:    00 00
T21:    Resource Object Type (R) [8]
ObjType:    0x41 (Code Page object (retired))
ConData:    00 00 00 00 00 00 00
{
0xD3A887:    BCP Begin Code Page [0] (Offset 279735)

7. Suchen des benötigten "Hex Value" im "CPI Code Page Index", z.B.:

065 "CPT00065" CodePoint: 0x41 (65)

8. Notieren des benötigten GCGID

9. Suchen von "Character Set" im AFPDS Dump Output: Falls der Zeichensatz im AFP Dump Output nicht gefunden werden kann, muss die externe Ressource-Datei mit gleichem Namen gefunden und gedumpt werden

0xD3A8CE: BR Begin Resource [20] (Offset 364352)
"C0TMPOST"
(hex:) C3 F0 E3 D4 D7 D6 E2 E3
Reserved: 00 00
T21: Resource Object Type (R) [8]
ObjType:    0x40 (Font Character Set object (retired))
ConData:    00 00 00 00 00 00 00
{
0xD3A889: BFN Begin Font [0] (Offset 364381)

10. Suchen des GCGID im Zeichensatz, z.B.:

GCGID: CHAR0065 14 17 842

......XXX......
......XXX......
.....XX.XX.....
.....XX.XX.....
.....XX.XX.....
....XX...XX....
....XX...XX....
...XXX...XXX...
...XX.....XX...
...XX.....XX...
..XXXXXXXXXXX..
..XXXXXXXXXXX..
..XX.......XX..
.XX.........XX.
.XX.........XX.
.XX.........XX.
XX...........XX
XX...........XX

11. Bestimmen des Unicode-Wertes für dieses Zeichen: Falls der Zeichensatz auf ASCII-Kodierung basiert, ist der Hex-Wert normalerweise gleich dem Unicode-Wert

"CPT00065" CodePoint: 0x41 = UNICODE 0041 = "A"

12. Jetzt kann die Kodierung der Code-Page sowie des Zeichensatzs im Abschnitt <encodinglist> in der Datei mffafp.pro definiert werden

"encoding name" = Name der Code Page
"devname" = Character Name in der Code Page
"unc" = Unicode-Wert des Zeichens

<encoding name="T1001000">
<entry devname="CPT00000" unc="0000"/>
<entry devname="CPT00001" unc="0001"/>
<entry devname="CPT00002" unc="0002"/>
<entry devname="CPT00003" unc="0003"/>
<entry devname="CPT00004" unc="0004"/>
...
<entry devname="CHAR0065" unc="0041"/>
<entry devname="CHAR0066" unc="0042"/>
<entry devname="CHAR0067" unc="0043"/>
<entry devname="CHAR0068" unc="0044"/>
</encoding>

Hinweise:

  • Diese Schritte müssen für alle gefundenen Code-Pages wiederholt werden
  • Nur die Zeichen, die im Zeichensatz gefunden wurden, müssen kodiert werden
  • Die Datei kann mehrere Zeichensätze enthalten, die die gleichen Zeichen-Namen verwenden; einige können mehr Zeichen als andere enthalten. Um alle Unicode-GCGID-Zuordnungen bestimmen zu können, müssen alle Zeichensätze überprüft werden