Zpracování PDF bez textové vrstvy do DjVu souboru s textovou vrstvou

Z thewoodcraft.org
Stránka byla naposledy editována 11.4.2022

Jak jste možná již zjistili, zdejší archív má většinu vícestránkových dokumentů ve formátu DjVu. Proč to tak je, pochopíte když se s tímto formátem blíže seznámíte. Z laického hlediska je důležitá především ta informace, že DjVu soubor, vytvořený ze stejného naskenovaného materiálu je mnohonásobně menší než soubor v PDF.

Kromě toho DjVu používá technologie, díky kterým lze s takovými soubory mnohem komfortněji pracovat. Tady s nimi pracuje především zdejší knihovna, ale pro mobilní zařízení existují aplikace které umožňují DjVu soubory odsud stažené bez problémů číst na mobiech a čtečkách.

Tento článek je ale určen především pro ty, které zajímá jakým způsobem a jak rychle se takový soubor udělá.

Operaci lze provést snadno a rychle s využitím open source nástrojů. Uživatelé MS Windows mají smůlu, protože jsou odkázáni na komerční nástroje, které ani zdaleka nejsou schopny poskytnout tak kvalitní výsledek.

Je to dáno tím, že u opensource nástrojů máte celý proces zpracování pod kontrolou a můžete mu pomocí různých triků dosti pomoci.

Sepsání tohoto textu motivovalo zpracování PDF souboru vzpomínek Leonarda S. Clarka - jednoho z prvních woodcrafterů. Ten soubor se 44 stránkami strojopisného textu totiž neobsahoval textovou vrstvu, tudíž se s ním nedalo vůbec pracovat.

Následujícím postupem jsem původní PDF soubor o velikosti 18 MB jsem "sklepal" do DjVu souboru o velikosti 0.9 MB - včetně OCR - a to během 5 minut.

PDF do XCF

Gimp umí otevřít vícestránkové formáty jako TIFF nebo PDF, a následně uložit jako soubor XCF, kde každá stránka původního PDF (nebo TIFF) souboru tvoří samostatnou vrstvu.

V této fázi lze provést případné úpravy původních stránek, které mohou výrazně zlepšit úspěšnost OCR. Stránky lze:

  • natáčet a srovnávat s využitím vodítek
  • a případně zlepšit jejich barevné podání a vyretušovat prvky, které by mohly komplikovat OCR

Vrstvu lze zpracovat i samostatně, tak aby z ní bylo možné vytěžit maximum textové informace v situaci. kdy tomu brání nevhodně zvolená kombinace barev textu a pozadí.

Upozornění Pořadí stránek (vrstev) u naimportovaného souboru je opačné než je potřeba pro konverzi do DjVu. Při konverzi se vrstvy extrahují postupně od nejnižší po nejvyšší. Takže jako nejvyšší vrstva je poslední stránka. Jenže Gimp PDF importuje tak, že jako nejvyšší vrstva je stránka první.

Pořadí vrstev lze upravit během zpracování - ostatně většinou, pokud se skenují dvoustrany, se stejně musí stránky rozdělit, upravit, setřídit a následně oříznout.

Pokud ale pouze potřebujeme rychle obrátit pořadí vrstev, stačí kliknout nad obrázkem na pravé tlačítko a v vybrat volbu menu

Vrstva -> Zásobník -> Obrátit pořadí vrstev

U anglické mutace GUI Gimpu je to:

Layer -> Stack -> Reverse Layer Order

XCF do DjVu

Ke konverzi z XCF do DjVu používám jednoduchý shellový skript s názvem xcf2djvu:

#!/bin/bash
# Skript pro konverzi .xcf souborů (Gimp) do .djvu
# Původní název souboru - convert.sh
# Dočasná utilita do doby, než bude do nástroje djvutool implementováno vytvoření djvu souboru z obrázku
# TODO:
# - aktuálně se všechny pomocné soubory dělají v tmp

function todjvu {
    RANDOMKEY=$[ 8000 + $[ RANDOM % 1000 ]]
    TEMP_DIR="/tmp/$WINDOWID$BASHPID$RANDOMKEY"
    mkdir $TEMP_DIR
    TEMP_IMG="$TEMP_DIR/temp.ppm"
    TEMP_MASK="$TEMP_DIR/mask.pbm"
    DJVU_MASK="$TEMP_DIR/mask.djvu"

    case ${1##*.} in
        tiff|tif) KONVERT="tifftopnm";;
        png) KONVERT="pngtopnm";;
        jpg) KONVERT="jpegtopnm" ;;
    esac

    #$KONVERT $1 | pnmflip -cw | tee $TEMP_IMG | ppmtopgm | pgmtopbm -threshold -value 0.${3-5} | pnmtoplainpnm > $TEMP_MASK;
    #$KONVERT $1 | pnmflip -r180 | tee $TEMP_IMG | ppmtopgm | pgmtopbm -threshold -value 0.${3-5} | pnmtoplainpnm > $TEMP_MASK;
    $KONVERT $1  | tee $TEMP_IMG | ppmtopgm | pgmtopbm -threshold -value 0.${3-5} | pnmtoplainpnm > $TEMP_MASK;
    cjb2 -lossy -clean $TEMP_MASK $DJVU_MASK;
    djvumake ${1/.png/.djvu} Sjbz=$DJVU_MASK PPM=$TEMP_IMG;
    rm -rf $TEMP_DIR
}

if [ "${1##*.}" == "xcf" ] ; then
    TEMPORARY="/tmp/$WINDOWID$BASHPID"
    mkdir $TEMPORARY
    convert ${1} ${TEMPORARY}/test.png
    pushd $TEMPORARY
    BUNDLE=" "
    for i in $(ls -cr -1) ; do
        todjvu $i
        BUNDLE="$BUNDLE ${i/.png/.djvu}"
    done
    djvm -c out.djvu $BUNDLE
    popd
    mv $TEMPORARY/out.djvu ./
    rm -rf $TEMPORARY
fi

Použití skritu (který musí být pochopitelně označen jako spustitelný):

$ ./xcf2djvu clark.xcf 

Z dočasného adresáře /tmp, kde probíhají veškeré konverze se do adresáře ve kterém byl skript spuštěn přesune pouze výsledný soubor s názvem out.djvu

OCR

Pro vytvoření textové vrstvy lze na výsledný soubor out.djvu použít nástroj ocrodjvu, který je k dispozici kupř. v distribuci Debianu

$ ocrodjvu -l eng --in-place out.djvu

O výsledku se můžeme přesvědčit jednoduše:

$ djvutxt out.djvu