[ePub] Stapelverarbeitung: Metadaten in content.opf Dateien ändern

S

Smartass

Gast

Diverse Metadaten in EPUB-Dateien mit Daten aus einer CSV-DB überschreiben


.
Hi Community,

first, um ein allgemeines Verständnis herzustellen:

Eine Epub-Datei besteht aus Teildateien, die in einer (Zip-) Archivdatei mit der Dateinamenserweiterung "epub" zusammengefasst werden. Diese "epub-zips" sind komprimiert:

sd7kzla7.png

Eine dieser Teildateien ist eine content.opf - eine (xml-) Klartext-Datei - Beispiel-Ausschnitt einer Solchen:

HTML:
...
<metadata xmlns ... >
   <dc:publisher>Heyne</dc:publisher>
   <dc:language>de</dc:language>
   <dc:creator opf:role="aut">Name des Autors</dc:creator>
   <meta content="2014-10-14T08:46:42.824000+00:00" name="scriptname:timestamp" />
   <dc:title>Erdlicht</dc:title>
   <meta content="cover" name="cover" />
   <dc:date>2014-06-15T22:00:00+00:00</dc:date>
   <dc:contributor opf:role="bkp"> .... </dc:contributor>
   <dc:identifier id="uuid_id" opf:scheme="uuid">a7e2d546-8964-43df-986f-9d98c2df30c2</dc:identifier>
</metadata>
...

In obigen Beispiel wird z.B. in Zeile 3 die Eigenschaft "publisher" angegeben, welcher der Wert "Heyne" zugewiesen wird.

Nun zu meiner Frage ...

Wie Eingangs bereits angesprochen, möchte ich -unter MS-Windows- innerhalb standardisierter content.opf Dateien die Werte einiger Metadata-Eigenschaften mit (standardisierten) Werten aus einer CSV-Datenbank überschreiben.

M.M.n. klassische Skriptaufgabe - wenn die content.opfs nicht verpackt wären ...
das ist dabei mein prinzipielles Problem ...
was meinen Profis?

Smartass
 
Zuletzt bearbeitet von einem Moderator: (Typo)
Wenn du es ganz billig haben willst, rufst du in deinem Skipt zu erst unzip auf der Konsole auf (oder wie auch immer das unter Windows heißt) und entpackst damit die Datei.
Und wenn du ganz ganz sicher weißt, dass in der content.opfer Datei das "dc:publisher" Tag nur ein einziges Mal vorkommt, könntest du auch einfach mit 'ner simplen String-Suche (oder RegExp) rangehen und nach "<dc:publisher>*</dc:publisher>" suchen und damit dann den Publisher ersetzen.

Eigentlich wäre es natürlich angebracht(er) mit einem XML Parser das Ganze zu erledigen. Aber ich glaube nicht, dass eine Windows .bat Datei sowas kann ^^
 
Hallo benneque,

für den im Eröffnungsbeitrag beschriebenen (weiteren) Bearbeitungsschritt hab ich noch keinerlei Skript in dem ich wie Du schreibst mit unzip arbeiten könnte ... und von der Fähigkeit ein solches Skript erstellen zu können, bin ich weit entfernt.

Es geht auch nur um die Analyse der Problematik ... um die Anforderungen an ein solches Programm möglichst exakt spezifizieren zu können; zwecks Erstellung eines Lastenhefts - eines ohne jegliche Unklarheit.

Dank Dir jedenfalls schon x für das Stichwort -erwähnte Software zum Einlesen und Verarbeiten von XML-Dokumenten- und hab ich Dich richtig verstanden: man kann XML-Parser derart gestalten, das diese auf Dateien innerhalb von (de facto) Zip-Archiven schreibend zugreifen können?

Smartass
 
Zuletzt bearbeitet von einem Moderator: (Typo)
Jein .. Ja .. Nein. Man würde einfach das Zip entpacken, die XML bearbeiten und dann wieder zippen.
Ob das ganze nun im RAM oder auf der Festplatte passiert ist eher nebensächlich, aber das Archiv _muss_ in jedem Fall entpackt werden.
 
Hab sowas geahnt ... dank Dir nochmals für die Bestätigung - btw.- ausgehend von Deinem Beitrag #2 im Thread MVC in einer Webanwendung, erlaube ich mir noch eine Frage:-) ... was wäre Deiner Meinung nach -für die Erstellung eines Programms, das folgenden Programmablauf:

Code:
Start
Erste  ePub entpacken > content.opf oeffnen > Erste  Zeile mit Werten aus CSV auslesen > Werte in OPF-Datei ueberschreiben > ePub packen
Zweite ePub entpacken > content.opf oeffnen > Zweite Zeile mit Werten aus CSV ...
Dritte ePub entpacken > content.opf oeffnen > Dritte Zeile mit ...
...
Stop

erledigt- ohne GUI - in Java geschrieben, an Programmierstunden -also ungefähre Schätzung- zu veranschlagen?

Smartass
 
Zuletzt bearbeitet von einem Moderator: (Typo)
Wenn der Programmierer die Zip, CSV und XML Libs kennt, und man 2-3 Testläufe einrechnet, würde ich auf 10-15 Minuten tippen.
Wenn man die Libs nicht kennt (aber natürlich trotzdem Ahnung von Java hat und Google bedienen kann), vermutlich eher 1 Stunde. Man braucht ja im Groben aus jeder der 3 Libs nur 2-3 Funktionen.
 
Hört sich gut an ... hätte insgesamt 10 Stunden akzeptiert ... jetzt 4

THX - Smartass
 
Das hättest du dir auch aber auch eben selbst ausrechnen können :D

Pseudocode:
Code:
var listeVonEPubDateien;

for(EPubDatei IN listeVonEPubDateien) {
  unzip(EPubDatei);
  XML.open(content.opf);
  XML.elementSuchen("dc:publisher").inhaltErsetzen(wertAusCSV);
  XML.save(content.opf);
  zip(EPubDatei);
}

Viel mehr kann es im Endeffekt ja nicht sein ;)
 
Tscha, da staunt der Laie ... allerdings fehlt da natürlich noch die Anleitung wie man Pfade korrekt in Java-Quellcode schreibt ... uuund wie man das Ganze in Java-Bytecode transformiert :-D

Nein ernsthaft, fettes THX - denn allein mit Deinem Programmcode dürften sich die Programmierstunden wiederum ein Weiteres x zumindest halbiert haben ... -btw.- akzeptierst Du Private Nachrichten?

Smartass
 
Das ist kein Programm code, das ist Pseudocode. Quasi Code in menschlicher Sprache, um grob zu veranschaulichen, welche Schritte zu tun sind. Der Compiler dafür muss erst noch erfunden werden ;)

Willst du das Programm nun selbst schreiben?

Falls ja:
0. Fang klein an!
1. Lies erst mal nur die CSV Datei ein und lass dir die Daten auf der Konsole ausgeben, die du dort auslesen willst.
2. Öffne in einer Schleife einfach mal alle ePub Dateien, die geöffnet werden sollen
3. Unzip eine einzelne ePub Datei und finde die enthaltene content.opf
4. Mach irgendwas mit der content.opf (z.B. den Inhalt löschen - Hauptsache irgend eine Veränderung) und zippe sie wieder (danach Resultat mit WinZip oder so überprüfen)
5. XML Reader: Öffne mit einem XML Reader die content.opf
6. Finde mit dem XML Reader die entsprechenden XML Elemente, die du bearbeiten willst (und versuch den Inhalt des XML zu ändern)
7. Schreibe die modifizierte XML Datei
8. Kombiniere Schleife + Unzip + Open XML + Edit XML + Write XML + Zip

Und zum Schluss musst du nur noch die CSV mit ins Spiel bringen (aber das ist der einfachste Part ;) )


Für ganz simple Anleitungen kann ich die Seite von Mkyong empfehlen. Hier z.B. was für CSV: http://www.mkyong.com/java/how-to-read-and-parse-csv-file-in-java/
Alternativ kannst du (wenn du weißt wie man externe Librarys einbindet) dafür natürlich auch eine entsprechende Library benutzen. Z.B. http://opencsv.sourceforge.net/
OpenCSV kann zwar nicht viel, aber für deine Zwecke sollte es mehr als ausreichend sein.
 
Zuletzt bearbeitet:
man darf ein entpacktes epub nicht einfach wieder zippen, dass funktionier zwar aber dann wird das Buch nicht mehr als Buch erkannt.

Mit ZIP.EXE das EPUB zippen

Kopieren Sie zunächst ZIP.EXE in den entpackten Ordner Ihrer EPUB-Datei.
Erstellen Sie ebenfalls in diesem Ordner eine Batchdatei mit folgendem

Inhalt:
rm meinbuch2.epub
zip –0X meinbuch2.epub mimetype
zip -Xr9D meinbuch2.epub META-INF/*
zip -Xr9D meinbuch2.epub opf/*

Die erste Zeile dient dazu, eine eventuell vorhandene EPUB-Datei zu löschen.
Mit Zeile 2 wird die Datei mimetype an den Anfang des ZIP-Archivs
gesetzt (dies schreibt die EPUB-Spezifikation vor). Die weiteren Zeilen zippen
die Ordner META-INF und opf in das neue EPUB-File.

In allen drei ZIP-Befehlen werden Dateiattribute gesetzt. Ohne diese Attribute
würde die ZIP-Datei nicht als EPUB akzeptiert werden. Deshalb müssen
Sie die EPUB-Datei auf diesem Wege packen. Ein herkömmliches ZIPProgramm
mit grafischer Oberfläche hat diese Möglichkeiten nicht.
 
Zurück
Oben