České vysoké učení technické v Praze Fakulta elektrotechnická
Bakalářská práce
Extrakce textu z PDF se správnou diakritikou Radovan Mikš
Vedoucí práce: Ing. Jan Koutník Studijní program: Elektrotechnika a informatika – bakalářský Obor: Informatika a výpočetní technika červenec 2007
-2-
Poděkování Chtěl bych poděkovat především svému vedoucímu práce, Ing. Janu Koutníkovi, za trpělivost a odborné rady. Díky patří také týmu www.pdfbox.org, z jejichž práce jsem vycházel. -3-
-4-
Prohlášení Prohlašuji, že jsem svou bakalářskou práci vypracoval samostatně a použil jsem pouze podklady uvedené v přiloženém seznamu. Nemám závažný důvod proti užití tohoto školního díla ve smyslu §60 Zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon).
V Ostravě dne 24. 7. 2007
……………………………………………
-5-
-6-
Abstrakt Výsledkem této bakalářské práce je použitelný konvertor v jazyce Java, který je schopen provádět extrakci textu z PDF dokumentů včetně znaků s českou diakritikou, a to s velkou úspěšností. Převod probíhá nezávisle na softwaru, jimž byl zdrojový PDF dokument vytvořen. Konvertor byl zabudován do archívu absolventských prací ČVUT.
Abstract Thanks to this bachelor thesis, a simple convertor in Java capable of extracting plain text from PDF documents with correct Czech diacritic marks has been developed. The final result is independent on software used for the PDF document creation process. The convertor has become a part of CTU Theses Repository System.
-7-
-8-
Obsah Seznam tabulek
………………………………………………………….... 11
1
Úvod …………………………………………………………………… 13
2
Specifikace cílů
3
Analýza a návrh řešení
…………………………………………………… 15 …………………………………………… 17
3.1
Volba implementačního prostředí
…………………………… 17
3.2
Dostupné konvertory z PDF …………………………………… 17 3.2.1 Extrakce textu pomocí Xpdf (pdftotext) 3.2.1.1 Parametry
…………………………………… 18
3.2.1.2 Různé varianty konverze 3.2.2 Extrakce textu pomocí PDFBox 3.2.2.1 Parametry
…………… 17
…………………… 20 …………………… 21
…………………………………… 22
3.2.2.2 Různé varianty konverze
…………………… 22
3.2.3 Zhodnocení výhod a nevýhod obou konvertorů 3.3
Test vlivu tvůrce PDF na výsledek konverze
3.4
Zpracování výstupu do konečné podoby
…............… 25
…………………… 27
3.4.1 Spojování písmen s jejich diakritikou
…………… 27
3.4.2 Interpretace ostatních speciálních znaků
…………… 29
3.4.3 Formátování a HTML elementy 4
........ 24
Realizace
…………………… 33
……...........……………………………………………… 35
4.1
Implementace navrženého algoritmu …………………………… 35
4.2
Připojení funkcí konvertoru PDFBox
…………………… 36
5
Testování
6
Závěr ……………...........……………………………………………… 39
7
……...........……………………………………………… 37
6.1
Zhodnocení splnění cílů práce
…………………………… 39
6.2
Další možné směry pokračování
…………………………… 40
Seznam literatury
…………………………………………………… 41
-9-
A
Znaková sada ISO-8859-2 …………………………………………… 43
B
Seznam použitých pojmů a zkratek
C
Obsah přiloženého CD
…………………………… 45
…………………………………………… 46
- 10 -
Seznam tabulek 3.1
Výsledky konvertoru pdftotext dle užitých parametrů ...................... 20
3.2
Výsledky konvertoru PDFBox dle užitých parametrů ...................... 23
3.3
Konverze PDF dokumentů různých tvůrců – 1. část
……….......... 25
3.4
Konverze PDF dokumentů různých tvůrců – 2. část
……….......... 26
3.5
Číselné kódy diakritických znaků ……………………………….......... 28
3.6
Výstupní kódy pro písmena s diakritikou ……………………….......... 28
3.7
Alternativní přímé kódy českých písmen ……………………….......... 29
3.8
Reprezentace písmen řecké abecedy
3.9
Reprezentace matematických operátorů a symbolů
3.10
Reprezentace ostatních symbolů
3.11
Překlad HTML znaků
5.1
Výsledky závěrečného testování hotového konvertoru …………….. 39
A.1
Základní sada ASCII (kódy 0 až 127)
A.2
Znaková sada ISO-8859-2 (kódy 128 až 255)
……………………….......... 30 ……….......... 31
……………………………….......... 32
……………………………………….......... 33
- 11 -
…………………………….. 45 …………..……..….. 46
- 12 -
1
Úvod V roce 1993 byl firmou Adobe vyvinut formát PDF (zkratka anglického názvu
Portable Document Format – Formát pro přenositelné dokumenty) pro ukládání dokumentů nezávisle na softwaru a hardwaru, na kterém byly vytvořeny. PDF dokument může obsahovat nejen text, ale i obrázky, přičemž je zajištěno, že výsledný vzhled bude na všech zařízeních stejný. (definice a data převzaty z [3]).
Problém s dokumentem ve formátu PDF však nastává ve chvíli, kdy je potřeba zobrazit jeho psaný obsah v textovém režimu, tedy přes znakovou sadu ASCII, neboť jednotlivá písmena a speciální znaky si PDF formát kóduje odlišným způsobem. S úskalím vytažení textu z PDF dokumentů se snaží vypořádat právě tato práce.
- 13 -
- 14 -
2
Specifikace cílů
Výsledkem této práce by měl být konvertor, který vytáhne český text z jakéhokoliv PDF dokumentu, přičemž takto získaný text zůstane nepoškozený, čitelný a zobrazitelný se správnou českou diakritikou. Primární cílovou platformou je server dip.felk.cvut.cz, na němž se nachází archív bakalářských a diplomových prací ČVUT a pro jehož potřeby je konvertor vyvíjen. Texty budou kódovány standardem ISO-8859-2 (Latin2). Přesné rozložení znaků tohoto kódování se nachází v příloze.
Postup při řešení daného problému mi byl nastíněn vedoucím bakalářské práce následovně: •
Prostudování bakalářské práce [1], ve které se autor již problematikou extrakce českého textu z PDF formátu zabýval, ale nedospěl k optimálnímu řešení.
•
Seznámení se s existujícími konvertory z PDF formátu, které si však nedokáží poradit s českou diakritikou.
•
Pokusit se zjistit, zda je možné a případně do jaké míry lze výše zmíněné konvertory z PDF formátu využít při řešení problému extrakce textu s českou diakritikou.
•
Navržení konvertoru, který úspěšně provede extrakci českého textu z PDF dokumentu v požadované kvalitě.
•
Zjistit, zda má na úspěšnost konverze vliv software použitý při vytváření konvertovaného PDF dokumentu
•
Odzkoušení navrženého konvertoru na PDF dokumentech z archívu bakalářských a diplomových prací [2].
•
Zabudování konvertoru do výše zmíněného archívu.
- 15 -
- 16 -
3
Analýza a návrh řešení Kapitola je rozdělena na několik podkapitol, které by měly čtenáři přesně přiblížit, jak
jsem postupoval krok za krokem při řešení předloženého problému a proč jsem se ve sporných situacích rozhodl pro zvolenou možnost
3.1 Volba implementačního prostředí Programovací jazyk byl určen již v zadání, tedy Java, což mělo své pochopitelné důvody. Výsledný produkt měl být jednak nezávislý na operačním systému, jednak se má stát součástí funkčního balíku Archívu bakalářských a diplomových prací ČVUT, jehož části jsou již v jazyku Java naprogramovány. Jako vývojové prostředí jsem zvolil program Eclipse 3.2, neboť s ním mám největší zkušenosti a zcela mi vyhovuje.
3.2 Dostupné konvertory z PDF Na Internetu je ke stažení hned několik funkčních projektů, které umí pracovat s formátem PDF a umožňují mimojiné i extrakci textového obsahu. Pro účely této práce jsem se zabýval dvěma – balíčkem Xpdf 3.01, jmenovitě funkcí pdftotext a komplexnější knihovnou PDFBox 0.7.3, konkrétně spustitelnou funkcí ExtractText. Účelem obou těchto funkcí je vytažení textu ze zdrojového PDF dokumentu a jeho převedení do psané podoby reprezentované sadou znaků ASCII.
3.2.1 Extrakce textu pomocí Xpdf (pdftotext) Co se týče balíčku funkcí Xpdf 3.01, je nutné na úvod poznamenat, že jeho instalace a následné používání nepatří k nejjednodušším, což následně značně komplikovalo i jeho další využívání jako součásti mého projektu. Rozšířené volby se k balíčku přidávají formou externích souborů, které jsou namapovány na klíčová slova prostřednictvím konfiguračního souboru, který si musí uživatel sám vytvořit.
Aby bylo vůbec možné extrakci textu z PDF pomocí funkce pdftotext zrealizovat do požadovaného kódování, musí být v kořenovém adresáři, kde byl balíček Xpdf nainstalován,
- 17 -
vytvořen konfigurační soubor xpdfrc (bez přípony), uvnitř kterého jsou namapována klíčová slova na konkrétní znakové sady. Tyto znakové sady jsou konkrétní soubory s příponou unicodeMap.
Na serveru dip.felk.cvut.cz se kóduje čeština standardem ISO-8859-2 (Latin2), což v praxi znamenalo sehnat si soubor Latin2.unicodeMap a namapovat ho v konfiguračním souboru xpdfrc přidáním následující řádky:
unicodeMap Latin2 Latin2.unicodeMap
Jinými slovy, našemu souboru obsahujícímu sadu znaků Latin2 bylo přiděleno identifikační jméno „Latin2“, které se používá jako klíčové slovo při nastavení výstupního kódování při extrakce textu skrze program pdftotext. Korektní spuštění pak mohlo vypadat například takto:
pdftotext –enc Latin2 (zdrojovýsoubor.pdf) (výstupnísoubor.txt)
Výsledek této konverze je však zcela nepoužitelný, neboť znaky s českou diakritikou zobrazuje nejednotným způsobem, některé dokonce úplně vynechá. Příkladem posledního spuštění jsem se však dostal k parametrům, které lze použít.
3.2.1.1
Parametry
Zde je výčet a upřesňující popis parametrů, které mají vliv na konverzi jako takovou a po jejichž použití se výstup ve vztahu k formátování či české diakritice lišil:
-layout
konvertor se snaží zachovat původní formátování PDF dokumentu, takže zachovává volné řádky i odsazení od levého okraje. České znaky jsou rozděleny na dva samostatné znaky, tedy samotný diakritický znak (čárka, kroužek, háček, přehláska apod.) a základní písmenko anglické abecedy (dlouhé „í“ se skládá z čárky a písmene „i“). Jednotlivé diakritické znaky se snaží přímo v textovém výstupu umisťovat nad příslušná
- 18 -
písmenka (o jeden řádek výše). Někdy je však znak na řádku místo písmenka a příslušné písmenko až o řádek níže. Ve výjimečných případech se konvertor „netrefí“ a diakritické znaménko není přesně nad souvisejícím písmenem, ale o jednu pozici posunutý doprava či doleva. -raw
přesný opak parametru –layout (tyto dva parametry se navzájem vylučují). Konvertor se zaměřuje přímo na zobrazitelné znaky zdrojového PDF dokumentu a zcela vypouští mezery, volné řádky i formátování. Písmena s diakritikou opět rozkládá na dva znaky, ale tentokráte diakritický znak zapíše výhradně na stejný řádek jako přiřazené základní písmeno, a to buď před nebo za něj. Pravidlo o umístění diakritického znaku je jednotné na stejném řádku, není však jednotné v celém dokumentu (v jednom dokumentu se tedy mohou vyskytovat jak řádky s diakritickými
znaménky
před
písmenem,
tak
řádky
s diakritickými znaménky za písmenem). -htmlmeta
vygeneruje výstupní soubor jako HTML dokument, přičemž přidá i hlavičku a metadata. Znaky české diakritiky však řeší stejně jako parametr -raw.
-enc <Map>
již známý parametr, který pro kódování výstupu používá zvolenou sadu znaků. Ta musí být správně nakonfigurována (viz výše).
Nejlepších
výsledků
dosahoval
konvertor
právě
s použitím znakové sady ISO-8859-2 (Latin2).
Bohužel, ani jedna konverze s parametrem či kombinací parametrů nedokázala převést text s českou diakritikou na čitelný český text. Rozhodl jsem se tedy najít alespoň výsledek, který by jednotným způsobem nakládal s písmeny české abecedy tak, aby bylo možné výstup konvertoru pdftotext upravit jednoznačným algoritmem do požadované podoby.
- 19 -
3.2.1.2
Různé varianty konverze
Na stejném PDF dokumentu jsem vyzkoušel všechny platné kombinace parametrů konvertoru pdftotext s cílem najít takový výstup, který by šel případně jednoznačným algoritmem zpracovat na požadovaný výsledek, tedy čitelný text s českou diakritikou. Při těchto pokusech jsem již definitivně vyloučil parametr –layout, neboť formátování výstupu není prioritou a snaha tohoto módu o přesné poziční umístění diakritického znaménka nad písmenko není většinou úspěšná.
Tabulka 3.1: Výsledky konvertoru pdftotext dle užitých parametrů Použité parametry žádné
-enc Latin2
-raw
-htmlmeta
-enc Latin2 -raw
Nedostatky místo písmen s diakritikou zůstává pouze jejich diakritický znak, takže není poznat, které písmeno v původním textu bylo, některá písmena s diakritikou jsou vypuštěna úplně nejsou vypuštěna žádná písmena, nicméně písmena s diakritikou jsou často oddělena nadbytečnými mezerami, nebo úplně vypuštěna výstupní text už vypadá opticky dobře, písmenka s diakritikou jsou rozdělena na dva znaky (diakritický znak + písmeno) a stojí v textu těsně vedle sebe, nadbytečné mezery se téměř neobjevují, bohužel však existují výjimky u písmenek s háčky (hlavně „ž“, „č“ a „ř“), u kterých diakritický znak oproti původnímu textu zmizí a interpretují se pouze bez diakritiky (tedy „z“, „c“ a „r“) přistupovat k výstupu jako k HTML formátu zde nevedlo k žádným výraznějším zlepšením, dokonce ve většině případů se, kromě HTML hlavičky, nic nestalo s ostatním textem a vše ovlivnily pouze ostatní parametry skombinovat tyto dva parametry pomohlo, naprosto všechny znaky bez výjimek jsou reprezentovány dvojicí znaků diakritický znak + písmeno, pouze pořadí není jednotné – někdy je nejprve diakritika, pak písmeno, jindy naopak. Zásadním poznatkem však je fakt, že v rámci jednoho řádku je toto pravidlo jednotné – tedy nikdy není v textu řádek, kde by byly diakritické znaky jak před, tak za písmenem. Menší chybou jsou nadbytečné mezery vyskytující se nepravidelně kolem velkých písmen
- 20 -
Použitelné? NE
NE
NE
NE
ANO
Podařilo se mi tedy najít způsob, jak s využitím pdftotext vytáhnout z PDF dokumentu text v takové formě, aby jej bylo možné jednoznačným algoritmem předělat na čitelný a nepoškozený český text, i když nepravidelně vkládané mezery kolem velkých písmen s diakritikou by byly, například při vyhledávání konkrétního slova, zásadní překážkou. Tak jak tak zde byla ještě alternativa v podobě konkurenčního projektu PDFBox.
3.2.2 Extrakce textu pomocí PDFBox Projekt PDFBox 0.7.3 byl oproti Xpdf mnohem přátelštější, co se týče instalace a používání. Celý projekt je jeden .JAR balík, který v kořenovém adresáři své vnitřní struktury nabízí několik spustitelných Java tříd, včetně třídy „ExtractText“, která slouží k převedení psaného obsahu PDF dokumentu na prostý text. K funkcím se dalo v operačním systému Windows přistupovat rovněž skrze .EXE soubory, což však vyžadovalo přítomnost několika nemalých DLL knihoven ve stejném adresáři. Jednotlivá kódování znaků byla již součástí projektu, takže nebylo nutné přidávat žádné externí soubory.
Vybral jsem si první způsob použití, který je přece jenom univerzálnější a hlavně nezávislý na operačním systému. Příkaz k provedení extrakce textu z PDF dokumentu tedy vypadal takto:
java org.pdfbox.ExtractText
Co se časové náročnosti týče, zpracovává PDFBox stejný PDF dokument o poznání déle než pdftotext, ale stále jsou to řádově pouze jednotky sekund, což je přijatelné. Podobně jako program pdftotext, i tento konvertor nabízel hned několik parametrů, které mohly ovlivnit výstup, takže je bylo nutné prozkoumat.
- 21 -
3.2.2.1
Parametry
Opět jsou zde uvedeny pouze parametry, které alespoň nějakým způsobem mění výstup, konkrétně způsob zobrazování českých písmen s diakritikou:
-encoding ISO-8859-2
konvertor
se
snaží
kódovat
výstupní
text
s použitím znakové sady ISO-8859-2 (Latin2), kterou potřebujeme. -html
konvertor provádí konverzi do HTML formátu, ignoruje výstupní kódování a neznámé znaky reprezentuje univerzálním kódem (unicode), což je velmi výhodné, neboť si poradí s jakýmkoliv znakem vyskytujícím se ve zdrojovém PDF dokumentu
nezávisle
na
jeho
původním
kódování. Navíc částečně zachovává i formát původního dokumentu vkládáním odsazovacích znaků a používáním HTML tagů.
3.2.1.2
Různé varianty konverze
Kombinovat tyto dva parametry není možné, neboť parametr –html, jak již bylo řečeno, reprezentuje nezobrazitelné znaky číselným kódem. Pro úplnost jsem však i tentokrát použití všech parametrů podrobněji zdokumentoval a výsledky zapsal do přehledné tabulky:
- 22 -
Tabulka 3.2: Výsledky konvertoru PDFBox dle užitých parametrů Použité parametry
žádné
-encoding ISO-8859-2
-html
Nedostatky české znaky s diakritikou jsou rozděleny na dva znaky stojící v textu těsně vedle sebe, místo diakritických znaků kroužek a háček je však znak otazníku („?“), což znemožňuje zpětnou identifikaci původní diakritiky, ta samá chyba se vyskytuje i u jiných speciálních symbolů, které nejsou jednoduše převeditelné do textového režimu, malé písmeno dlouhé „í“ je rozloženo na čárku a nerozpoznatelný znak (pravděpodobně „i“ bez tečky), obrázky a grafika jsou zcela vypuštěny a nezanechávají ve výstupu žádné stopy výstup se o něco vylepší, diakritický znak háčku již je ve výstupním textu rozpoznatelný, nicméně kroužek a speciální symboly jsou stále nečitelné, respektive jsou nahrazeny přímo znakem otazníku („?“), tudíž zpětně neidentifikovatelné, rovněž písmenná část při reprezentaci dlouhého „í“ je stále nerozpoznatelná a nahrazena otazníkem, obrázky a grafika nezanechávají na výstupu žádné stopy výstupnímu textu je dána forma HTML dokumentu, je tedy přidána hlavička a formátovací HTML elementy, důležité však je, že všechny symboly a diakritické znaky jsou reprezentovány unikátním číselným kódem (zapsání znaku číselným kódem má specifickou HTML syntaxi { - přičemž místo 123 je konkrétní číselný kód), což je způsob zápisu, který se dá lehce dodatečně zpracovat na požadovaný výstup. Rovněž některé speciální symboly, které jsou jinak součástí klíčových slov HTML jazyka, jsou nahrazeny jejich příslušným HTML zápisem, pokud se v původním textu vyskytují (například znak „&“ je nahrazen shlukem „&“ apod.) Drobnější nevýhodou užití tohoto parametru je snaha o zpracování grafiky – to má ve výstupním textu za následek nadbytečné řetězce znaků v místech, kde jsou v původním PDF dokumentu obrázky. Tyto řetězce jsou však délkou zanedbatelné a čitelnosti okolního textu nijak nebrání.
Také konvertor PDFBox tedy nabízí jediný perspektivní způsob konverze.
- 23 -
Použitelné?
NE
NE
ANO
3.2.3 Zhodnocení výhod a nevýhod obou konvertorů Na tomto místě je třeba se rozhodnout, zda budu zpracovávat výstup programu pdftotext či PDFBox. Oba výstupy lze předělat jednoznačným algoritmem na český text a o volbě tedy musí rozhodnout další aspekty:
Xpdf 3.01 (pdftotext)
PDFBox 0.7.3 (ExtractText)
Velmi rychlá konverze
Lepší rozpoznávání textů z obrázků a
lehce zabudovatelný do mého vlastního projektu
ofocených částí původního PDF
dokumentu
Namísto obrázků a grafiky
Zdrojový kód v C++, takže vložení
z původního PDF dokumentu
částí kódu přímo do mého projektu
zanechává ve výstupním textu nesmyslné řetězce znaků
není možné
Zdrojový kód v jazyku Java, tedy
Nepravidelné vkládání nadbytečných
Nedokáže načíst některá písmena s diakritikou z nestandardně úzkých
mezer kolem velkých písmen
fontů
Nedokáže rozpoznat některé speciální
symboly
Dokáže do jisté míry zachovat původní formátování dokumentu, což
Projekt je svou velikostí malý (řádově
vede k přehlednějšímu výstupu
stovky kilobajtů)
Knihovna je vcelku rozsáhlá, co se týče velikosti (řádově jednotky megabajtů)
Po konzultaci s vedoucím práce jsem se rozhodl rozpracovávat dále výstup vytvořený konvertorem PDFBox 0.7.3, neboť možnost zabudovat tuto knihovnu snadno do mého vznikajícího projektu je velkým přínosem a jedním z nepřímých požadavků na výsledek mé práce. Nadále jsem se již tedy zabýval pouze zpracováváním výstupu PDFBox, potažmo přidružené funkce ExtractText s parametrem -html.
- 24 -
3.3 Test vlivu tvůrce PDF na výsledek konverze Můj předchůdce zabývající se konverzí českého textu z PDF dokumentů (viz [1]) narazil na problémy spojené se softwarem, pomocí kterého byl zpracovávaný PDF dokument vytvořen. Jedním ze zadání mojí práce tedy bylo také prozkoumat, do jaké míry závisí úspěšnost konverze českého textu na tomto faktoru. Většina softwaru na tvorbu PDF dokumentů jsou však komerční produkty, ke kterým nemám přístup. Bylo tedy nutné hledat na Internetu PDF soubory, které již jsou v různých programech vytvořeny a na nich testovat (20 testovaných souborů sample1.pdf až sample20.pdf je přiloženo na CD). Tabulka 3.3: Konverze PDF dokumentů různých tvůrců – 1. část Dokument
Aplikace
Tvůrce PDF
Chyby
sample1.pdf
TeX
MiKTeX pdfTeX-1.21a
bez chyb
sample2.pdf
dvips(k) 5.94a
AFPL Ghostscript 8.0
bez chyb
sample3.pdf
Writer
OpenOffice.org 2.0
bez chyb
sample4.pdf
pdfFactory Pro
pdfFactory Pro v1.53 (WinXP)
bez chyb
sample5.pdf
PDFCreator 0.9.2
AFPL Ghostscript 8.54
bez chyb
sample6.pdf
PScript5.dll 5.2.2
AFPL Ghostscript 8.50
bez chyb
sample7.pdf
PScript5.dll 5.2.2
AFPL Ghostscript 8.50
bez chyb
sample8.pdf
PDFCreator 0.8.0
AFPL Ghostscript 8.14
bez chyb
sample9.pdf
Writer
OpenOffice.org 2.0
sample10.pdf
dvips(k) 5.95b
Acrobat Distiller 5.0.5 (Win)
sample11.pdf
PScript5.dll 5.2
GPL Ghostscript 8.15
pouze u vzorců
sample12.pdf
Acrobat PDFMaker 5.0
Acrobat Distiller 5.0.5 (Win)
pouze u vzorců
- 25 -
u konce vynechaná písmenka při dělení slov!!!
Tabulka 3.4: Konverze PDF dokumentů různých tvůrců – 2. část Dokument
Aplikace
Tvůrce
Chyby
sample13.pdf
LaTeX hyperref package
ESP Ghostscript 815.04
bez chyb
sample14.pdf
Print2PDF 5.0.05.0829
BCL easyPDF 4.11 (0303)
pouze u vzorců
sample15.pdf
PDFCreator 0.9.1
AFPL Ghostrscript 8.53
pouze u vzorců
sample16.pdf
TeX
pdfTeX-0.14h
pouze u vzorců
sample17.pdf
Acrobat PDFMaker 6.0
Acrobat Distiller 6.0
pouze u vzorců
sample18.pdf
PScript5.dll 5.2
Acrobat Distiller 7.0
pouze u vzorců
sample19.pdf
TeX 2006.07.14:2101
dvipdfm 0.13.2c
sample20.pdf
pdfFactory Pro
neúspěch!!!
pdfFactory Pro v1.57 (WinXP) pouze u vzorců
Po důkladné analýze je tedy patrné, že extrakce prostého textu s českou diakritikou v drtivé většině případů dopadla úspěšně. Dokumenty, u kterých je poznačena chyba typu „pouze u vzorců“ jsou totiž po textové stránce konvertovány zcela bez problémů. Chyby u matematických vzorců a výrazů jsou nedůležité, neboť umět je správně interpretovat není prioritou této práce. Co se týče případu vynechaných písmen u konce dokumentu č.9 a v celém rozsahu dokumentu č.19, jedná se, dle mého názoru, o chybu způsobenou použitím neobvyklého fontu, nikoli o chybu způsobenou použitým softwarem na tvorbu PDF (v obou případech je použit podobný hranatě vypadající úzký font). Sporný tudíž zůstává pouze dokument č.10, který používá standardní fonty a přesto při konverzi dochází k chybám v podobě vypuštěných mezer mezi slovy nebo redundantnímu odřádkování uprostřed slova. Po obsahové stránce je však i tento dokument celkem v pořádku, k vynechávání písmenek či jejich špatnému zobrazení nedochází. Obecně lze tedy konstatovat, že výsledek konverze pomocí konvertoru PDFBox s parametrem –html není závislý na softwaru použitém při tvorbě PDF dokumentu, ale pouze na použitých fontech uvnitř dokumentu.
- 26 -
3.4 Zpracování výstupu do konečné podoby Nyní jsem už schopen konvertovat jakýkoliv PDF dokument na prostý text, přičemž diakritické znaky a speciální symboly nezobrazitelné v textovém režimu jsou nahrazeny číselným kódem. Tyto kódy jsou jednoznačné, takže není problém je zpracovat vhodným algoritmem tak, abych získal čitelný český text. Znaky reprezentované číselným kódem mají následující formát: číselnýkód; dále se ve výstupním textu vyskytují znaky typické pro formát HTML, tedy elementy orámované špičatými závorkami <…> a některé řídicí znaky jsou nahrazeny HTML ekvivalentem, aby se nepletly. Jedná se např. o znak „&“, který je nahrazen shlukem znaků &, pokud se v textu vyskytuje atd. Tyto znakové ekvivalenty bude nutno rovněž ve finálním výstupu podchytit a správně interpretovat.
3.4.1 Spojování písmen s jejich diakritikou Jak již bylo napsáno v dřívějších rozborech, většina českých písmen s diakritikou je konvertorem PDFBox rozložena na dva znaky, většinou tedy diakritický znak a základní písmeno anglické abecedy, ke kterému diakritický znak patří. Výhodou navíc je fakt, že konvertor PDFBox tuto dvojici znaků zapíše vždy v jednotném pořadí – nejprve diakritický znak, potom písmeno. Budoucí algoritmus by tedy v prvé řadě měl umět tyto dvojice znaků vyhledat a nahradit je jediným znakem příslušného českého písmena s diakritikou. Nahrazování by mělo fungovat zhruba takto:
algoritmus načítá vždy jeden znak ze vstupu, když narazí na číselný kód odpovídající diakritickému znaku, zapamatuje si ho a podívá se na následující písmeno.
zapamatovaný diakritický znak a následné písmeno již musí vést k jednoznačnému českému písmenu s diakritikou, na výstup se tedy vypíše příslušné české písmeno, respektive jeho ASCII kód znakové sady ISO-8859-2 (viz příloha)
Existuje zde však minimálně jedna výjimka, a sice způsob, jakým PDFBox reprezentuje malé písmeno dlouhé „í“. To je sice rovněž rozloženo na diakritický znak a
- 27 -
písmennou část, ale právě písmenná část je rozpoznána pouze jako fragment písmene „i“, ten můžeme chápat jako „i“ bez tečky. Je to logické, neboť pokud je nad malým písmenem „i“ čárka, tečku už nad něj nepíšeme. Zmiňovaný fragment písmene „i“ je v textu zapsán jako speciální symbol s číselným kódem 305. Tím jsme se dostali k číselným kódům a je na čase odlišit ty číselné kódy, které nemusejí reprezentovat samostatný znak, ale mají význam diakritického znaku pro následující písmeno: Tabulka 3.5: Číselné kódy diakritických znaků Číselný kód 168 180 710 711 730
Slovní popis Přehláska Čárka Stříška Háček Kroužek
Ilustrační vzhled ¨ ' ˆ ˇ ˚
Nyní už stačí vědět, s jakými písmeny se diakritické znaky pojí a na jaký ASCII kód je třeba jednotlivé kombinace upravit při vypisování na výstup. Tabulka 3.6: Výstupní kódy pro písmena s diakritikou
a, A e, E
Přehláska
Čárka
Stříška
228, 196 235, 203
225, 193 233, 201
225, 194
237, 205
238, 206
243, 211 250, 218 253, 221
244, 212
i*, I o, O u, U y, Y
246, 213 252, 220
Háček
Kroužek
236, 204
249, 217
z, Z s, S c, C r, R d, D t, T n, N l, L
190, 174 185, 169 232, 200 248, 216 239, 207 187, 171 242, 210 181, 165
* jak již bylo řečeno, v textu se místo krátkého „i“ po čárce vyskytuje znak 305.
- 28 -
3.4.2 Interpretace ostatních speciálních znaků Dalším velkým problémem při úpravě textu do konečné podoby jsou speciální symboly, které většinou nelze v textovém režimu zobrazit a tudíž je nutné pro ně najít adekvátní náhradu. Dokonce i některá česká písmena s diakritikou se někdy překládají pouze jako jeden speciální znak, nikoli jako soustava diakritického znaku a písmene. Zde jsou všechny speciální kódy, na které jsem narazil při konverzi testovaných PDF dokumentů, a jejich interpretace v textovém režimu. Samozřejmě se nejedná zdaleka o všechny: Tabulka 3.7: Alternativní přímé kódy českých písmen Číselný kód 197 198 215 216 268 269, 321 270 271 282 283 327 328 338 339 344 345, 322 352 353 356 357 366 367 381 382 733
Originální vzhled Á á É é Č č Ď ď Ě ě Ň ň Ú ú Ř ř Š š Ť ť Ů ů Ž ž Í
Popis Přímý kód pro „Á“ Přímý kód pro „á“ Přímý kód pro „É“ Přímý kód pro „é“ Přímý kód pro „Č“ Přímé kódy pro „č“ Přímý kód pro „Ď“ Přímý kód pro „ď“ Přímý kód pro „Ě“ Přímý kód pro „ě“ Přímý kód pro „Ň“ Přímý kód pro „ň“ Přímý kód pro „Ú“ Přímý kód pro „ú“ Přímý kód pro „Ř“ Přímé kódy pro „ř“ Přímý kód pro „Š“ Přímý kód pro „š“ Přímý kód pro „Ť“ Přímý kód pro „ť“ Přímý kód pro „Ů“ Přímý kód pro „ů“ Přímý kód pro „Ž“ Přímý kód pro „ž“ Přímý kód pro „Í“
- 29 -
Textová reprezentace kód 193 kód 225 kód 201 kód 233 kód 200 kód 232 kód 207 kód 239 kód 204 kód 236 kód 210 kód 242 kód 218 kód 250 kód 216 kód 248 kód 169 kód 185 kód 171 kód 187 kód 217 kód 249 kód 174 kód 190 kód 206
V technických textech se samozřejmě hodně využívá písmen řecké abecedy, což opět znamená jistý problém v textovém režimu, neboť sada ISO-8859-2 řeckou abecedu v rámci svých 256 znaků obsaženu nemá – pomohl jsem si tedy opisem: Tabulka 3.8: Reprezentace písmen řecké abecedy Číselný kód
Originální vzhled
Popis
Textová reprezentace
915
Γ
Velké písmeno gamma
916, 8225, 8710, 57517
∆
Velké písmeno delta
920
Θ
Velké písmeno théta
928, 8851
Π
Velké písmeno pí
934
Φ
Velké písmeno fí
936
Ψ
Velké písmeno psí
945, 8747, 57527
α
Malé písmeno alfa
946, 57528
β
Malé písmeno beta
947
γ
Malé písmeno gamma
948, 8706
δ
Malé písmeno delta
<delta>
949
ε
Malé písmeno epsilon
<epsilon>
950
ζ
Malé písmeno zéta
951
η
Malé písmeno éta
<eta>
952
Θ
Velké písmeno théta
955, 8218
λ
Malé písmeno lambda
956, 181
µ
Malé písmeno mý
<my>
957
ν
Malé písmeno ný
960
π
Malé písmeno pí
961, 8240
ρ
Malé písmeno ró
963
σ
Malé písmeno sigma
<sigma>
- 30 -
Tabulka 3.8: Reprezentace písmen řecké abecedy (dokončení) Číselný kód
Originální vzhled
Popis
Textová reprezentace
964
τ
Malé písmeno tau
966, 981
φ
Malé písmeno fí
967
χ
Malé písmeno chí
968
ψ
Malé písmeno psí
969, 61559
ω
Malé písmeno omega
977
ϑ
Malé písmeno théta
Zajisté to není kompletní výčet kódů pro řecká písmena, ale na další jsem ve zkoumaných dokumentech nenarazil. V dokumentech s řeckou abecedou se rovněž často vyskytují kompletní matematické výrazy či vzorce, což s sebou nese potřebu umět reprezentovat také matematické operátory: Tabulka 3.9: Reprezentace matematických operátorů a symbolů Číselný kód
Originální vzhled
8486
Textová reprezentace
Ω
Popis Velké písmeno omega – jednotka Ohm
8594
→
Šipka doprava
->
8596
↔
8658
⇒
Oboustranná horizontální šipka Logická implikace zleva doprava
8704
∀
Obecný kvantifikátor
8707
∃
Existenční kvantifikátor
<EXISTUJE>
8712
∈
8715
∋
<MAPRVKY>
8721
∑
Matematický symbol „je prvkem“ Matematický symbol „má prvky“ Matematický symbol pro „celkový součet“
8709
∅
Prázdná množina
- 31 -
<-> =>
<SUMA>
Tabulka 3.9: Reprezentace matematických operátorů a symbolů (dokončení) Číselný kód
Originální vzhled
8727, 8260
Textová reprezentace
∗
Popis Hvězdička jako operátor násobení
8730
Zlomková čára
/
8734
∞
Nekonečno
8743
∧
Logický operátor AND
8744
∨
Logický operátor OR
8745
∩
8746
∪
8773
≅
8774, 8764
∼
8776
≈
8800
≠
8804
≤
8805
≥
8834
⊂
8838
⊆
8901
.
8968
[
Levá hranatá závorka
[
8969
]
Pravá hranatá závorka
]
57475
+
Matematický operátor „sčítání“
+
57502
(
Levá kulatá závorka
(
57503
)
Pravá kulatá závorka
)
*
Matematický operátor „průnik“ Matematický operátor <SJEDNOCENI> „sjednocení“ Matematický operátor „asi se = rovná“ Logický operátor pro „odpovídá“ Matematický operátor „rovná = se zhruba“ Matematický operátor != „nerovná se“ Matematický operátor „menší =< nebo rovno“ Matematický operátor „větší >= nebo rovno“ Matematický operátor „je podmnožinou“ Operátor „je podmnožinou = nebo ekvivalencí“ Operátor násobení psáno * tečkou
- 32 -
A v neposlední řadě je zde řada symbolů a číselných kódů, které reprezentují nezařaditelné znaky nebo formátování. Tabulka 3.10: Reprezentace ostatních symbolů Číselný kód
Originální vzhled
Popis
Textová reprezentace
169
©
Copyright značka
(c)
174
®
Registrovaná obchodní známka
(R)
183, 8208, 8211, 8212, 8224, 8722, 61623, 65533
−
Různé druhy pomlček
-
8230
…
Trojtečka
…
Odsazení, tabulátor
kód 9
8226, 9679 8220, 8221, 8222
„“
Různé typy uvozovek
kód 34
8472
℘
Veličina „Perlinův šum“
8476
ℜ
R pro kartézský součin
8482
Trademark značka
(TM)
64260
ffl
Narazil jsem na reprezentaci tří písmen „ffl“ naráz
ffl
3.4.3 Formátování a HTML elementy Nakonec už zbývá pouze vypořádat se s HTML obsahem vygenerovaného výstupu. Obecně se jedná o všechny řetězce začínající znakem „&“, neboť amprasand vyskytující se přímo v originálním dokumentu je konvertorem přepsán na řetězec „&“.
- 33 -
Tabulka 3.11: Překlad HTML znaků HTML kód
Popis
Textová reprezentace
&
Amprasand
&
<
Levá špičatá závorka
<
>
Pravá špičatá závorka
>
"
Uvozovky
"
Dále je třeba vypustit všechen text, který se vyskytuje mezi elementy … , poněvadž konvertor okopíruje první řádek původního textu a vloží jej ještě jednou jako nadpis vzniklého HTML dokumentu. Element …
se dá interpretovat ve výsledném textu jako vynechaný řádek pro zpřehlednění výsledku, i když formátování výstupního textu není podmínkou. Všechny ostatní HTML elementy budou ignorovány, tedy zcela vypuštěny aniž by měli na finální text nějaký dopad.
- 34 -
4
Realizace Na základě provedené analýzy již bylo možné sestavit program, který úspěšně převedl
výstup konvertoru PDFBox na prostý text s českou diakritikou. Algoritmus je jednoznačný, takže celková úspěšnost konverze původního PDF dokumentu závisí pouze a jenom na úspěšnosti prvotní extrakce textu pomocí PDFBox, během následné úpravy mnou navrženým algoritmem již k poškození nedochází. Následující podkapitoly se věnují podrobněji hotovému kódu, který není nijak obsáhlý.
4.1 Implementace navrženého algoritmu Kostru mého algoritmu tvoří opakující se cyklus, který po jednom znaku rozebírá výstupní textový soubor vytvořený konvertorem PDFBox zpracováním PDF dokumentu. Algoritmus je samozřejmě ukončen ve chvíli, kdy jsou ze souboru přečteny všechny znaky. Právě načtený znak (v proměnné charcode) je postupně testován, zda-li se nejedná o počátek HTML elementu (znak je roven „<“), pokud ano, je spuštěna vnořená funkce rozeberHTML(). Pokud se nejedná o počátek elementu, může se jednat o počáteční řídicí znak speciálního symbolu (znak je roven „&“), v tomto případě se proměnná charcode přepíše na výsledek spuštěné funkce specialniZnak(). Předposlední možností je případ, kdy je zkoumaný znak diakritickým znakem – typ diakritického znaku se zapamatuje do proměnné diakr a načte se znak stojící bezprostředně za ním, pokud je možné tyto dva znaky skombinovat do jediného
českého
znaku
s diakritikou,
je
tak
učiněno
prostřednictvím
funkce
diakritickyZnak(), jinak se vypíší oba dva znaky samostatně. Pokud nepatří načtený znak ani do jedné ze tří předchozích kategorií, vypíše se přímo na výstup, protože se pravděpodobně jedná o obyčejný zobrazitelný znak. Toto je celý princip sestaveného programu a nyní trochu podrobněji o jednotlivých funkcích zmíněných výše: rozeberHTML()
funkce je volána ve chvíli, kdy se ze zpracovávaného vstupu načte znak „<“, tedy počátek HTML elementu. Jak již bylo uvedeno v analýze, z HTML elementů mě zajímají pouze …
a … . Prvně zmíněný vloží na výstup prázdný řádek, zatímco druhý má význam pouze ten, že vše co - 35 -
je napsané uvnitř, je nadbytečná informace a je nutné ji vypustit. Ostatní HTML elementy jsou ignorovány, respektive vypuštěny, takže ve výstupním textu se nijak neprojeví. specialniZnak()
účel této funkce je správně určit speciální znak, který je ve zdrojovém textu zastoupen číselným kódem nebo HTML ekvivalentem (viz kapitola 3.4.2). Celý řetězec ve standardním formátu je rozebrán a výstupem funkce je buď přímo ASCII kód ISO-8859-2 (viz tabulky A.1 a A.2) příslušného zobrazitelného znaku, nebo chybový výstup (číslo menší než 0).
diakritickyZnak()
funkce má dva parametry, tedy kód diakritického znaku a kód následujícího písmene. Z těchto dvou vstupních informací se snaží skombinovat jediné české písmeno (viz tabulka 3.6). Buď je to možné a návratem je ASCII kód vzniklého českého písmenka v ISO-8859-2 (viz tabulky A.1 a A.2), nebo to možné není a oba znaky se zobrazí na výstupu samostatně.
Popsaný algoritmus však vykonává pouze polovinu celé konverze, neboť pouze upravuje výstup konvertoru PDFBox do konečné podoby. Jedním z požadavků zadání práce je však vytvořit kompletní převaděč PDF dokumentů na korektní text s českou diakritikou, takže je nutné funkce projektu PDFBox zakomponovat přímo do mého programu, čímž se zabývá následující podkapitola.
4.2 Připojení funkcí konvertoru PDFBox Jak již vím, projekt PDFBox obsahuje mimojiné spustitelnou Java třídu „ExtractText“, která umožňuje využívat interní funkce konvertoru k rozebrání PDF dokumentu a jeho psaný obsah přepsat do čistě textové podoby (viz kapitola 3.2.2). Části kódu třídy „ExtractText“ jsem tedy zabudoval přímo do mého programu tak, ať extrakce textu z PDF dokumentu proběhne těsně před spuštěním navrženého algoritmu. Bohužel je však nutné vytvářet nadbytečný soubor MEZIKROK.TXT, neboť funkce PDFBox umí generovat výstup pouze do souboru nebo přímo do konzole. Výsledek je tedy ve výše jmenovaném souboru, odkud jej můj program zpracovává do výsledné podoby.
- 36 -
5
Testování Kde jinde by se mělo provádět závěrečné testování funkčnosti hotového programu, než
na serveru dip.felk.cvut.cz, pro který je projekt určen. Navštívil jsem tedy archív prací [2] a hotový program zde odzkoušel na několika vybraných PDF dokumentacích k nejnovějším pracím svých kolegů z oboru Výpočetní technika: Tabulka 5.1: Výsledky závěrečného testování hotového konvertoru Dokument
Aplikace
Tvůrce
Chyby?
bakm1_2007bach.pdf
LaTeX hyperref package
pdfeTeX-1.30.6
NE
balasj2_2007dipl.pdf
dvips(k) 5.94a
GNU Ghostscript 7.07
ANO
bernhaf_2007dipl.pdf
Writer
OpenOffice.org 2.0
NE
bilekj2_2007dipl.pdf
LaTeX hyperref package
pdfeTeX-1.30.6
NE
blahaf1_2007dipl.pdf
dvips(k) 5.95a
ESP Ghostscript 815.02
NE
bromv1_2007dipl.pdf
PDFCreator 0.9.3
GPL Ghostscript 8.54
NE
caklf1_2007bach.pdf
PDFCreator 0.9.0
AFPL Ghostscript 8.53
NE
cerham1_2007dipl.pdf
PScript5.dll 5.2.2
Acrobat Distiller 7.0 (Win)
NE
ESP Ghostscript 815.03
NE
divist1_2007dipl.pdf hajekm6_2007bach.pdf
PDFCreator 0.9.3
GPL Ghostscript 8.54
NE
chalum2_2007dipl.pdf
PDFCreator 0.9.3
GPL Ghostscript 8.54
NE
jurast1_2007bach.pdf
TeX
pdfeTeX-1.21a
NE
malusm1_2007dipl.pdf
Writer
OpenOffice.org 2.1
NE
manp1_2007dipl.pdf
TeX
MiKTeX pdfTeX-1.30.6
NE
steind1_2007dipl.pdf
easyPDF SDK 4.3
BCL easyPDF 4.30 (0615)
NE
- 37 -
Tabulka 5.1: Výsledky závěrečného testování hotového konvertoru (dokončení) Dokument vranep1_2007dipl.pdf
Aplikace
Tvůrce
LaTeX hyperref package MiKTeX GPL Ghostscript 8.54
Chyby? NE
xmacekv_2007dipl.pdf
Writer
OpenOffice.org 2.2
NE
zapotp1_2007dipl.pdf
PScript5.dll 5.2
GPL Ghostscript 8.15
NE
Jak je patrné, navržený program funguje v drtivé většině případů tak, jak má, ale stále není dokonalý. V každém případě jsou chyby způsobeny vždy již v první fázi konverze, tj. funkcemi PDFBox. V archívu jsem také narazil na dvě práce, které jsou pravděpodobně ofocené z papírové podoby, neboť je PDFBox bere jako sérii obrázků – z nich samozřejmě není možné text vytáhnout vůbec.
- 38 -
6
Závěr
6.1 Zhodnocení splnění cílů práce Podařilo se mi úspěšně navrhnout a implementovat konvertor v jazyce Java (viz kapitola 4), který dokáže vytáhnout česky nebo slovensky psaný text z PDF dokumentu. Úspěšnost extrakce je sice velká, nikoli však stoprocentní. Zde je shrnutí splněných požadavků i nedostatků:
Podrobněji jsem analyzoval výhody a nevýhody konvertorů PDFBox 0.7.3 a Xpdf 3.01. Dospěl jsem k názoru, že lepším základem mojí práce je konvertor PDFBox (viz kapitola 3.2.3)
Funkčnost výsledného konvertoru byla otestována na vybraných pracích z Archívu absolventských prací ČVUT [4] s velmi vysokou úspěšností konverze (viz kapitola 5)
Pokud konvertor rozpozná text z obrázku či grafu, je v tomto textu většinou špatně česká diakritika, rovněž matematické vzorce a výrazy jsou zobrazeny nekorektně
Při konverzi vzniká soubor MEZIKROK.TXT (důvod viz kapitola 4.2), což může způsobit problémy, pokud bude vznikat v prostoru, kde uživatel nebude mít právo zápisu na disk
Konverze neproběhne úspěšně zejména u starších dokumentů (PDF 1.2 a starší) a dokumenty s úzkými fonty (v prohlížeči Acrobat Reader jsou tyto fonty detekovány jako fonty CMxxx a cstxxx)
Nejstabilnějších
výsledků
dosahuje
konvertor
na
PDF
dokumentech
vytvořených v editorech OpenOffice.org, PScript5, TeX a přes PDFCreator či pdfFactory. Nejhorších pak u produktů dvips(k) a algoritmů dvipdfm.
Konvertor neumí zpracovat PDF dokumenty chráněné heslem
- 39 -
6.2 Další možné směry pokračování Z předchozího seznamu nedostatků je zřejmé, že je ještě co vylepšovat, i když osobně si myslím, že vytvořit univerzální konvertor textu z PDF dokumentů se správnou českou diakritikou nelze s použitím knihovny PDFBox, přestože dosahuje daleko lepších výsledků než pdftotext zkoumaný mým kolegou v práci z roku 2006 [1]. Paradoxně, na PDF dokumentech vytvořených řadou editorů dvips(k), s kterýma si PDFBox téměř neporadí, má totiž pdftotext dobré výsledky. Za úvahu by tudíž stál hybridní projekt, který využívá algoritmy parsování PDF dokumentů jak z projektu Xpdf, tak z projektu PDFBox. To je však velmi obtížná práce s ohledem na fakt, že každý z těchto projektů je napsán v jiném programovacím jazyce.
Co se týče čistě mého projektu, rozhodně by se dalo udělat následující:
Předělat PDFBox do daleko větší hloubky k obrazu svému, a to s cílem dostat se na úroveň zápisu na výstup, kde by se přidala možnost výstupu do paměti, aby nevznikal soubor MEZIKROK.TXT. Přijatelným řešením by byla rovněž možnost zpracovávat výstup z PDF dokumentu ihned po částech a rovnou přepisovat do výstupního souboru se správnou diakritikou.
Aby uměl konvertor správně interpretovat všechny speciální znaky, musel by mít v kódu zabudován překlad všech unicode kódů do textové podoby, což je však úkol téměř nadlidský, neboť těchto kódů je v současnosti již několik tisíc (viz [6]).
Přidělat vstup do PDF dokumentů chráněných heslem, což není zas takový problém, neboť to knihovna PDFBox umí, ale já sem tuto funkci vypustil pro zjednodušení přehlednosti kódu mého programu
- 40 -
7
Seznam literatury
[1]
Martin Fúsek. Automatické zpracování PDF dokumentů. Bakalářská práce, FEL ČVUT Praha, 2006
[2]
Archív bakalářských a diplomových prací ČVUT. http://dip.felk.cvut.cz
[3]
Wikipedie – elektronická encyklopedie. http://www.wikipedie.cz
[4]
Projekt Xpdf. http://www.foolabs.com/xpdf/home.html
[5]
Projekt PDFBox. http://www.pdfbox.org
[6]
Standard Unicode. http://www.unicode.org
- 41 -
- 42 -
A
Znaková sada ISO-8859-2 Tabulka A.1: Základní sada ASCII (kódy 0 až 127) Kód Znak Kód Znak Kód Znak Kód Znak 0
ŘZ
32
SPC
64
@
96
`
1
ŘZ
33
!
65
A
97
a
2
ŘZ
34
"
66
B
98
b
3
ŘZ
35
#
67
C
99
c
4
ŘZ
36
$
68
D
100
d
5
ŘZ
37
%
69
E
101
e
6
ŘZ
38
&
70
F
102
f
7
ŘZ
39
'
71
G
103
g
8
ŘZ
40
(
72
H
104
h
9
ŘZ
41
)
73
I
105
i
10
ŘZ
42
*
74
J
106
j
11
ŘZ
43
+
75
K
107
k
12
ŘZ
44
,
76
L
108
l
13
ŘZ
45
-
77
M
109
m
14
ŘZ
46
.
78
N
110
n
15
ŘZ
47
/
79
O
111
o
16
ŘZ
48
0
80
P
112
p
17
ŘZ
49
1
81
Q
113
q
18
ŘZ
50
2
82
R
114
r
19
ŘZ
51
3
83
S
115
s
20
ŘZ
52
4
84
T
116
t
21
ŘZ
53
5
85
U
117
u
22
ŘZ
54
6
86
V
118
v
23
ŘZ
55
7
87
W
119
w
24
ŘZ
56
8
88
X
120
x
25
ŘZ
57
9
89
Y
121
y
26
ŘZ
58
:
90
Z
122
z
27
ŘZ
59
;
91
[
123
{
28
ŘZ
60
<
92
\
124
|
29
ŘZ
61
=
93
]
125
}
30
ŘZ
62
>
94
^
126
~
31
ŘZ
63
?
95
_
127
DEL
- 43 -
Tabulka A.2: Znaková sada ISO-8859-2 (kódy 128 až 255) Kód
Znak Kód
Znak Kód
Znak Kód
Znak
128
ŘZ
160 NBSP 192
Ŕ
224
ŕ
129
ŘZ
161
Ą
193
Á
225
á
130
ŘZ
162
˘
194
Â
226
â
131
ŘZ
163
Ł
195
Ă
227
ă
132
ŘZ
164
¤
196
Ä
228
ä
133
ŘZ
165
Ľ
197
Ĺ
229
ĺ
134
ŘZ
166
Ś
198
Ć
230
ć
135
ŘZ
167
§
199
Ç
231
ç
136
ŘZ
168
¨
200
Č
232
č
137
ŘZ
169
Š
201
É
233
é
138
ŘZ
170
Ş
202
Ę
234
ę
139
ŘZ
171
Ť
203
Ë
235
ë
140
ŘZ
172
Ź
204
Ě
236
ě
141
ŘZ
173
SHY
205
Í
237
í
142
ŘZ
174
Ž
206
Î
238
î
143
ŘZ
175
ś
207
Ď
239
ď
144
ŘZ
176
°
208
ð
240
ñ
145
ŘZ
177
ą
209
Ń
241
ń
146
ŘZ
178
˛
210
Ň
242
ň
147
ŘZ
179
ł
211
Ó
243
ó
148
ŘZ
180
´
212
Ô
244
ô
149
ŘZ
181
ľ
213
İ
245
ı
150
ŘZ
182
ś
214
Ö
246
ö
151
ŘZ
183
ˇ
215
×
247
÷
152
ŘZ
184
¸
216
Ř
248
ř
153
ŘZ
185
š
217
Ů
249
ů
154
ŘZ
186
ş
218
Ú
250
ú
155
ŘZ
187
ť
219
Ő
251
ő
156
ŘZ
188
ź
220
Ü
252
ü
157
ŘZ
189
˝
221
Ý
253
ý
158
ŘZ
190
ž
222
ł
254
Ń
159
ŘZ
191
Ŝ
223
ß
255
˙
- 44 -
B
Seznam použitých pojmů a zkratek
ASCII
American Standard Code for Information Interchange
ČVUT
České vysoké učení technické
FEL
Fakulta elektrotechniky
HTML
HyperText Markup Language
ISO
International Organization for Standardization
PDF
Portable Document Format
DEL
Delete – smazání, zpětný znak
NBSP
Non-Breaking Space – tvrdá mezera
SHY
Soft Hyphen – měkký rozdělovník
SPC
Space – mezera, prázdný znak
- 45 -
C
Obsah přiloženého CD
/miksr1_bp.doc
tento text bakalářské práce jako dokument MS Word 2000
/miksr1_bp.pdf
tento text bakalářské práce ve formátu PDF
/pdf2text.jar
funkční konvertor pdf2text
/PDFBox-0.7.3.zip
originální projekt PDFBox 0.7.3, z kterého jsem vycházel
/src/pdf2text.java
zdrojový kód konvertoru pdf2text v jazyce Java
/samples/…
20 PDF dokumentů testovaných v kapitole 3.3
/test/…
vybrané absolventské práce, na kterých bylo prováděno testování v kapitole 5
- 46 -