Posts mit dem Label epubcheck werden angezeigt. Alle Posts anzeigen
Posts mit dem Label epubcheck werden angezeigt. Alle Posts anzeigen

Dienstag, 9. Dezember 2014

Seitenfehler im Ebookreader PRS300 von Sony

Lange hatte ich mich gewundert. In meinem Projekt ›Bunte Bilder aus dem Sachſenlande« hatte ich etliche Mühen auf mich genommen, um möglichst exzellente Grafiken aus der Originalvorlage zu erzeugen und diese als SVG bereitzustellen, damit die Ebookreader diese Vektorgrafiken auf ihre bevorzugte Auflösung rendern können.

Das Programm epubcheck meldete keinerlei Fehler mehr und auf den diversen Ebookreadern auf meinem PC wurde das Epub2 soweit korrekt angezeigt.

Nur einzig und allein auf meinem Sony PRS300 hatte ich ein komisches Verhalten. Das Inhaltsverzeichnis wurde geladen und angezeigt. Doch sobald ich auf eine Seite ging, kam das Symbol "Seitenfehler". Wenn ich zwischendurch auf ein anderes Buch ging und später auf die Seite zurück, war manchmal der Seitenfehler verschwunden und die Seite korrekt gerendert. Nur beim Zurückkehren auf das Inhaltsverzeichnis, beim Vor- oder Zurückblättern  tauchte der Fehler wieder auf.

In einem letzten Test erzeugte ich ein Ebook, welches statt SVGs Bilder im PNG-Format abspeicherte. Und siehe da, das Ebook ließ sich nutzen.

Auf alle Fälle wäre ich jedem dankbar, der das Verhalten mit seinem Ebookreader mal versucht nachzustellen oder mir vielleicht eine Übersicht über die Einschränkungen der verschiedenen erhältlichen Ebookreader nennen kann. Über entsprechende Hinweise wäre ich sehr dankbar.

Samstag, 1. November 2014

SVG 1.0 nach SVG 1.1

Da EPUB 2.0 auf SVG 1.1 referenziert, sollten wir auch SVGs in der erwarteten Version erzeugen. Auf das Problem bin ich gestoßen, als ich für das »Bunte Bilder aus dem Sachſenlande« - Projekt mal den epubcheck aufgerufen hatten und ff. Meldungen bekam:

$> epubcheck bunte_bilder.epub
Validating against EPUB version 2.0 - custom validation
Validating using EPUB version 2.0 rules.
ERROR(RSC-005): bunte_bilder.epub/OEBPS/img/003_Wappen.svg(6,38): Error while parsing file 'value of attribute "version" is invalid; must be equal to "1.1"'.

Abhilfe schafft ff. Aufruf von inkscape:

$> inkscape -z -E=tmp.eps svg1.0.svg
$> inkscape -z -l=svg1.1.svg tmp.eps

Die Zweiteilung mit Umweg über EPS ist notwendig, weil inkscape SVGs dann nicht in neue Version konvertiert, wenn diese valide ist und alle Elemente in neuer Version gültig sind. Mit "-z" unterdrückt man die GUI und "-E" exportiert nach EPS, "-l" nach SVG.

Um alle Bilder im Verzeichnis zu konvertieren, nutzt man ff. Schleife in der Bash:

$> for i in *.svg; do inkscape -z -E=tmp.eps $i; inkscape -z -l=$i tmp.eps; rm -f tmp.eps; done

Wer noch andere Varianten/Tools kennt, melde sich bitte. :)

Sonntag, 13. Januar 2013

Teil 8, Selbstversuch Ebook - Befreiung am Beispiel "Bunte Bilder aus dem Sachsenlande"

Der Prozess der Nachkorrektur der OCR-Texte des Buches "Bunte Bilder aus dem Sachsenlande" ist recht zeitaufwendig. Um besser Fehler zu finden, aber auch mal ein Zwischenergebnis zu haben, habe ich folgendes Bash-Script geschrieben, welches mir ein rudimentäres EPub-Dokument zusammenbaut:

# generates a rudimentary epub
NAME=/tmp/$1
DIR=$(echo $2|sed -e "s/\/$//g")
PAGES=$(ls $DIR)
mkdir -p $NAME
mkdir -p $NAME/$DIR
echo -n "application/epub+zip" >$NAME/mimetype
mkdir -p $NAME/META-INF
cat <<CONTAINER >$NAME/META-INF/container.xml
<?xml version="1.0" encoding="UTF-8"?>
  <container
    xmlns="urn:oasis:names:tc:opendocument:xmlns:container"
    version="1.0">
    <rootfiles>
      <rootfile
        full-path="$DIR/inhalt.opf"
        media-type="application/oebps-package+xml"/>
    </rootfiles>
  </container>
CONTAINER
cat <<OPF1 >$NAME/$DIR/inhalt.opf
<?xml version="1.0" encoding="UTF-8"?>
  <package
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:opf="http://www.idpf.org/2007/opf"
    xmlns="http://www.idpf.org/2007/opf"
    version="2.0"
    unique-identifier="BookId">
    <metadata>
      <dc:language xsi:type="dcterms:RFC3066">de-DE</dc:language>
      <dc:title>Hello World</dc:title>
      <dc:identifier id="BookId">id_Hello_World</dc:identifier>
    </metadata>
    <manifest>
      <item id="ncx" href="inhalt.ncx" media-type="application/x-dtbncx+xml"/>
OPF1
for i in $PAGES; do
      cat <<OPF2 >>$NAME/$DIR/inhalt.opf
     <item id="Datei_$i" href="$i.xhtml" media-type="application/xhtml+xml"/>
OPF2
done
cat <<OPF3 >>$NAME/$DIR/inhalt.opf     
    </manifest>
    <spine toc="ncx">
OPF3
for i in $PAGES; do
cat <<OPF4 >>$NAME/$DIR/inhalt.opf
      <itemref idref="Datei_$i"/>
OPF4
done
cat <<OPF5 >>$NAME/$DIR/inhalt.opf
    </spine>
  </package>
OPF5
cat <<NCX1 >$NAME/$DIR/inhalt.ncx
<?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE ncx
    PUBLIC "-//NISO//DTD ncx 2005-1//EN" "http://www.daisy.org/z3986/2005/ncx-2005-1.dtd">
  <ncx
    xmlns="http://www.daisy.org/z3986/2005/ncx/"
    version="2005-1"
    xml:lang="de-DE">
    <head>
      <meta name="dc:Title" content="Hello World"/>
      <meta name="dtb:uid" content="id_Hello_World"/>
    </head>
    <docTitle>
      <text>Hello World</text>
    </docTitle>
    <navMap>
NCX1
for i in $PAGES; do
cat <<NCXPAGES >>$NAME/$DIR/inhalt.ncx
      <navPoint playOrder="1" id="id_$i">
        <navLabel>
          <text>$i</text>
        </navLabel>
        <content src="$i.xhtml"/>
      </navPoint>
NCXPAGES
done
cat <<NCX2 >>$NAME/$DIR/inhalt.ncx
    </navMap>
  </ncx>
NCX2
for i in $PAGES; do
cat <<XHTML1 >$NAME/$DIR/$i.xhtml
<?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
     "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
      <link rel="schema.DC" href="http://purl.org/dc/elements/1.1/"/>
      <title>$i</title>
      <meta name="DC.identifier" content="id_$i"/>
    </head>
    <body>
XHTML1
cat $DIR/$i | sed -e "s/&/&amp;/g" -e "s/</&lt;/g" -e "s/>/&gt;/g" >>$NAME/$DIR/$i.xhtml
cat <<XHTML2 >>$NAME/$DIR/$i.xhtml
    </body>
  </html>
XHTML2
done
pushd $NAME
zip -Z store -X $NAME.epub mimetype
zip -9 -X -r $NAME.epub META-INF/
zip -9 -X -r $NAME.epub $DIR/
popd
Das Script wird mit 2 Parametern aufgerufen, der erste gibt den Namen (nicht Pfad) des Zieldokumentes an, der zweite das Verzeichnis mit den OCR-Dateien. Es erzeugt dann das Dokument im Verzeichnis /tmp als $NAME.epub

Das Script enthält noch kein Feintuning und die Kapitel entsprechen den Seitenzahlen. Um das erzeugte Epub-Dokument auf Korrektheit zu testen benutze ich den Validator  EPubCheck Version 3.0. Dieser prüft sehr genau und es hat eine Weile gedauert, bis das Script ein nahezu fehlerfreies Dokument erzeugt hat.  Zum Prüfen des erzeugten EPUB einfach folgenden Aufruf verwenden: java -jar epubcheck-x.x.x.jar file.epub

Einen Zwischenstand des Buches gibt es hier: https://www.dropbox.com/s/sf9j53ovg7qku0p/Bunte_Bilder_2013-01-13.epub