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.
Files changed (112) hide show
  1. fitz/__init__.py +13 -0
  2. fitz/table.py +2 -0
  3. fitz/utils.py +2 -0
  4. pymupdf/__init__.py +25899 -0
  5. pymupdf/__main__.py +1140 -0
  6. pymupdf/_apply_pages.py +253 -0
  7. pymupdf/_build.py +8 -0
  8. pymupdf/_extra.pyd +0 -0
  9. pymupdf/_mupdf.pyd +0 -0
  10. pymupdf/_wxcolors.py +562 -0
  11. pymupdf/extra.py +220 -0
  12. pymupdf/mupdf-devel/include/mupdf/classes.h +19999 -0
  13. pymupdf/mupdf-devel/include/mupdf/classes2.h +12244 -0
  14. pymupdf/mupdf-devel/include/mupdf/exceptions.h +118 -0
  15. pymupdf/mupdf-devel/include/mupdf/extra.h +189 -0
  16. pymupdf/mupdf-devel/include/mupdf/fitz/archive.h +444 -0
  17. pymupdf/mupdf-devel/include/mupdf/fitz/band-writer.h +117 -0
  18. pymupdf/mupdf-devel/include/mupdf/fitz/barcode.h +138 -0
  19. pymupdf/mupdf-devel/include/mupdf/fitz/bidi.h +90 -0
  20. pymupdf/mupdf-devel/include/mupdf/fitz/bitmap.h +188 -0
  21. pymupdf/mupdf-devel/include/mupdf/fitz/buffer.h +250 -0
  22. pymupdf/mupdf-devel/include/mupdf/fitz/color.h +433 -0
  23. pymupdf/mupdf-devel/include/mupdf/fitz/compress.h +132 -0
  24. pymupdf/mupdf-devel/include/mupdf/fitz/compressed-buffer.h +194 -0
  25. pymupdf/mupdf-devel/include/mupdf/fitz/config.h +302 -0
  26. pymupdf/mupdf-devel/include/mupdf/fitz/context.h +1064 -0
  27. pymupdf/mupdf-devel/include/mupdf/fitz/crypt.h +270 -0
  28. pymupdf/mupdf-devel/include/mupdf/fitz/deskew.h +46 -0
  29. pymupdf/mupdf-devel/include/mupdf/fitz/device.h +652 -0
  30. pymupdf/mupdf-devel/include/mupdf/fitz/display-list.h +142 -0
  31. pymupdf/mupdf-devel/include/mupdf/fitz/document.h +1103 -0
  32. pymupdf/mupdf-devel/include/mupdf/fitz/export.h +52 -0
  33. pymupdf/mupdf-devel/include/mupdf/fitz/filter.h +269 -0
  34. pymupdf/mupdf-devel/include/mupdf/fitz/font.h +858 -0
  35. pymupdf/mupdf-devel/include/mupdf/fitz/geometry.h +885 -0
  36. pymupdf/mupdf-devel/include/mupdf/fitz/getopt.h +134 -0
  37. pymupdf/mupdf-devel/include/mupdf/fitz/glyph-cache.h +96 -0
  38. pymupdf/mupdf-devel/include/mupdf/fitz/glyph.h +81 -0
  39. pymupdf/mupdf-devel/include/mupdf/fitz/hash.h +126 -0
  40. pymupdf/mupdf-devel/include/mupdf/fitz/heap-imp.h +190 -0
  41. pymupdf/mupdf-devel/include/mupdf/fitz/heap.h +143 -0
  42. pymupdf/mupdf-devel/include/mupdf/fitz/image.h +451 -0
  43. pymupdf/mupdf-devel/include/mupdf/fitz/json.h +98 -0
  44. pymupdf/mupdf-devel/include/mupdf/fitz/link.h +130 -0
  45. pymupdf/mupdf-devel/include/mupdf/fitz/log.h +61 -0
  46. pymupdf/mupdf-devel/include/mupdf/fitz/outline.h +254 -0
  47. pymupdf/mupdf-devel/include/mupdf/fitz/output-svg.h +64 -0
  48. pymupdf/mupdf-devel/include/mupdf/fitz/output.h +448 -0
  49. pymupdf/mupdf-devel/include/mupdf/fitz/path.h +477 -0
  50. pymupdf/mupdf-devel/include/mupdf/fitz/pixmap.h +516 -0
  51. pymupdf/mupdf-devel/include/mupdf/fitz/pool.h +102 -0
  52. pymupdf/mupdf-devel/include/mupdf/fitz/separation.h +138 -0
  53. pymupdf/mupdf-devel/include/mupdf/fitz/shade.h +233 -0
  54. pymupdf/mupdf-devel/include/mupdf/fitz/store.h +465 -0
  55. pymupdf/mupdf-devel/include/mupdf/fitz/story-writer.h +209 -0
  56. pymupdf/mupdf-devel/include/mupdf/fitz/story.h +232 -0
  57. pymupdf/mupdf-devel/include/mupdf/fitz/stream.h +646 -0
  58. pymupdf/mupdf-devel/include/mupdf/fitz/string-util.h +335 -0
  59. pymupdf/mupdf-devel/include/mupdf/fitz/structured-text.h +924 -0
  60. pymupdf/mupdf-devel/include/mupdf/fitz/system.h +495 -0
  61. pymupdf/mupdf-devel/include/mupdf/fitz/text.h +210 -0
  62. pymupdf/mupdf-devel/include/mupdf/fitz/track-usage.h +57 -0
  63. pymupdf/mupdf-devel/include/mupdf/fitz/transition.h +76 -0
  64. pymupdf/mupdf-devel/include/mupdf/fitz/tree.h +62 -0
  65. pymupdf/mupdf-devel/include/mupdf/fitz/types.h +41 -0
  66. pymupdf/mupdf-devel/include/mupdf/fitz/util.h +159 -0
  67. pymupdf/mupdf-devel/include/mupdf/fitz/version.h +31 -0
  68. pymupdf/mupdf-devel/include/mupdf/fitz/write-pixmap.h +507 -0
  69. pymupdf/mupdf-devel/include/mupdf/fitz/writer.h +269 -0
  70. pymupdf/mupdf-devel/include/mupdf/fitz/xml.h +435 -0
  71. pymupdf/mupdf-devel/include/mupdf/fitz.h +101 -0
  72. pymupdf/mupdf-devel/include/mupdf/functions.h +13819 -0
  73. pymupdf/mupdf-devel/include/mupdf/helpers/mu-office-lib.h +666 -0
  74. pymupdf/mupdf-devel/include/mupdf/helpers/mu-threads.h +280 -0
  75. pymupdf/mupdf-devel/include/mupdf/helpers/pkcs7-openssl.h +48 -0
  76. pymupdf/mupdf-devel/include/mupdf/html.h +53 -0
  77. pymupdf/mupdf-devel/include/mupdf/internal.h +29 -0
  78. pymupdf/mupdf-devel/include/mupdf/memento.h +425 -0
  79. pymupdf/mupdf-devel/include/mupdf/pdf/annot.h +1015 -0
  80. pymupdf/mupdf-devel/include/mupdf/pdf/clean.h +68 -0
  81. pymupdf/mupdf-devel/include/mupdf/pdf/cmap.h +145 -0
  82. pymupdf/mupdf-devel/include/mupdf/pdf/crypt.h +108 -0
  83. pymupdf/mupdf-devel/include/mupdf/pdf/document.h +902 -0
  84. pymupdf/mupdf-devel/include/mupdf/pdf/event.h +167 -0
  85. pymupdf/mupdf-devel/include/mupdf/pdf/font.h +168 -0
  86. pymupdf/mupdf-devel/include/mupdf/pdf/form.h +381 -0
  87. pymupdf/mupdf-devel/include/mupdf/pdf/image-rewriter.h +78 -0
  88. pymupdf/mupdf-devel/include/mupdf/pdf/interpret.h +518 -0
  89. pymupdf/mupdf-devel/include/mupdf/pdf/javascript.h +43 -0
  90. pymupdf/mupdf-devel/include/mupdf/pdf/name-table.h +621 -0
  91. pymupdf/mupdf-devel/include/mupdf/pdf/object.h +445 -0
  92. pymupdf/mupdf-devel/include/mupdf/pdf/page.h +327 -0
  93. pymupdf/mupdf-devel/include/mupdf/pdf/parse.h +61 -0
  94. pymupdf/mupdf-devel/include/mupdf/pdf/recolor.h +49 -0
  95. pymupdf/mupdf-devel/include/mupdf/pdf/resource.h +144 -0
  96. pymupdf/mupdf-devel/include/mupdf/pdf/xref.h +300 -0
  97. pymupdf/mupdf-devel/include/mupdf/pdf/zugferd.h +49 -0
  98. pymupdf/mupdf-devel/include/mupdf/pdf.h +59 -0
  99. pymupdf/mupdf-devel/include/mupdf/ucdn.h +464 -0
  100. pymupdf/mupdf-devel/lib/libmuthreads.lib +0 -0
  101. pymupdf/mupdf-devel/lib/mupdfcpp64.lib +0 -0
  102. pymupdf/mupdf.py +63667 -0
  103. pymupdf/mupdfcpp64.dll +0 -0
  104. pymupdf/pymupdf.py +2 -0
  105. pymupdf/table.py +2697 -0
  106. pymupdf/utils.py +1169 -0
  107. pymupdf-1.26.6.dist-info/COPYING +1 -0
  108. pymupdf-1.26.6.dist-info/METADATA +83 -0
  109. pymupdf-1.26.6.dist-info/README.md +60 -0
  110. pymupdf-1.26.6.dist-info/RECORD +112 -0
  111. pymupdf-1.26.6.dist-info/WHEEL +4 -0
  112. pymupdf-1.26.6.dist-info/entry_points.txt +3 -0
@@ -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