PyMuPDF 1.26.6__cp310-abi3-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fitz/__init__.py +13 -0
- fitz/table.py +2 -0
- fitz/utils.py +2 -0
- pymupdf/__init__.py +25899 -0
- pymupdf/__main__.py +1140 -0
- pymupdf/_apply_pages.py +253 -0
- pymupdf/_build.py +8 -0
- pymupdf/_extra.pyd +0 -0
- pymupdf/_mupdf.pyd +0 -0
- pymupdf/_wxcolors.py +562 -0
- pymupdf/extra.py +220 -0
- pymupdf/mupdf-devel/include/mupdf/classes.h +19999 -0
- pymupdf/mupdf-devel/include/mupdf/classes2.h +12244 -0
- pymupdf/mupdf-devel/include/mupdf/exceptions.h +118 -0
- pymupdf/mupdf-devel/include/mupdf/extra.h +189 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/archive.h +444 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/band-writer.h +117 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/barcode.h +138 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/bidi.h +90 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/bitmap.h +188 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/buffer.h +250 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/color.h +433 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/compress.h +132 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/compressed-buffer.h +194 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/config.h +302 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/context.h +1064 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/crypt.h +270 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/deskew.h +46 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/device.h +652 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/display-list.h +142 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/document.h +1103 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/export.h +52 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/filter.h +269 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/font.h +858 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/geometry.h +885 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/getopt.h +134 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/glyph-cache.h +96 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/glyph.h +81 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/hash.h +126 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/heap-imp.h +190 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/heap.h +143 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/image.h +451 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/json.h +98 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/link.h +130 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/log.h +61 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/outline.h +254 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/output-svg.h +64 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/output.h +448 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/path.h +477 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/pixmap.h +516 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/pool.h +102 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/separation.h +138 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/shade.h +233 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/store.h +465 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/story-writer.h +209 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/story.h +232 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/stream.h +646 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/string-util.h +335 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/structured-text.h +924 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/system.h +495 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/text.h +210 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/track-usage.h +57 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/transition.h +76 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/tree.h +62 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/types.h +41 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/util.h +159 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/version.h +31 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/write-pixmap.h +507 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/writer.h +269 -0
- pymupdf/mupdf-devel/include/mupdf/fitz/xml.h +435 -0
- pymupdf/mupdf-devel/include/mupdf/fitz.h +101 -0
- pymupdf/mupdf-devel/include/mupdf/functions.h +13819 -0
- pymupdf/mupdf-devel/include/mupdf/helpers/mu-office-lib.h +666 -0
- pymupdf/mupdf-devel/include/mupdf/helpers/mu-threads.h +280 -0
- pymupdf/mupdf-devel/include/mupdf/helpers/pkcs7-openssl.h +48 -0
- pymupdf/mupdf-devel/include/mupdf/html.h +53 -0
- pymupdf/mupdf-devel/include/mupdf/internal.h +29 -0
- pymupdf/mupdf-devel/include/mupdf/memento.h +425 -0
- pymupdf/mupdf-devel/include/mupdf/pdf/annot.h +1015 -0
- pymupdf/mupdf-devel/include/mupdf/pdf/clean.h +68 -0
- pymupdf/mupdf-devel/include/mupdf/pdf/cmap.h +145 -0
- pymupdf/mupdf-devel/include/mupdf/pdf/crypt.h +108 -0
- pymupdf/mupdf-devel/include/mupdf/pdf/document.h +902 -0
- pymupdf/mupdf-devel/include/mupdf/pdf/event.h +167 -0
- pymupdf/mupdf-devel/include/mupdf/pdf/font.h +168 -0
- pymupdf/mupdf-devel/include/mupdf/pdf/form.h +381 -0
- pymupdf/mupdf-devel/include/mupdf/pdf/image-rewriter.h +78 -0
- pymupdf/mupdf-devel/include/mupdf/pdf/interpret.h +518 -0
- pymupdf/mupdf-devel/include/mupdf/pdf/javascript.h +43 -0
- pymupdf/mupdf-devel/include/mupdf/pdf/name-table.h +621 -0
- pymupdf/mupdf-devel/include/mupdf/pdf/object.h +445 -0
- pymupdf/mupdf-devel/include/mupdf/pdf/page.h +327 -0
- pymupdf/mupdf-devel/include/mupdf/pdf/parse.h +61 -0
- pymupdf/mupdf-devel/include/mupdf/pdf/recolor.h +49 -0
- pymupdf/mupdf-devel/include/mupdf/pdf/resource.h +144 -0
- pymupdf/mupdf-devel/include/mupdf/pdf/xref.h +300 -0
- pymupdf/mupdf-devel/include/mupdf/pdf/zugferd.h +49 -0
- pymupdf/mupdf-devel/include/mupdf/pdf.h +59 -0
- pymupdf/mupdf-devel/include/mupdf/ucdn.h +464 -0
- pymupdf/mupdf-devel/lib/libmuthreads.lib +0 -0
- pymupdf/mupdf-devel/lib/mupdfcpp64.lib +0 -0
- pymupdf/mupdf.py +63667 -0
- pymupdf/mupdfcpp64.dll +0 -0
- pymupdf/pymupdf.py +2 -0
- pymupdf/table.py +2697 -0
- pymupdf/utils.py +1169 -0
- pymupdf-1.26.6.dist-info/COPYING +1 -0
- pymupdf-1.26.6.dist-info/METADATA +83 -0
- pymupdf-1.26.6.dist-info/README.md +60 -0
- pymupdf-1.26.6.dist-info/RECORD +112 -0
- pymupdf-1.26.6.dist-info/WHEEL +4 -0
- pymupdf-1.26.6.dist-info/entry_points.txt +3 -0
pymupdf/_apply_pages.py
ADDED
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import multiprocessing
|
|
2
|
+
import os
|
|
3
|
+
import time
|
|
4
|
+
|
|
5
|
+
import pymupdf
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# Support for concurrent processing of document pages.
|
|
9
|
+
#
|
|
10
|
+
|
|
11
|
+
class _worker_State:
|
|
12
|
+
pass
|
|
13
|
+
_worker_state = _worker_State()
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _worker_init(
|
|
17
|
+
path,
|
|
18
|
+
initfn,
|
|
19
|
+
initfn_args,
|
|
20
|
+
initfn_kwargs,
|
|
21
|
+
pagefn,
|
|
22
|
+
pagefn_args,
|
|
23
|
+
pagefn_kwargs,
|
|
24
|
+
stats,
|
|
25
|
+
):
|
|
26
|
+
# pylint: disable=attribute-defined-outside-init
|
|
27
|
+
_worker_state.path = path
|
|
28
|
+
_worker_state.pagefn = pagefn
|
|
29
|
+
_worker_state.pagefn_args = pagefn_args
|
|
30
|
+
_worker_state.pagefn_kwargs = pagefn_kwargs
|
|
31
|
+
_worker_state.stats = stats
|
|
32
|
+
_worker_state.document = None
|
|
33
|
+
if initfn:
|
|
34
|
+
initfn(*initfn_args, **initfn_kwargs)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _stats_write(t, label):
|
|
38
|
+
t = time.time() - t
|
|
39
|
+
if t >= 10:
|
|
40
|
+
pymupdf.log(f'{os.getpid()=}: {t:2f}s: {label}.')
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _worker_fn(page_number):
|
|
44
|
+
# Create Document from filename if we haven't already done so.
|
|
45
|
+
if not _worker_state.document:
|
|
46
|
+
if _worker_state.stats:
|
|
47
|
+
t = time.time()
|
|
48
|
+
_worker_state.document = pymupdf.Document(_worker_state.path) # pylint: disable=attribute-defined-outside-init
|
|
49
|
+
if _worker_state.stats:
|
|
50
|
+
_stats_write(t, 'pymupdf.Document()')
|
|
51
|
+
|
|
52
|
+
if _worker_state.stats:
|
|
53
|
+
t = time.time()
|
|
54
|
+
page = _worker_state.document[page_number]
|
|
55
|
+
if _worker_state.stats:
|
|
56
|
+
_stats_write(t, '_worker_state.document[page_number]')
|
|
57
|
+
|
|
58
|
+
if _worker_state.stats:
|
|
59
|
+
t = time.time()
|
|
60
|
+
ret = _worker_state.pagefn(
|
|
61
|
+
page,
|
|
62
|
+
*_worker_state.pagefn_args,
|
|
63
|
+
**_worker_state.pagefn_kwargs,
|
|
64
|
+
)
|
|
65
|
+
if _worker_state.stats:
|
|
66
|
+
_stats_write(t, '_worker_state.pagefn()')
|
|
67
|
+
|
|
68
|
+
return ret
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _multiprocessing(
|
|
72
|
+
path,
|
|
73
|
+
pages,
|
|
74
|
+
pagefn,
|
|
75
|
+
pagefn_args,
|
|
76
|
+
pagefn_kwargs,
|
|
77
|
+
initfn,
|
|
78
|
+
initfn_args,
|
|
79
|
+
initfn_kwargs,
|
|
80
|
+
concurrency,
|
|
81
|
+
stats,
|
|
82
|
+
):
|
|
83
|
+
#print(f'_worker_mp(): {concurrency=}', flush=1)
|
|
84
|
+
with multiprocessing.Pool(
|
|
85
|
+
concurrency,
|
|
86
|
+
_worker_init,
|
|
87
|
+
(
|
|
88
|
+
path,
|
|
89
|
+
initfn, initfn_args, initfn_kwargs,
|
|
90
|
+
pagefn, pagefn_args, pagefn_kwargs,
|
|
91
|
+
stats,
|
|
92
|
+
),
|
|
93
|
+
) as pool:
|
|
94
|
+
result = pool.map_async(_worker_fn, pages)
|
|
95
|
+
return result.get()
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _fork(
|
|
99
|
+
path,
|
|
100
|
+
pages,
|
|
101
|
+
pagefn,
|
|
102
|
+
pagefn_args,
|
|
103
|
+
pagefn_kwargs,
|
|
104
|
+
initfn,
|
|
105
|
+
initfn_args,
|
|
106
|
+
initfn_kwargs,
|
|
107
|
+
concurrency,
|
|
108
|
+
stats,
|
|
109
|
+
):
|
|
110
|
+
verbose = 0
|
|
111
|
+
if concurrency is None:
|
|
112
|
+
concurrency = multiprocessing.cpu_count()
|
|
113
|
+
# We write page numbers to `queue_down` and read `(page_num, text)` from
|
|
114
|
+
# `queue_up`. Workers each repeatedly read the next available page number
|
|
115
|
+
# from `queue_down`, extract the text and write it onto `queue_up`.
|
|
116
|
+
#
|
|
117
|
+
# This is better than pre-allocating a subset of pages to each worker
|
|
118
|
+
# because it ensures there will never be idle workers until we are near the
|
|
119
|
+
# end with fewer pages left than workers.
|
|
120
|
+
#
|
|
121
|
+
queue_down = multiprocessing.Queue()
|
|
122
|
+
queue_up = multiprocessing.Queue()
|
|
123
|
+
def childfn():
|
|
124
|
+
document = None
|
|
125
|
+
if verbose:
|
|
126
|
+
pymupdf.log(f'{os.getpid()=}: {initfn=} {initfn_args=}')
|
|
127
|
+
_worker_init(
|
|
128
|
+
path,
|
|
129
|
+
initfn,
|
|
130
|
+
initfn_args,
|
|
131
|
+
initfn_kwargs,
|
|
132
|
+
pagefn,
|
|
133
|
+
pagefn_args,
|
|
134
|
+
pagefn_kwargs,
|
|
135
|
+
stats,
|
|
136
|
+
)
|
|
137
|
+
while 1:
|
|
138
|
+
if verbose:
|
|
139
|
+
pymupdf.log(f'{os.getpid()=}: calling get().')
|
|
140
|
+
page_num = queue_down.get()
|
|
141
|
+
if verbose:
|
|
142
|
+
pymupdf.log(f'{os.getpid()=}: {page_num=}.')
|
|
143
|
+
if page_num is None:
|
|
144
|
+
break
|
|
145
|
+
try:
|
|
146
|
+
if not document:
|
|
147
|
+
if stats:
|
|
148
|
+
t = time.time()
|
|
149
|
+
document = pymupdf.Document(path)
|
|
150
|
+
if stats:
|
|
151
|
+
_stats_write(t, 'pymupdf.Document(path)')
|
|
152
|
+
|
|
153
|
+
if stats:
|
|
154
|
+
t = time.time()
|
|
155
|
+
page = document[page_num]
|
|
156
|
+
if stats:
|
|
157
|
+
_stats_write(t, 'document[page_num]')
|
|
158
|
+
|
|
159
|
+
if verbose:
|
|
160
|
+
pymupdf.log(f'{os.getpid()=}: {_worker_state=}')
|
|
161
|
+
|
|
162
|
+
if stats:
|
|
163
|
+
t = time.time()
|
|
164
|
+
ret = pagefn(
|
|
165
|
+
page,
|
|
166
|
+
*_worker_state.pagefn_args,
|
|
167
|
+
**_worker_state.pagefn_kwargs,
|
|
168
|
+
)
|
|
169
|
+
if stats:
|
|
170
|
+
_stats_write(t, f'{page_num=} pagefn()')
|
|
171
|
+
except Exception as e:
|
|
172
|
+
if verbose: pymupdf.log(f'{os.getpid()=}: exception {e=}')
|
|
173
|
+
ret = e
|
|
174
|
+
if verbose:
|
|
175
|
+
pymupdf.log(f'{os.getpid()=}: sending {page_num=} {ret=}')
|
|
176
|
+
|
|
177
|
+
queue_up.put( (page_num, ret) )
|
|
178
|
+
|
|
179
|
+
error = None
|
|
180
|
+
|
|
181
|
+
pids = list()
|
|
182
|
+
try:
|
|
183
|
+
# Start child processes.
|
|
184
|
+
if stats:
|
|
185
|
+
t = time.time()
|
|
186
|
+
for i in range(concurrency):
|
|
187
|
+
p = os.fork() # pylint: disable=no-member
|
|
188
|
+
if p == 0:
|
|
189
|
+
# Child process.
|
|
190
|
+
try:
|
|
191
|
+
try:
|
|
192
|
+
childfn()
|
|
193
|
+
except Exception as e:
|
|
194
|
+
pymupdf.log(f'{os.getpid()=}: childfn() => {e=}')
|
|
195
|
+
raise
|
|
196
|
+
finally:
|
|
197
|
+
if verbose:
|
|
198
|
+
pymupdf.log(f'{os.getpid()=}: calling os._exit(0)')
|
|
199
|
+
os._exit(0)
|
|
200
|
+
pids.append(p)
|
|
201
|
+
if stats:
|
|
202
|
+
_stats_write(t, 'create child processes')
|
|
203
|
+
|
|
204
|
+
# Send page numbers.
|
|
205
|
+
if stats:
|
|
206
|
+
t = time.time()
|
|
207
|
+
if verbose:
|
|
208
|
+
pymupdf.log(f'Sending page numbers.')
|
|
209
|
+
for page_num in range(len(pages)):
|
|
210
|
+
queue_down.put(page_num)
|
|
211
|
+
if stats:
|
|
212
|
+
_stats_write(t, 'Send page numbers')
|
|
213
|
+
|
|
214
|
+
# Collect results. We give up if any worker sends an exception instead
|
|
215
|
+
# of text, but this hasn't been tested.
|
|
216
|
+
ret = [None] * len(pages)
|
|
217
|
+
for i in range(len(pages)):
|
|
218
|
+
page_num, text = queue_up.get()
|
|
219
|
+
if verbose:
|
|
220
|
+
pymupdf.log(f'{page_num=} {len(text)=}')
|
|
221
|
+
assert ret[page_num] is None
|
|
222
|
+
if isinstance(text, Exception):
|
|
223
|
+
if not error:
|
|
224
|
+
error = text
|
|
225
|
+
break
|
|
226
|
+
ret[page_num] = text
|
|
227
|
+
|
|
228
|
+
# Close queue. This should cause exception in workers and terminate
|
|
229
|
+
# them, but on macos-arm64 this does not seem to happen, so we also
|
|
230
|
+
# send None, which makes workers terminate.
|
|
231
|
+
for i in range(concurrency):
|
|
232
|
+
queue_down.put(None)
|
|
233
|
+
if verbose: pymupdf.log(f'Closing queues.')
|
|
234
|
+
queue_down.close()
|
|
235
|
+
|
|
236
|
+
if error:
|
|
237
|
+
raise error
|
|
238
|
+
if verbose:
|
|
239
|
+
pymupdf.log(f'After concurrent, returning {len(ret)=}')
|
|
240
|
+
return ret
|
|
241
|
+
|
|
242
|
+
finally:
|
|
243
|
+
# Join all child processes.
|
|
244
|
+
if stats:
|
|
245
|
+
t = time.time()
|
|
246
|
+
for pid in pids:
|
|
247
|
+
if verbose:
|
|
248
|
+
pymupdf.log(f'waiting for {pid=}.')
|
|
249
|
+
e = os.waitpid(pid, 0)
|
|
250
|
+
if verbose:
|
|
251
|
+
pymupdf.log(f'{pid=} => {e=}')
|
|
252
|
+
if stats:
|
|
253
|
+
_stats_write(t, 'Join all child proceses')
|
pymupdf/_build.py
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
mupdf_location = 'https://mupdf.com/downloads/archive/mupdf-1.26.11-source.tar.gz'
|
|
2
|
+
pymupdf_version = '1.26.6'
|
|
3
|
+
pymupdf_version_tuple = (1, 26, 6)
|
|
4
|
+
pymupdf_git_sha = ''
|
|
5
|
+
pymupdf_git_diff = ''
|
|
6
|
+
pymupdf_git_branch = 'main'
|
|
7
|
+
swig_version = '4.4.0'
|
|
8
|
+
swig_version_tuple = (4, 4, 0)
|
pymupdf/_extra.pyd
ADDED
|
Binary file
|
pymupdf/_mupdf.pyd
ADDED
|
Binary file
|