Ich habe einige epub-Dateien in meinem iCloud Drive, die im Wesentlichen Pakete sind. Ich kann Paketinhalte anzeigen und dann zeigt es mir eine Hierarchie von Dateien und Ordnern.
Wie kann ich diese Struktur in ein Standard-epub umwandeln, das jeder normale epub-Reader verstehen wird?
Eine .epub
Datei ist, wie in anderen Antworten erwähnt, im Wesentlichen eine gezippte Datei. Wenn iBooks.epub
die Datei importiert , .epub
ist die darin gespeicherte Datei eine entpackte Datei. Dies erklärt, warum es die Show Package Contents
Option gibt, mit der Sie die "entpackten" Dateien durchsuchen können. Es funktioniert jedoch nicht immer, das Paket einfach zu komprimieren.
.epub
Datei aus dem Paket :.epub
Datei und klicken Sie auf Show Package Contents
.Compress
..zip
. Ändern Sie einfach die Erweiterung von .zip
zu .epub
und voila! Die Datei ist zu einem ePub- Dokument geworden.Ich hatte mehr als 2.000 .epub
Pakete, die ich in .epub
Dateien konvertieren wollte , daher war die obige Methode nicht machbar. Um die manuelle Arbeit zu vermeiden, habe ich ein Skript geschrieben, das im Wesentlichen die obige Methode für alle Dateien ausführt. Ich habe den einfachen und eleganten Shell-Code verwendet , der hier von Matthias bereitgestellt wird, und ihn in ein python
unten geteiltes Skript verpackt:
# Convert epub packages to epub files
import os
import subprocess
filenames = []
path_to_files = ""
# Function to store all filenames in a list
def extract_filename(path_to_files): # "/Users/****/Desktop/Old_epubs"
os.chdir(path_to_files)
books = os.getcwd()
for f in os.listdir(books):
f_name, f_ext = os.path.splitext(f)
if f_ext == ".epub":
filenames.append(f_name)
filenames.sort()
# Function to generate new epub files
def create_epub(path_to_new_files): # "/Users/****/Desktop/new_epubs/"
total_files = len(filenames)
for i in range(total_files):
epub_path = "cd " + path_to_files
filename = filenames[i] + ".epub"
zipping = " zip -X -r " + path_to_new_files + filename + " mimetype *"
plist = "rm iTunesMetadata.plist"
comm = epub_path + filename + "; " + plist + "; " + zipping
p1 = subprocess.run(comm, capture_output = True, text = True, shell = True)
success = p1.returncode
if success == 0:
rem_files = total_files - i + 1
print("File #", i+1, " has been processed successfully. Remaining files: ", rem_files)
# Enter the paths
extract_filename("/Users/****/Desktop/Books") # Path to directory containing epub packages
create_epub("/Users/****/Desktop/new_epubs/") # Path to store new epub files in
Die extract_filename
Funktion führt eine path
in ein Verzeichnis, das die .epub
Pakete enthält , die konvertiert werden müssen. [WARNUNG] Es ist am besten, an einer Kopie der .epub
Pakete zu arbeiten, falls etwas schief geht. Sicherheitshalber einfach die Pakete in ein anderes Verzeichnis kopieren und daran arbeiten.
Die create_epub
Funktion führt path
in ein Verzeichnis, in dem Sie die generierten Dateien speichern möchten. Es führt dann einen shell
Befehl aus, um jedes .epub
Paket zu öffnen und eine .epub
Datei zu generieren .
Hoffe das hilft! Es hat sicherlich ein großes Problem von mir gelöst.
FWIW, hier ist ein Shell-Befehl, der funktioniert:
cd my-broken.epub
# iTunes/Books seems to add a file
# 'iTunesMetadata.plist', and it produces a warning.
# May also contain private data, so better delete it.
rm iTunesMetadata.plist
zip -X -r ../fixed.epub mimetype *
Soweit ich das beurteilen kann, muss die Komprimierung nicht deaktiviert werden ( -0
). epubcheck
hat keine Beschwerden. Es kann jedoch Unterschiede zwischen den Versionen der epub-Spezifikation geben. Mein Test war mit einer epub 3.0-Datei.
iTunesMetadata.plist
?Eine ePub-Datei ist im Grunde nur ein gezippter Ordner, obwohl sie eine Mimetype-Datei enthält, die anscheinend nicht komprimiert werden muss.
Dies würde bedeuten, dass es nicht ganz einfach ist, mit einer einfachen Zip-App neu zu erstellen. Es kann jedoch einfacher sein.
Nehmen wir an, nichts hat es tatsächlich ausgepackt, sondern nur verwirrt darüber, wie man damit umgeht. Arbeite an einer Kopie.
Zwei Dinge zum Ausprobieren...
Versuchen Sie es einfach umzubenennen, ändern Sie .epub in .zip und ändern Sie es dann wieder zurück, um zu sehen, ob es richtig erkannt wird.
Öffnen Sie es in Calibre
Sie haben dann unzählige Möglichkeiten, damit umzugehen, am einfachsten ist es, zu sehen, ob es über OPDS mit Ihrem E-Book-Reader kommunizieren kann. Calibre kann seinen eigenen lokalen Server auf Ihrem WLAN betreiben und Sie können Bücher sehr einfach kopieren.
Wenn Sie immer noch keine Freude haben, lassen Sie Calibre sie [erneut] in ein ePub konvertieren. Dies ist eine großartige Methode, um eine Datei zu reparieren, da sie sie erneut untersuchen, Schriftarten, schlechte Silbentrennungen und alle möglichen Probleme beheben kann.
Calibre selbst ist ein zu großes Thema, um es wirklich in einer einfachen QA zu behandeln, aber es gibt Unmengen von Daten darüber auf der Website selbst und unter http://www.mobileread.com/forums/ , einschließlich Abschnitten für die meisten großen E-Reader .
Reproduktion des Problems:
book.epub
ist beispielsweise eine Datei ( -rw-r--r--
).book.epub
.~/Library/Containers/com.apple.BKAgentService/Data/Documents/iBooks/Books/
, die in einen anderen Namen wie z. B. umbenannt wurde, A22DFAF7E75C21D979C375B1AD07008F.epub
und wird zu einem Verzeichnis ( drwxr-xr-x@
).Schritte der Problemumgehung, die auf meinem Mac funktioniert:
A22DFAF7E75C21D979C375B1AD07008F.epub
von .epub
in .zip
..zip
Datei, sagen wir Archive.zip
..zip
und ändern Sie die Erweiterung wieder in .epub
.Archive.epub
Datei ist eine Datei ( -rw-r--r--
).Ich habe einige der Kommentare hier genommen und ein Jupyter-Notizbuch bereitgestellt , das dies für eine Sicherung von beispielsweise einem Bücherverzeichnis tut:
import pathlib
import glob
import os
import zipfile
# Extract the relevant components of a full path
def pathComponents(fullpath):
path = pathlib.Path(fullpath)
name = path.name
stem = path.stem
suffix = path.suffix
parent = path.parent
return name, stem, suffix, parent
# Get directories in your path that have a .epub suffix
def getePubDirs(path):
epubSearch = os.path.join(path, "*" + "." + "epub")
eDirs=[]
for p in glob.glob(epubSearch):
if (os.path.isdir(p)): # Only if it's an epub directory
eDirs.append(p)
return eDirs
def createZipFile(fname, files):
zFile = zipfile.ZipFile(fname, mode='w', compression=zipfile.ZIP_DEFLATED)
for f in files:
zFile.write(f)
zFile.close()
def convertDirToePub(dirname):
name, stem, suffix, parent = pathComponents(dirname) # get dirname details
newdirname = zFile = str(parent) + "/" + name + ".ori"
zFile = str(parent) + "/" + stem + ".epub"
os.rename(dirname,newdirname) # rename the epub dir so the epub can take its old name
# get all the files within the epub directory
os.chdir(newdirname) # We need to be in directory so the resultant epub paths are correct
everything = [os.path.join(r,file) for r,d,f in os.walk(".") for file in f]
createZipFile(zFile, everything) # Create a zip file containing all those files
os.chdir(parent)
dirtoconvert='/Users/<username>/tmp/Booksdir'
eDirs = getePubDirs(dirtoconvert)
totalDirs=len(eDirs)
print(totalDirs, "docs to convert")
ctr=1
for i in eDirs:
print(ctr, "of", totalDirs, ": Converting ", i)
convertDirToePub(i)
ctr = ctr + 1
print("Done!")
Ich habe die hier freigegebenen Methoden angepasst und das folgende Shell-Skript erstellt.
Es ist ziemlich einfach, da es keine Argumente benötigt, es läuft einfach von dem Verzeichnis aus, in dem es ausgeführt wird.
Das Skript fügt ein fixed
Verzeichnis hinzu, falls noch keines vorhanden ist, in dem es die korrigierten Dateien ablegt.
Sie können es entweder zu einer Datei hinzufügen, dh fix_epub.sh
. .bashrc
Oder fügen Sie es Ihrer /etc.-Datei hinzu .zshrc
, indem Sie es in eine Funktion einschließen. Ich habe Beispiele für jeden unten hinzugefügt.
Dann von Ihrem Terminal cd <epub-path>
zu Ihrem .epub-Ordner und entweder;
touch fix_epub.sh
und Ihren Code zur Datei hinzufügen. sh fix_epub.sh
.fix_epub
(vorausgesetzt, Sie haben es bereits zu hinzugefügt .bashrc
).fix_epub.sh
#!/bin/bash
mkdir -p fixed
find . -name "*.epub" | while read -r file; do
(cd "$file" || exit && \
find . -iname 'iTunesMetadata*.plist' -delete && \
zip -r -X "../fixed/$file" mimetype .)
done
.bashrc
function fix_epub () {
mkdir -p fixed
find . -name "*.epub" | while read -r file; do
(cd "$file" || exit && \
find . -iname 'iTunesMetadata*.plist' -delete && \
zip -r -X "../fixed/$file" mimetype .)
done
}
Ziegel
leuchten
Ziegel
leuchten