Repository navigation
Expand file tree
/
Copy pathindexify.py
More file actions
160 lines (131 loc) · 4.21 KB
/
Copy pathindexify.py
File metadata and controls
160 lines (131 loc) · 4.21 KB
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
from indexifyObjects import Bookmark, Index, Info
import datetime as dt
import subprocess as sp
# test = Bookmark("Test1", 20, 2)
# test2 = Bookmark("Test2", 29, 1)
# test3 = Bookmark("Test2", 21, 1)
# index = Index((test, test2))
# # print(test)
# # print(test2)
# # print(index)
# print(repr(index))
# index.add_entry(test3)
# print(repr(index))
# print(index)
# todo:
# [ ] generate info file
def gen_inf_file(filename):
"""
receives name or path of PDF file and generates a .inf file
"""
if filename.endswith(".pdf"):
sp.run(
[
"pdftk",
filename,
"dump_data",
"output",
filename.removesuffix(".pdf") + ".inf",
]
)
else:
sp.run(["pdftk", filename + ".pdf", "dump_data", "output", filename + ".inf"])
# [ ] write files
# [V] read info file
def read_inf_file(filename):
"""
Read .inf file
Receive name of input file, returns:
- info_full: string containing all text
- info_lines: list containing text line by line
- index_lines: list containing only the index line by line
- index_start, index_end: position of the begining and end of index in info_lines
"""
with open(filename + ".inf") as inf_file:
info_full = inf_file.read()
info_lines = info_full.split("\n")
index_lines = []
# get only the index lines
if "BookmarkBegin" in info_lines:
index_start = info_lines.index("BookmarkBegin")
index_end = index_start
while info_lines[index_end].startswith("Bookmark"):
index_lines.append(info_lines[index_end])
index_end += 1
else:
# index_start = info_lines.index("NumberOfPages")
# index_end = index_start + 1
index_end = info_lines.index("PageMediaBegin")
index_start = index_end - 1
return Info(
filename.removesuffix(".pdf"),
info_full,
info_lines,
index_lines,
index_start,
index_end,
)
# [V] parse index
def parse_index(raw_index):
"""
Receives an index in the form of a list of strings
and returns an Index object
"""
index = Index()
for i in range(0, len(raw_index), 4):
title = raw_index[i + 1].removeprefix("BookmarkTitle: ")
level = int(raw_index[i + 2].removeprefix("BookmarkLevel: "))
page = int(raw_index[i + 3].removeprefix("BookmarkPageNumber: "))
# print(f"{title} {page} {level}")
entry = Bookmark(title, page, level)
# print(entry)
index.append(entry)
# print(index)
return index
# [ ] update info - - done as methods of Info
# [ ] write index to info file and generate pdf
def write_inf(info):
"""
receives an Info object.
generates a timestamped name[time].inf file and
a name_indexified.pdf file with the info.
"""
time = dt.datetime.now()
ctime = str(time.replace(microsecond=0).isoformat())
filename = info.name + "_" + ctime + ".inf"
print(filename)
with open(filename, "w") as inf_file:
inf_file.write(info.full)
pdf_name = (
info.name.removesuffix(".pdf").removesuffix("_indexified") + "_indexified.pdf"
)
print("pdf_name=", pdf_name)
sp.run(["pdftk", info.name + ".pdf", "update_info", filename, "output", pdf_name])
# pdf_file = pdf_name.removesuffix(".pdf") + ".pdf" # adds .pdf if it is missing
# new_name = (
# pdf_name.removesuffix(".pdf").removesuffix("_indexified") + "_indexified.pdf")
# if pdf_name.endswith(".pdf"):
# pdf_file = pdf_name
# new_name = pdf_name.removesuffix(".pdf") + "_indexified.pdf"
# else:
# pdf_file = pdf_name + ".pdf"
# new_name - pdf_name + "_indexified.pdf"
filename = "test"
gen_inf_file(filename)
info = read_inf_file(filename)
# print(test.index_start)
# print(*test.index_lines, sep="\n")
# print(test)
# clean index
index = parse_index(info.index_lines)
test_entry = Bookmark("Hello", 1, 1)
test_entry2 = Bookmark("world", 1, 2)
index.add_entry(test_entry)
index.add_entry(test_entry2)
# print(str(index))
info.update(index)
print(info.name)
write_inf(info)
# [ ] implement UI for additions to index
# [ ] clean temp files
# [ ] make manual adjustments