Ten pdf - to nie jest trywialny plik.
Z jednej strony - to nie jest język. Ale z drugiej, to nie jest tylko ciąg bajtów (jak np. w bitmapie). Jest tam pewna logika, którą trzeba "obliczyć".
W PostScripcie są tzw słowniki. To jest tak jakbyś miał przestrzeń nazw.
Słowa zdefiniowane w słowniku, są widziane tylko w nim.
Dla zobrazowania wkleję kawałek (z nagłówka) kroju t1 (% rozpoczyna komentarz)
/FontInfo %deklaracja zmiennej
12 dict begin %12 elementów -> tworzy słownik -> begin ->otwiera słownik
/ItalicAngle -15.0 def %zmienna ItalicAngle jest zdefiniowana na -15
/UnderlinePosition -118 def %kolejne zmienne sa dodawane do słownika
...
...
def %ten def zamyka ten słownik i definiuje zmienną FontInfo
Od tej chwili masz słownik (przestrzeń nazw), która nazywa się FontInfo. I w niej masz zmienne (ItalicAngle, itd.).
W pliku pdf masz obiekty, które są słownikami (mogą być jeszcze tablicami), ale załóżmy są same słowniki.
Strona to jest słownik. W nim jest wpis /Resource - to jest kolejny słownik. W nim masz np. trzy kroje /F0, /F1, /F2.
I masz gdzie indziej w pliku słownik /F1, a w nim masz zdefiniowany ten krój. Załóżmy, że to Arial.
I teraz masz drugą stronę. I tam masz też /Resource (każda strona ma swoje "zasoby").
I w tym /Resource też masz /F1, F2, itd. Ale ten F1 może już być Times. Rozumiesz?
I teraz chcesz to połączyć w jedną stronę. Co musisz zrobić? Połączyć słowniki, żeby powstał jeden /Resource dla nowej strony. Ale tu kicha - bo masz dwa /F1, które znaczą co innego.
Musisz to rozebrać na atomy, dodać unikalne identyfikatory dla każdej strony, żeby po połączeniu to się nie pomieszało.
To w kwestii łączenia stron (co jest właśnie meritum impozycji).
Teraz jak się to połączy, to chciałoby się zobaczyć co wyszło.
Więc lecisz po kolei to co jest w słowniku /Content. Tam są wpisy w stylu:
10 20 moveto
100 200 lineto
stroke
(to znaczy narysuj linię od punktu 10 20 do punktu 100 200)
i trafiasz np. na /GS 0
co oznacza otwórz "stan graficzny numer 0".
Zaglądasz do tego GS0, tam jest /F0
Zaglądasz do F0 - tam jest np. wpis /CIDFontType0C co oznacza, że dalej polecą binarne dane opisujące krój typu CID. I dalej masz (test) tj.
Nawiasy - to tak dla zmyłki :-) - oznaczają w PostScripcie to, co w normalnych językach cudzysłowy :-).
A tj - to operator wyświetlania tekstu
Czyli masz do wyświetlenia napis "test" krojem, który jest zakodowany binarnie po tym /CIDFontType0C.
Żeby to wyświetlić, musisz odkodować ten ciąg bajtów i zamienić go w jakiś format zrozumiały dla platformy, na której działasz (lub po prostu na ciąg odcinków i krzywych beziera).
Problem z CID key fonts polega głównie na zagmatwanym sposobie przekodowywania glyphów (glyph - to wektorowy ciąg odcinków i krzywych beziera opisujący jeden znak lub fragment znaku. Np. litera ż może się składac z dwóch glyphów). Musisz odkodować, które glyphy są Ci potrzebne i zbudować znak, który potem wyświetlisz. Nie ma procedur systemowych, które wprost ten ciąg binarny (po słowne /CIDFontType0C) Ci wyświetlą.
Ja napisałem sobie interpreter, który może pracować w dwóch trybach.
W trybie "normalnym" wszystko się dzieje w tle i użytkownik widzi efekt.
Ale możesz przejść (jak w debuggerze) do pracy krokowej.
Wtedy masz na ekranie stos i te wszystkie słowniki. I możesz krokowo to wykonywać. Widzisz jak w kolejnych krokach ten plik pdf jest wciągany i rozbierany na atomy. No i dochodzisz do tego miejsca z krojem i - stop :-). Dalej nie pójdziemy, musisz rozebrać ten binarny ciąg :-).
To tak w skrócie :-).