DjVu/Anatomie DjVu dokumentu
DjVu dokument je produkt zobrazovací technologie, která byla postavena na výchozím poznatku že u klasického, až již psaného či tištěného, dokumentu zabírá "barva", která je nositelem textové informace, z celkové plochy pouhých pár procent. Je-li písmo (popředí) odseparováno za pomoci masky od pozadí, lze využít při kompresi každé z těchto vrstev postupů, které výrazně zlepší jejich kompresní poměr.
Komprese BZZ
editovatVýchozí kompresní algoritmus pro DjVu byl postaven, podobně jako bzip2, na Burrows-Wheelerově transformaci v kombinaci s algoritmy Karp-Miller-Rosenberga a Bentley-Sedgewicka. Spolu s dalšími technikami se využívá pro kompresi barevných vrstev u JB2 a při kompresi vrstev které nesou textovou informaci.
DjVuText - komprese JB2
editovatJB2 není samostatný kompresní algoritmus, ale aplikace BZZ komprese na sadu samostatně komprimovaných bloků obrazových dat. Kompresní utilita nekomprimuje celý obraz, ale z celkové plochy obrazu vyseparuje pouze bloky, které nesou nějakou informaci (shapes) - typicky písmena - a pouze ty zakomprimuje pomocí BZZ. Do souboru se pak postupně za sebou ukládají souřadnice bloku, informace o jeho barvě, velikost komprimovaných dat a blok komprimovaných dat.
Prohlížečka při dekompresi postupně tyto bloky načítá a zobrazuje. Pro výsledný kompresní poměr tedy není ani tak důležitý počet barev, jako spíš počet a velikost komprimovaných plošek. Čím vyšší je u vstupního dokumentu úroveň "šumu", tvořeného různými drobnými artefakty ( nečistoty, ev. mechanická struktura skenovaného dokumentu) tím větší počet bloků je ke komprimaci a horší výsledný kompresní poměr.
Bitonální JB2 komprese se využívá při kompresi masky (vrstva 'Sjbz') a barevná u popředí, je-li v indexovaných barvách (vrstva 'FGjz').
U vícestránkových dokumentů lze kompresní poměr zlepšit také použitím sdílené 'Djbz' vrstvy. Ta je založena na předpokladu, že se podobné komprimované plošky (písmena) na stránkách opakují. U stránky, která využívá sdílenou 'Djbz' vrstvu se do 'Sjbz' vrstvy (masky) ukládají pouze ty komprimované plošky, které ve sdílené 'Djbz' vrstvě nevyskytují.
DjVuPhoto - komprese IW44
editovatPro kompresi obrázků používá DjVu kompresní formát založený na vlnkové (wavelet) kompresi. Ta je založena na tom, že barevný obrázek tvoří barevné plošky, které lze vymezit pomocí křivky. Oproti klasické bitmapové kompresi při které je obrázek popsán jako jeden barevný bod, lze obrázek kde je barevná plocha definována pomocí křivky zvětšovat, aniž by se z něj stala změť barevných čtverečků. Komprese IW44 funguje tak, že se obrázek nejprve zredukuje na celistvé barevné plošky, ty se převedou na křivky (splices), a ty se pak podle předem zvoleného schématu umístí do dalších vrstev.
Při generování obrázku pak prohlížečka tyto vrstvy postupně načítá a zobrazuje.
IW44 se používá především ke kompresi fotografií, u kterých drobné rozostření nevadí, barevných obrázků a obrázků v odstínech šedi.
DjVuLayered - aplikace masky
editovatU IW44 platí, že čím celistvější je barevná plocha, tím lze dosáhnout lepší komprese. Proto je výhodné využít při kompresi pozadí psaných, resp. tištěných dokumentů masku, která odfiltruje popředí. Díky tomu, že maska odfiltruje popředí, lze pozadí "popsat" pomocí menšího množství křivek a tím pak dosáhnout vyššího kompresního poměru.
Každý DjVu dokument je ve své podstatě vrstvený DjVu dokument (DjVuLayered), který může obsahovat minimálně jednu vrstvu, většinou však tyto dokumenty obsahují masku, popředí i pozadí.
Schéma DjVu dokumentu
editovatZákladem je stránka, která má několik vrstev tzv. "chunks". Jednotlivé stránky lze spojovat do jednoho celku - "svazku" (bundle) pomocí aplikace djvm . V případě rozsáhlejších dokumentů umožňuje djvu formát také volnější spojení svazku (indirect), kdy jsou stránky uloženy v jediném společném adresáři a svázány jedním indexovým djvu souborem.
Převod mezi "bundle" a "indirect" lze bez problémů provádět pomocí djvmcvt . Výhodou spojených stránek je mimo jiné možnost používat interní hypertextové odkazy, podobně jako tomu je u PDF, generovat náhledy, atd.
Výpisu struktury pomocí djvudump se liší podle toho, zda je dokument typu "bundled" nebo "indirect". Protože v "bundled" svazku jsou přítomny zároveň všechny stránky, není problém vypsat také informace o vrstvách které obsahují. To však neplatí v případě že je dokument typu "indirect". Příklad téhož dokumentu ve formě:
"indirect" FORM:DJVM [136] DIRM [78] Document directory (indirect, 3 files 2 pages) p0001.djvu -> p0001.djvu shared_anno.iff -> shared_anno.iff p0002.djvu -> p0002.djvu NAVM [38] "bundle" FORM:DJVM [84467] DIRM [90] Document directory (bundled, 3 files 2 pages) NAVM [38] FORM:DJVU [51805] {p0001.djvu} INFO [10] DjVu 4960x7016, v24, 600 dpi, gamma=2,2 INCL [15] Indirection chunk --> {shared_anno.iff} Sjbz [28088] JB2 bilevel data FGbz [5681] JB2 colors data BG44 [4822] IW4 data #1, 72 slices, v1.2 (color), 1654x2339 BG44 [2683] IW4 data #2, 11 slices BG44 [3939] IW4 data #3, 10 slices BG44 [6399] IW4 data #4, 10 slices TXTz [7] Hidden text (text, etc.) ANTz [71] Page annotation (hyperlinks, etc.) FORM:DJVI [65] {shared_anno.iff} ANTz [53] Page annotation (hyperlinks, etc.) FORM:DJVU [32423] {p0002.djvu} INFO [10] DjVu 4960x7016, v24, 600 dpi, gamma=2,2 INCL [15] Indirection chunk --> {shared_anno.iff} Sjbz [15651] JB2 bilevel data FGbz [497] JB2 colors data BG44 [4836] IW4 data #1, 72 slices, v1.2 (color), 1654x2339 BG44 [2326] IW4 data #2, 11 slices BG44 [3202] IW4 data #3, 10 slices BG44 [5719] IW4 data #4, 10 slices ANTz [72] Page annotation (hyperlinks, etc.) TXTz [7] Hidden text (text, etc.)
Kromě stránek s obrazovou informací může obsahovat DjVu dokument také další stránky. Každá z nich je určena parametrem FORM. Podle jejich kodu můžete poznat jakou informaci obsahují
DJVM
editovatJe identifikátor, který najdete výhradně u vícestránkových DjVu dokumentů. Může obsahovat jeden až dva bloky informací. Vždy obsahuje blok DIRM a pouze je-li součástí svazku textový rejstřík (outline) obsahuje také blok NAVM.
DIRM
editovatJe blok dat, který se vyskytuje u všech typů svázaných dokumentů. Obsahuje základní informaci o dokumentech, které jsou součástí svazku a také informaci, zda-li je svazek pevný či volný. Na tom totiž záleží jak vypadá struktura dat.
Na rozdíl od volného (indirect) svazku obsahuje pevný (bundled) svazek blok s offsety jednotlivých stránek.
INT8 (1 bajt) | informace o typu dokumentu. Může mít pouze dvě hodnoty 1 (indirect) nebo 129 (bundle) |
Následující blok následuje pouze u pevných (bundled) svazků... | |
INT16 (2 bajty) | celkový počet spojených dokumentů |
Následující sekvence offsetů se opakuje podle počtu vložených dokumentů, a to včetně dokumentů sdílených!... | |
INT32 (4 bajty) | offset na kterém začíná spojený dokument |
Za offsety následuje komprimovaný blok dat. U volných (indirect) svazků následuje komprimovaný blok dat bezprostředně za identifikátorem typu svazku. Obsah komprimovaného bloku dat se opět liší podle typu svazku.
U pevného svazku obsahuje informaci o velikosti, typu a ID vložených dokumentů:
INT24 (3 bajty) * počet vložených dokumentů | délka vloženého dokumentu |
INT8 (1 bajt) * počet vložených dokumentů | typ vloženého dokumentu |
Následující sekvence se opakuje pro jednotlivé vložené dokumenty až do konce bloku dat... | |
UTF8 (řetězec) | ID vloženého dokumentu |
NULL (1 bajt) | oddělovač identifikátorů |
U volného (indirect) svazku obsahuje pouze odkazy na soubory.
NAVM
editovatJe komprimovaný blok dat, který následuje bezprostředně za blokem DIRM, pokud dokument obsahuje textový rejstřík (outline). U "volných" svazků je tedy stejně jako DIRM součástí indexového DjVu souboru. NAVM je součástí formátu DjVu od května 2003.
INT16 (2 bajty) | celkový počet elementů |
Následující sekvence se opakují pro jednotlivé položky až do konce bloku dat... | |
INT8 (1 bajt) | počet potomků elementu |
INT24 (3 bajty) | délka řetězce popisu |
UTF8 (řetězec) | popis elementu |
INT24 (3 bajty) | délka řetězce URL |
UTF8 (řetězec) | URL |
Viz ukázka rozbaleného bloku dat NAVM ukázkového souboru example_outline.djvu
:
0000000 00 08 05 00 00 13 4f 6e 6c 69 6e 65 20 50 75 62 .....8 5 ........19 O n l i n e __ P u b 0000016 6c 69 63 61 74 69 6f 6e 73 00 00 00 01 00 00 09 l i c a t i o n s .........0 1 .........9 0000032 53 61 6d 70 6c 65 73 20 31 00 00 0b 23 70 30 30 S a m p l e s __ 1 ........11 # p 0 0 0000048 30 31 2e 64 6a 76 75 01 00 00 0c 64 61 6c 73 69 0 1 . d j v u 1 ........12 d a l s i 0000064 5f 75 72 6f 76 65 6e 00 00 00 00 00 00 0d 61 20 _ u r o v e n .........0 0 ........13 a __ 0000080 6a 65 73 74 65 20 64 61 6c 73 69 00 00 00 00 00 j e s t e __ d a l s i .........0 0 .. 0000096 00 09 53 61 6d 70 6c 65 73 20 32 00 00 0b 23 70 .....9 S a m p l e s __ 2 ........11 # p 0000112 30 30 30 32 2e 64 6a 76 75 00 00 00 09 53 61 6d 0 0 0 2 . d j v u 0 .........9 S a m 0000128 70 6c 65 73 20 33 00 00 0b 23 70 30 30 30 33 2e p l e s __ 3 ........11 # p 0 0 0 3 . 0000144 64 6a 76 75 00 00 00 15 50 75 62 6c 69 73 68 65 d j v u 0 ........21 P u b l i s h e 0000160 72 73 20 54 65 63 68 6e 6f 6c 6f 67 79 00 00 1b r s __ T e c h n o l o g y ........27 0000176 23 70 75 62 6c 69 73 68 65 72 73 5f 54 65 63 68 # p u b l i s h e r s _ T e c h 0000192 6e 6f 6c 6f 67 79 2e 64 6a 76 75 00 00 00 08 44 n o l o g y . d j v u 0 .........8 D 0000208 6a 56 75 20 46 41 51 00 00 0d 23 64 6a 76 75 66 j V u __ F A Q ........13 # d j v u f 0000224 61 71 2e 64 6a 76 75 a q . d j v u
Aplikace djvused interpretuje tento blok kódu následujícím způsobem:
user@stroj:~$ djvused example_outline.djvu -e 'print-outline'
(bookmarks
("Online Publications"
""
("Samples 1"
"#p0001.djvu"
("dalsi_uroven"
""
("a jeste dalsi"
"" ) ) )
("Samples 2"
"#p0002.djvu" )
("Samples 3"
"#p0003.djvu" )
("Publishers Technology"
"#publishers_Technology.djvu" )
("DjVu FAQ"
"#djvufaq.djvu" ) ) )
Informace vytažené přímo z kodu:
Celkový počet položek: 8
- 5 Online_Publications
- 1 Samples_1 #p0001.djvu
- 1 dalsi_uroven
- 0 a_jeste_dalsi
- 0 Samples_2 #p0002.djvu
- 0 Samples_3 #p0003.djvu
- 0 Publishers_Technology #publishers_Technology.djvu
- 0 DjVu_FAQ #djvufaq.djvu
Interpretace kódu v prohlížečce:
- "Online Publications"
- "Samples 1"
- "dalsi_uroven"
- "a jeste dalsi"
- "Samples 2"
- "Samples 3"
- "Publishers Technology
- "DjVu FAQ"
U dokumentů Secure DjVu zůstává blok DIRM nešifrovaný. Více viz SDJVU
DJVI
editovatJe identifikátor sdíleného dokumentu. Ten obsahuje informace, které mají být dostupné ze všech dokumentů ve svazku. Metainformace, osnova, atd. Při převedení pevného (bundle) svazku na volný (indirect) mají soubory s těmito sdílenými dokumenty příponu "iff". Výjimkou jsou náhledy, které používají příponu "thumb".
U normálního DjVu dokumentu je v každém DJVI dokumentu vždy pouze jeden blok dat některého z následujících typů. U kryptovaného DjVu souboru to neplatí, protože u něj blok dat s informacemi o zabezpečení obsahuje bloky dva INCL a SINF.
Djbz
editovatJe blok dat, který obsahuje knihovnu tvarů (shapes), které se na stránkách opakují - typicky jde o písmo. Vrstva Sjbz (maska) ve stránce dokumentu pak obsahuje pouze ty tvary, které se v tomto sdíleném bloku nevyskytují.
ANTa
editovatPůvodní, dnes již nepoužívaný nekomprimovaný blok poznámkových dat
ANTz
editovatU DjVuLibre se setkáte pouze s jediným dokument tohoto typu - "shared_anno.iff", ve kterém by měly být soustředěny informace společné pro celý svazek. U některých volných svazků však lze narazit i na jiné soubory - "docmeta.iff" a "pagemeta.iff", s nimiž pracoval (dnes již nedostupný) komerční software JRAPublish. Nebo "djvudir.iff", který se používal pro DjVu svazky do verze 20.
JRMD
editovatS tímto identifikátorem datového bloku se můžete setkat pouze u dokumentů, které generoval již výše zmíněný JRAPublish. Podle stránky ( dnes již nedostupné ) http://www.planetdjvu.com/metadata_storage_for_djvu_files_m.htm měl tento blok obsahovat následující meta klíče:
- docmeta.iff - Title, Author, Date, Subject, Summary, Publisher
- pagemeta.iff - Author, Date, Subject, Publisher
Vrstvy JRMD které jsou součástí jednotlivých stránek by pak měly obsahovat meta klíče - Title a Summary
Vzhledem k tomu, že ve své "sbírce" mám jeden dokument, který byl vytvořený v JRAPublish, bylo možné tento blok částečně analyzovat
THUM
editovatTento datový blok s předem vyrenderovanými náhledy se ve svazku může objevit i víckrát, ale u menších svazků nemusí být uveden vůbec. Má význam u pevných svazků kde je hodně stránek, resp. jsou velké, takže by renderování náhledu za běhu příliš zdržovalo, nebo u volných svazků prohlížených on-line.
Náhledy mohou být vyrenderované zvlášť pro každou stránku, ale mohou být i seskupeny povícero v několika blocích. Identifikátorem náhledu je TH44.
DJVU
editovatje vlastní stránka s obrazovou informací, která může kromě obrazových vrstev obsahovat také skryté textové vrstvy s textovým obsahem stránky, meta informacemi, hyperlinky, atd..
Vrstvy DJVU dokumentu
editovatZákladní informace o djvu dokumentu (kolik má stránek, vrstev, atp.) lze získat mj. utilitou djvudump. Obrazové vrstvy (chunks) lze extrahovat pomocí nástroje djvuextract, ovšem POZOR z DjVu souborů nikdy nezískáte soubory identické s těmi, ze kterých byly vytvořeny, protože použitá wavelet komprese je ztrátová. Vytažené vrstvy však můžete použít do jiných dokumentů (např jako "vodoznak"), a nebo z nich vyrenderovat bitmapový obrázek a dále pracovat s ním.
- INFO
- je informační vrstva která obsahuje údaje pro výchozí nastavení obrázku. Jaké má použít prohlížeč výchozí rozměry, rozlišení, nastavení gammy. Od dubna 2001 je také jeho součástí příznak, který definuje jaká má být orientace stránky.
- INCL
- je virtuální vrstva která obsahuje odkaz na shared_anno.iff hlavičku a patičku dokumentu.
- Sjbz
- je vrstva která funguje jako maska při renderování popředí. V případě, že je zvolen při prohlížení režim kresba, nahrazuje chybějící barevné vrstvy. Může jí být obrázek zkomprimovaný nástrojem cjb2 ale také celý djvu dokument, je-li pouze jednobarevný. Od dubna 2001 podporuje kompresní formát jb2, který se na komprimaci této vrstvy používá, barvy. Předtím bylo možné použít pouze černobílou masku. Význam to má zvláště u starších tištěných dokumentů, kde díky tomu lze dosáhnout příznivé komprese celého djvu dokumentu. Zažloutlé pozadí stránek je odmaskováno do pozadí a písmo vhodným kontrastem vytažené do popředí. Maska může být také identifikována Smmr - je-li komprimovaná technologií MMR/G4, kterou používá TIFF.
- BG
- vrstvy pozadí - Obvykle jich je víc než jedna, ovšem extrahovat jsou pouze jako jeden celek.
- FG
- vrstvy popředí - tvoří primárně černobílá vrstva a vrstvy obsahující grafiku s indexovanými barvami. Při "manuální" tvorbě dokumentu můžeme zadanými parametry ovlivnit, které barvy budou součástí popředí a které již spadnou do pozadí.
- TH
- je vrstva s náhledy stránek vložených v dokumentu.
- TXT
- je textová vrstva dokumentu s vlastním textovým obsahem stránky.
- ANT
- je textová vrstva dokumentu, určená pro poznámky, bookmarky, hypertextové odkazy atp. Součástí formátu od dubna 2005
JRMD- je dnes již nepoužívaná textová vrstva dokumentu, určená pro poznámky, bookmarky, hypertextové odkazy. Generoval ji JRApublish 3.0(software, který je dnes prakticky nedostupný.).
CIDa- je vrstva kterou podle mnou nalezených informací generoval Virtual Print Driver (zřejmě přímo od Lizzardu) a byl součástí DjVu cca od verze djvu3.6.1 od června 2002 však už není podporovaná.
- Djbz
- je sdílená vrstva dokumentu, která obsahuje seznam tvarů (shapes), které se mohou na stránkách opakovat - typicky znaky písma. Vrstva Sjbz (maska) pak obsahuje pouze tvary, které se ve sdílené vrstvě nevyskytují.
Komprese, jaké se používají na vrstvy
editovat- Identifikace použité komprese v označení obrazové vrstvy
- bz - vrstva černobílá (resp. v indexovaných barvách) komprimovaná BZZ
- 44 - vrstva komprimovaná IW44
- jp - vrstva komprimovaná JPEG
- 2k - vrstva komprimovaná JPEG-2000
- mmr - černobílá vrstva komprimovaná G4