-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathwriter.py
113 lines (94 loc) · 3.05 KB
/
writer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import zipfile
from collections import defaultdict, OrderedDict
from container import epubContainer
from publication import epubPackage, epubNav
from contentdocs import contentDocs
import utils
class epubExportOptions:
version = '3.2'
opf_path = 'OEBPS/content'
toc_path = 'OEBPS/nav'
resource_dir = {
'document': 'OEBPS/Text',
'image': 'OEBPS/Images',
'stylesheet': 'OEBPS/Styles',
'font': 'OEBPS/Font',
'script': 'OEBPS/Scripts',
'other': 'OEBPS/Misc'
}
with_ext = True
hash_name = False
encryption = defaultdict(set)
signature = defaultdict(set)
class epubWriter:
def __init__(self):
# global attributes
self.container = epubContainer()
self.packages = OrderedDict()
self.encrypt_key = None
self.sign_key = None
self.options = epubExportOptions()
self.metadata = defaultdict(list)
def add_package(self, package, scheme='', overwrite=False):
if isinstance(package, epubPackage):
uid = package.uid.value
elif isinstance(package, str):
uid = package
package = epubPackage()
else:
return
if uid in self.packages and not overwrite:
return self.packages[uid]
self.packages[uid] = package
if scheme:
package.set_metadata('identifier', uid, {'scheme': scheme})
return package
def load_epub(self, epub, overwrite=False):
rootfiles, decryptor, verifier = epubContainer.load_epub(epub)
assert not decryptor
for rootfile in rootfiles:
package = epubPackage()
package.load_package(epub, rootfile)
package = self.add_package(package, overwrite=overwrite)
def set_encrypt_key(self, key_data, format='PEM', asymm=True, from_cert=False):
if asymm:
key = self.container.encryptor.load_publickey(key_data, format=format, from_cert=from_cert)
else:
key = self.container.encryptor.load_symmkey(key_data, method=format)
self.encrypt_key = key
def set_sign_key(self, pvtkey, format='PEM'):
key = self.container.signer.load_privatekey(key_data, method=format)
self.sign_key = key
def dump_package(self, package):
for uid in package.idmap:
path, fp, mimetype = package.open(uid)
yield uid, path, fp, mimetype
def export_package(self, output):
for package in self.packages:
for data, path, mimetype in package.export(self.options):
if path in self.container.encryption:
data = self.container.encrypt(data, key)
output.writestr(data, path, zipfile.ZIP_DEFLATED)
if __name__ == '__main__':
import sys
writer = epubWriter()
epub = zipfile.ZipFile('childrens-literature.epub', 'r')
writer.load_epub(epub)
print(writer.packages)
epub.close()
sys.exit()
writer = epubWriter()
package = writer.add_package('978123456789', 'isbn')
package.add_document('01.xhtml')
package.add_document('02.xhtml')
package.nav.set_builder(builder)
package.set_title('test book')
package.add_author('test author')
package.add_author('test translater', role='translater')
with open('rsacert.pem', 'rb') as fp:
writer.set_encrypt_key(fp.read(), from_cert=True)
with open('rsakey.pem', 'rb') as fp:
writer.set_sign_key(fp.read())
package.cover = 'cover'
package.version = '3.2'
writer.save('output.epub')