PyMuPDF 1.25.0__tar.gz → 1.25.1__tar.gz

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 (245) hide show
  1. {pymupdf-1.25.0 → pymupdf-1.25.1}/PKG-INFO +1 -1
  2. {pymupdf-1.25.0 → pymupdf-1.25.1}/changes.txt +10 -0
  3. {pymupdf-1.25.0 → pymupdf-1.25.1}/pipcl.py +44 -0
  4. {pymupdf-1.25.0 → pymupdf-1.25.1}/setup.py +3 -3
  5. {pymupdf-1.25.0 → pymupdf-1.25.1}/src/__init__.py +59 -261
  6. {pymupdf-1.25.0 → pymupdf-1.25.1}/src/__main__.py +2 -8
  7. {pymupdf-1.25.0 → pymupdf-1.25.1}/src/extra.i +0 -66
  8. {pymupdf-1.25.0 → pymupdf-1.25.1}/src/utils.py +2 -8
  9. pymupdf-1.25.1/tests/resources/test_4125.pdf +0 -0
  10. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_2548.py +6 -16
  11. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_2904.py +1 -4
  12. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_annots.py +1 -3
  13. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_font.py +0 -9
  14. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_general.py +10 -29
  15. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_memory.py +105 -0
  16. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_pixmap.py +0 -4
  17. pymupdf-1.25.0/tests/test-rtl.py → pymupdf-1.25.1/tests/test_rtl.py +4 -1
  18. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_tesseract.py +7 -11
  19. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_textextract.py +36 -50
  20. pymupdf-1.25.0/tests/resources/test_1645_expected_1.22.pdf +0 -0
  21. {pymupdf-1.25.0 → pymupdf-1.25.1}/COPYING +0 -0
  22. {pymupdf-1.25.0 → pymupdf-1.25.1}/README.md +0 -0
  23. {pymupdf-1.25.0 → pymupdf-1.25.1}/READMEb.md +0 -0
  24. {pymupdf-1.25.0 → pymupdf-1.25.1}/READMEd.md +0 -0
  25. {pymupdf-1.25.0 → pymupdf-1.25.1}/pyproject.toml +0 -0
  26. {pymupdf-1.25.0 → pymupdf-1.25.1}/pytest.ini +0 -0
  27. {pymupdf-1.25.0 → pymupdf-1.25.1}/scripts/gh_release.py +0 -0
  28. {pymupdf-1.25.0 → pymupdf-1.25.1}/scripts/sysinstall.py +0 -0
  29. {pymupdf-1.25.0 → pymupdf-1.25.1}/scripts/test.py +0 -0
  30. {pymupdf-1.25.0 → pymupdf-1.25.1}/src/_apply_pages.py +0 -0
  31. {pymupdf-1.25.0 → pymupdf-1.25.1}/src/fitz___init__.py +0 -0
  32. {pymupdf-1.25.0 → pymupdf-1.25.1}/src/fitz_table.py +0 -0
  33. {pymupdf-1.25.0 → pymupdf-1.25.1}/src/fitz_utils.py +0 -0
  34. {pymupdf-1.25.0 → pymupdf-1.25.1}/src/pymupdf.py +0 -0
  35. {pymupdf-1.25.0 → pymupdf-1.25.1}/src/table.py +0 -0
  36. {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/__init__.py +0 -0
  37. {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/__main__.py +0 -0
  38. {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/_config.h +0 -0
  39. {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/fitz_old.i +0 -0
  40. {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-annot.i +0 -0
  41. {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-convert.i +0 -0
  42. {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-defines.i +0 -0
  43. {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-devices.i +0 -0
  44. {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-fields.i +0 -0
  45. {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-fileobj.i +0 -0
  46. {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-geo-c.i +0 -0
  47. {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-geo-py.i +0 -0
  48. {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-globals.i +0 -0
  49. {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-other.i +0 -0
  50. {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-pdfinfo.i +0 -0
  51. {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-pixmap.i +0 -0
  52. {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-portfolio.i +0 -0
  53. {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-python.i +0 -0
  54. {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-select.i +0 -0
  55. {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-stext.i +0 -0
  56. {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-xobject.i +0 -0
  57. {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/utils.py +0 -0
  58. {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/version.i +0 -0
  59. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/README.md +0 -0
  60. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/conftest.py +0 -0
  61. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/gentle_compare.py +0 -0
  62. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/001003ED.pdf +0 -0
  63. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/1.pdf +0 -0
  64. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/2.pdf +0 -0
  65. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/2201.00069.pdf +0 -0
  66. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/3.pdf +0 -0
  67. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/4.pdf +0 -0
  68. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/Bezier.epub +0 -0
  69. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/PragmaticaC.otf +0 -0
  70. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/battery-file-22.pdf +0 -0
  71. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/bug1945.pdf +0 -0
  72. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/bug1971.pdf +0 -0
  73. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/chinese-tables.pdf +0 -0
  74. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/chinese-tables.pickle +0 -0
  75. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/circular-toc.pdf +0 -0
  76. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/cython.pdf +0 -0
  77. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/cython.pickle +0 -0
  78. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/dotted-gridlines.pdf +0 -0
  79. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/full_toc.txt +0 -0
  80. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/github_sample.pdf +0 -0
  81. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/has-bad-fonts.pdf +0 -0
  82. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/image-file1.pdf +0 -0
  83. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/img-transparent.png +0 -0
  84. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/joined.pdf +0 -0
  85. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/metadata.txt +0 -0
  86. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/mupdf_explored.pdf +0 -0
  87. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/nur-ruhig.jpg +0 -0
  88. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/quad-calc-0.pdf +0 -0
  89. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/simple_toc.txt +0 -0
  90. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/small-table.pdf +0 -0
  91. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/strict-yes-no.pdf +0 -0
  92. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/symbol-list.pdf +0 -0
  93. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/symbols.txt +0 -0
  94. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test-2333.pdf +0 -0
  95. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test-2462.pdf +0 -0
  96. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test-2812.pdf +0 -0
  97. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test-3143.pdf +0 -0
  98. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test-3150.pdf +0 -0
  99. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test-3207.pdf +0 -0
  100. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test-3591.pdf +0 -0
  101. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test-3820.pdf +0 -0
  102. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test-707448.pdf +0 -0
  103. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test-707673.pdf +0 -0
  104. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test-E+A.pdf +0 -0
  105. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test-linebreaks.pdf +0 -0
  106. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test2093.pdf +0 -0
  107. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test2182.pdf +0 -0
  108. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test2238.pdf +0 -0
  109. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_1645_expected_1.24.2.pdf +0 -0
  110. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_1645_expected_1.24.pdf +0 -0
  111. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_1645_expected_1.25.pdf +0 -0
  112. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_1824.pdf +0 -0
  113. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2108.pdf +0 -0
  114. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2270.pdf +0 -0
  115. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2533.pdf +0 -0
  116. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2548.pdf +0 -0
  117. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2553-2.pdf +0 -0
  118. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2553.pdf +0 -0
  119. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2596.pdf +0 -0
  120. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2608_expected +0 -0
  121. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2634.pdf +0 -0
  122. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2635.pdf +0 -0
  123. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2645_1.pdf +0 -0
  124. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2645_2.pdf +0 -0
  125. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2645_3.pdf +0 -0
  126. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2710.pdf +0 -0
  127. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2730.pdf +0 -0
  128. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2742.pdf +0 -0
  129. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2788.pdf +0 -0
  130. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2791_content.pdf +0 -0
  131. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2791_coverpage.pdf +0 -0
  132. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2861.pdf +0 -0
  133. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2871.pdf +0 -0
  134. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2885.pdf +0 -0
  135. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2904.pdf +0 -0
  136. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2907.pdf +0 -0
  137. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2954.pdf +0 -0
  138. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2957_1.pdf +0 -0
  139. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2957_2.pdf +0 -0
  140. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2969.pdf +0 -0
  141. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2979.pdf +0 -0
  142. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3058.pdf +0 -0
  143. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3062.pdf +0 -0
  144. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3070.pdf +0 -0
  145. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3072.pdf +0 -0
  146. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3087.pdf +0 -0
  147. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3179.pdf +0 -0
  148. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3186.pdf +0 -0
  149. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3197.pdf +0 -0
  150. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3357.pdf +0 -0
  151. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3362.pdf +0 -0
  152. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3376.pdf +0 -0
  153. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3448.pdf +0 -0
  154. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3448.pdf-expected.png +0 -0
  155. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3450.pdf +0 -0
  156. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3493.epub +0 -0
  157. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3569.pdf +0 -0
  158. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3594.pdf +0 -0
  159. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3615.epub +0 -0
  160. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3624.pdf +0 -0
  161. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3624_expected.png +0 -0
  162. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3650.pdf +0 -0
  163. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3654.docx +0 -0
  164. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3677.pdf +0 -0
  165. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3687-3.epub +0 -0
  166. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3687.epub +0 -0
  167. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3705.pdf +0 -0
  168. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3725.pdf +0 -0
  169. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3727.pdf +0 -0
  170. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3780.pdf +0 -0
  171. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3789.pdf +0 -0
  172. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3842.pdf +0 -0
  173. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3848.pdf +0 -0
  174. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3854.pdf +0 -0
  175. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3854_expected.png +0 -0
  176. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3863.pdf +0 -0
  177. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3863.pdf.pdf.0.png +0 -0
  178. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3863.pdf.pdf.1.png +0 -0
  179. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3863.pdf.pdf.2.png +0 -0
  180. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3863.pdf.pdf.3.png +0 -0
  181. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3863.pdf.pdf.4.png +0 -0
  182. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3863.pdf.pdf.5.png +0 -0
  183. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3863.pdf.pdf.6.png +0 -0
  184. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3863.pdf.pdf.7.png +0 -0
  185. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3933.pdf +0 -0
  186. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3950.pdf +0 -0
  187. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3994.pdf +0 -0
  188. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_4004.pdf +0 -0
  189. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_4017.pdf +0 -0
  190. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_4026.pdf +0 -0
  191. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_4034.pdf +0 -0
  192. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_4043.pdf +0 -0
  193. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_4047.pdf +0 -0
  194. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_4079.pdf +0 -0
  195. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_4079_after.pdf +0 -0
  196. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_4090.pdf +0 -0
  197. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_annot_file_info.pdf +0 -0
  198. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_delete_image.pdf +0 -0
  199. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_toc_count.pdf +0 -0
  200. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/text-find-ligatures.pdf +0 -0
  201. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/type3font.pdf +0 -0
  202. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/v110-changes.pdf +0 -0
  203. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/widgettest.pdf +0 -0
  204. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/run_compound.py +0 -0
  205. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_2634.py +0 -0
  206. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_2907.py +0 -0
  207. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_badfonts.py +0 -0
  208. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_balance_count.py +0 -0
  209. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_cluster_drawings.py +0 -0
  210. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_codespell.py +0 -0
  211. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_crypting.py +0 -0
  212. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_docs_samples.py +0 -0
  213. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_drawings.py +0 -0
  214. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_embeddedfiles.py +0 -0
  215. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_extractimage.py +0 -0
  216. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_flake8.py +0 -0
  217. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_geometry.py +0 -0
  218. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_imagebbox.py +0 -0
  219. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_import.py +0 -0
  220. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_insertimage.py +0 -0
  221. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_insertpdf.py +0 -0
  222. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_linebreaks.py +0 -0
  223. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_linequad.py +0 -0
  224. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_metadata.py +0 -0
  225. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_mupdf_regressions.py +0 -0
  226. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_named_links.py +0 -0
  227. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_nonpdf.py +0 -0
  228. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_object_manipulation.py +0 -0
  229. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_objectstreams.py +0 -0
  230. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_optional_content.py +0 -0
  231. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_page_links.py +0 -0
  232. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_pagedelete.py +0 -0
  233. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_pagelabels.py +0 -0
  234. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_pylint.py +0 -0
  235. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_remove-rotation.py +0 -0
  236. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_showpdfpage.py +0 -0
  237. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_story.py +0 -0
  238. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_tables.py +0 -0
  239. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_textbox.py +0 -0
  240. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_textsearch.py +0 -0
  241. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_toc.py +0 -0
  242. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_widgets.py +0 -0
  243. {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_word_delimiters.py +0 -0
  244. {pymupdf-1.25.0 → pymupdf-1.25.1}/valgrind.supp +0 -0
  245. {pymupdf-1.25.0 → pymupdf-1.25.1}/wdev.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PyMuPDF
3
- Version: 1.25.0
3
+ Version: 1.25.1
4
4
  Summary: A high performance Python library for data extraction, analysis, conversion & manipulation of PDF (and other) documents.
5
5
  Description-Content-Type: text/markdown
6
6
  Author: Artifex
@@ -2,6 +2,16 @@ Change Log
2
2
  ==========
3
3
 
4
4
 
5
+ **Changes in version 1.25.1 (2024-12-11)**
6
+
7
+ * Use MuPDF-1.25.2.
8
+
9
+ * Fixed issues:
10
+
11
+ * **Fixed** `4125 <https://github.com/pymupdf/PyMuPDF/issues/4125>`_: memory leak while convert Pixmap's colorspace
12
+ * **Fixed** `4034 <https://github.com/pymupdf/PyMuPDF/issues/4034>`_: Possible regression in pdf cleaning during save.
13
+
14
+
5
15
  **Changes in version 1.25.0 (2024-12-05)**
6
16
 
7
17
  * Use MuPDF-1.25.1.
@@ -2444,6 +2444,50 @@ def relpath(path, start=None):
2444
2444
  else:
2445
2445
  return os.path.relpath(path, start)
2446
2446
 
2447
+
2448
+ def number_sep( s):
2449
+ '''
2450
+ Simple number formatter, adds commas in-between thousands. `s` can be a
2451
+ number or a string. Returns a string.
2452
+
2453
+ >>> number_sep(1)
2454
+ '1'
2455
+ >>> number_sep(12)
2456
+ '12'
2457
+ >>> number_sep(123)
2458
+ '123'
2459
+ >>> number_sep(1234)
2460
+ '1,234'
2461
+ >>> number_sep(12345)
2462
+ '12,345'
2463
+ >>> number_sep(123456)
2464
+ '123,456'
2465
+ >>> number_sep(1234567)
2466
+ '1,234,567'
2467
+ >>> number_sep(-131072)
2468
+ '-131,072'
2469
+ '''
2470
+ if not isinstance( s, str):
2471
+ s = str( s)
2472
+ ret = ''
2473
+ if s.startswith('-'):
2474
+ ret += '-'
2475
+ s = s[1:]
2476
+ c = s.find( '.')
2477
+ if c==-1: c = len(s)
2478
+ end = s.find('e')
2479
+ if end == -1: end = s.find('E')
2480
+ if end == -1: end = len(s)
2481
+ for i in range( end):
2482
+ ret += s[i]
2483
+ if i<c-1 and (c-i-1)%3==0:
2484
+ ret += ','
2485
+ elif i>c and i<end-1 and (i-c)%3==0:
2486
+ ret += ','
2487
+ ret += s[end:]
2488
+ return ret
2489
+
2490
+
2447
2491
  def _so_suffix(use_so_versioning=True):
2448
2492
  '''
2449
2493
  Filename suffix for shared libraries is defined in pep-3149. The
@@ -1157,9 +1157,9 @@ classifier = [
1157
1157
  # We generate different wheels depending on PYMUPDF_SETUP_FLAVOUR.
1158
1158
  #
1159
1159
 
1160
- version_p = '1.25.0'
1161
- version_b = '1.25.0'
1162
- version_mupdf = '1.25.1'
1160
+ version_p = '1.25.1'
1161
+ version_b = '1.25.1'
1162
+ version_mupdf = '1.25.2'
1163
1163
 
1164
1164
  if os.path.exists(f'{g_root}/{g_pymupdfb_sdist_marker}'):
1165
1165
 
@@ -373,9 +373,9 @@ def _int_rc(text):
373
373
 
374
374
  # Basic version information.
375
375
  #
376
- pymupdf_version = "1.25.0"
376
+ pymupdf_version = "1.25.1"
377
377
  mupdf_version = mupdf.FZ_VERSION
378
- pymupdf_date = "2024-12-05 00:00:01"
378
+ pymupdf_date = "2024-12-11 00:00:01"
379
379
 
380
380
  # Versions as tuples; useful when comparing versions.
381
381
  #
@@ -3010,38 +3010,30 @@ class Document:
3010
3010
  #log( f'{handler.open=}')
3011
3011
  #log( f'{dir(handler.open)=}')
3012
3012
  try:
3013
- if mupdf_version_tuple >= (1, 24):
3014
- stream = mupdf.FzStream(filename)
3015
- accel = mupdf.FzStream()
3016
- archive = mupdf.FzArchive(None)
3017
- if mupdf_version_tuple >= (1, 24, 8):
3018
- doc = mupdf.ll_fz_document_handler_open(
3019
- handler,
3020
- stream.m_internal,
3021
- accel.m_internal,
3022
- archive.m_internal,
3023
- None, # recognize_state
3024
- )
3025
- else:
3026
- doc = mupdf.ll_fz_document_open_fn_call(
3027
- handler.open,
3028
- stream.m_internal,
3029
- accel.m_internal,
3030
- archive.m_internal,
3031
- )
3013
+ stream = mupdf.FzStream(filename)
3014
+ accel = mupdf.FzStream()
3015
+ archive = mupdf.FzArchive(None)
3016
+ if mupdf_version_tuple >= (1, 24, 8):
3017
+ doc = mupdf.ll_fz_document_handler_open(
3018
+ handler,
3019
+ stream.m_internal,
3020
+ accel.m_internal,
3021
+ archive.m_internal,
3022
+ None, # recognize_state
3023
+ )
3032
3024
  else:
3033
- doc = mupdf.ll_fz_document_open_fn_call( handler.open, filename)
3025
+ doc = mupdf.ll_fz_document_open_fn_call(
3026
+ handler.open,
3027
+ stream.m_internal,
3028
+ accel.m_internal,
3029
+ archive.m_internal,
3030
+ )
3034
3031
  except Exception as e:
3035
3032
  if g_exceptions_verbose > 1: exception_info()
3036
3033
  raise FileDataError(f'Failed to open file {filename!r} as type {filetype!r}.') from e
3037
3034
  doc = mupdf.FzDocument( doc)
3038
3035
  else:
3039
- if mupdf_version_tuple < (1, 24):
3040
- if handler.open_with_stream:
3041
- data = mupdf.fz_open_file( filename)
3042
- doc = mupdf.fz_document_open_with_stream_fn_call( handler.open_with_stream, data)
3043
- else:
3044
- assert 0
3036
+ assert 0
3045
3037
  else:
3046
3038
  raise ValueError( MSG_BAD_FILETYPE)
3047
3039
  else:
@@ -4943,8 +4935,6 @@ class Document:
4943
4935
  lang = mupdf.pdf_document_language(pdf)
4944
4936
  if lang == mupdf.FZ_LANG_UNSET:
4945
4937
  return
4946
- if mupdf_version_tuple < (1, 23, 7):
4947
- assert 0, 'not implemented yet'
4948
4938
  return mupdf.fz_string_from_text_language2(lang)
4949
4939
 
4950
4940
  @property
@@ -5703,11 +5693,7 @@ class Document:
5703
5693
  pdf = _as_pdf_document(self)
5704
5694
  # create page sub-pdf via pdf_rearrange_pages2().
5705
5695
  #
5706
- if mupdf_version_tuple >= (1, 24):
5707
- mupdf.pdf_rearrange_pages2(pdf, pyliste)
5708
- else:
5709
- # mupdf.pdf_rearrange_pages2() not available.
5710
- extra.rearrange_pages2(pdf, tuple(pyliste))
5696
+ mupdf.pdf_rearrange_pages2(pdf, pyliste)
5711
5697
 
5712
5698
  # remove any existing pages with their kids
5713
5699
  self._reset_page_refs()
@@ -8105,84 +8091,33 @@ class Page:
8105
8091
  do_have_imask = 0
8106
8092
 
8107
8093
  if do_have_imask:
8108
- if mupdf_version_tuple >= (1, 24):
8109
- # `fz_compressed_buffer` is reference counted and
8110
- # `mupdf.fz_new_image_from_compressed_buffer2()`
8111
- # is povided as a Swig-friendly wrapper for
8112
- # `fz_new_image_from_compressed_buffer()`, so we can do things
8113
- # straightfowardly.
8114
- #
8115
- cbuf1 = mupdf.fz_compressed_image_buffer( image)
8116
- if not cbuf1.m_internal:
8117
- raise ValueError( "uncompressed image cannot have mask")
8118
- bpc = image.bpc()
8119
- colorspace = image.colorspace()
8120
- xres, yres = mupdf.fz_image_resolution(image)
8121
- mask = mupdf.fz_new_image_from_buffer(maskbuf)
8122
- image = mupdf.fz_new_image_from_compressed_buffer2(
8123
- w,
8124
- h,
8125
- bpc,
8126
- colorspace,
8127
- xres,
8128
- yres,
8129
- 1, # interpolate
8130
- 0, # imagemask,
8131
- list(), # decode
8132
- list(), # colorkey
8133
- cbuf1,
8134
- mask,
8135
- )
8136
- else:
8137
- #log( 'do_have_imask')
8138
- # mupdf.FzCompressedBuffer is not copyable, so
8139
- # mupdf.fz_compressed_image_buffer() does not work - it cannot
8140
- # return by value. And sharing a fz_compressed_buffer between two
8141
- # `fz_image`'s doesn't work, so we use a raw fz_compressed_buffer
8142
- # here, not a mupdf.FzCompressedBuffer.
8143
- #
8144
- cbuf1 = mupdf.ll_fz_compressed_image_buffer( image.m_internal)
8145
- if not cbuf1:
8146
- raise ValueError( "uncompressed image cannot have mask")
8147
- bpc = image.bpc()
8148
- colorspace = image.colorspace()
8149
- xres, yres = mupdf.fz_image_resolution(image)
8150
- mask = mupdf.fz_new_image_from_buffer(maskbuf)
8151
-
8152
- # mupdf.ll_fz_new_image_from_compressed_buffer() is not usable.
8153
- zimg = extra.fz_new_image_from_compressed_buffer(
8154
- w,
8155
- h,
8156
- bpc,
8157
- colorspace.m_internal,
8158
- xres,
8159
- yres,
8160
- 1, # interpolate
8161
- 0, # imagemask,
8162
- cbuf1,
8163
- mask.m_internal,
8164
- )
8165
-
8166
- zimg = mupdf.FzImage(zimg)
8167
-
8168
- # `image` and `zimage` both have pointers to the same
8169
- # `fz_compressed_buffer`, which is not reference counted, and they
8170
- # both think that they own it.
8171
- #
8172
- # So we do what the classic implementation does, and simply
8173
- # ensure that `fz_drop_image(image)` is never called. This will
8174
- # leak some of `image`'s allocations (for example the main
8175
- # `fz_image` allocation), but it's not trivial to avoid this.
8176
- #
8177
- # Perhaps we could manually set `fz_image`'s
8178
- # `fz_compressed_buffer*` to null? Trouble is we'd have to
8179
- # cast the `fz_image*` to a `fz_compressed_image*` to see the
8180
- # `fz_compressed_buffer*`, which is probably not possible from
8181
- # Python?
8182
- #
8183
- image.m_internal = None
8184
-
8185
- image = zimg
8094
+ # `fz_compressed_buffer` is reference counted and
8095
+ # `mupdf.fz_new_image_from_compressed_buffer2()`
8096
+ # is povided as a Swig-friendly wrapper for
8097
+ # `fz_new_image_from_compressed_buffer()`, so we can do things
8098
+ # straightfowardly.
8099
+ #
8100
+ cbuf1 = mupdf.fz_compressed_image_buffer( image)
8101
+ if not cbuf1.m_internal:
8102
+ raise ValueError( "uncompressed image cannot have mask")
8103
+ bpc = image.bpc()
8104
+ colorspace = image.colorspace()
8105
+ xres, yres = mupdf.fz_image_resolution(image)
8106
+ mask = mupdf.fz_new_image_from_buffer(maskbuf)
8107
+ image = mupdf.fz_new_image_from_compressed_buffer2(
8108
+ w,
8109
+ h,
8110
+ bpc,
8111
+ colorspace,
8112
+ xres,
8113
+ yres,
8114
+ 1, # interpolate
8115
+ 0, # imagemask,
8116
+ list(), # decode
8117
+ list(), # colorkey
8118
+ cbuf1,
8119
+ mask,
8120
+ )
8186
8121
 
8187
8122
  if do_have_image:
8188
8123
  #log( 'do_have_image')
@@ -9927,9 +9862,6 @@ class Pixmap:
9927
9862
  elif (args_match(args, (Pixmap, mupdf.FzPixmap), (float, int), (float, int), None) or
9928
9863
  args_match(args, (Pixmap, mupdf.FzPixmap), (float, int), (float, int))):
9929
9864
  # create pixmap as scaled copy of another one
9930
- if mupdf_version_tuple < (1, 23, 8):
9931
- assert 0, f'Cannot handle {args=} because fz_scale_pixmap() and fz_scale_pixmap_cached() are not declared in MuPDF headers'
9932
-
9933
9865
  if len(args) == 3:
9934
9866
  spix, w, h = args
9935
9867
  bbox = mupdf.FzIrect(mupdf.fz_infinite_irect)
@@ -10152,10 +10084,7 @@ class Pixmap:
10152
10084
  elif format_ == 5: mupdf.fz_write_pixmap_as_psd(out, pm)
10153
10085
  elif format_ == 6: mupdf.fz_write_pixmap_as_ps(out, pm)
10154
10086
  elif format_ == 7:
10155
- if mupdf_version_tuple < (1, 24):
10156
- mupdf.fz_write_pixmap_as_jpeg(out, pm, jpg_quality)
10157
- else:
10158
- mupdf.fz_write_pixmap_as_jpeg(out, pm, jpg_quality, 0)
10087
+ mupdf.fz_write_pixmap_as_jpeg(out, pm, jpg_quality, 0)
10159
10088
  else:
10160
10089
  mupdf.fz_write_pixmap_as_png(out, pm)
10161
10090
  out.fz_close_output()
@@ -10647,12 +10576,7 @@ class Pixmap:
10647
10576
  @property
10648
10577
  def size(self):
10649
10578
  """Pixmap size."""
10650
- if mupdf_version_tuple >= (1, 23, 8):
10651
- return mupdf.fz_pixmap_size( self.this)
10652
- # fz_pixmap_size() is not publicly visible, so we implement it
10653
- # ourselves. fixme: we don't add on sizeof(fz_pixmap).
10654
- pm = self.this
10655
- return pm.n() * pm.w() * pm.h()
10579
+ return mupdf.fz_pixmap_size( self.this)
10656
10580
 
10657
10581
  @property
10658
10582
  def stride(self):
@@ -12690,15 +12614,10 @@ class TextPage:
12690
12614
  continue
12691
12615
  img = block.i_image()
12692
12616
  img_size = 0
12693
- if mupdf_version_tuple >= (1, 24):
12694
- compr_buff = mupdf.fz_compressed_image_buffer(img)
12695
- if compr_buff.m_internal:
12696
- img_size = compr_buff.fz_compressed_buffer_size()
12697
- compr_buff = None
12698
- else:
12699
- compr_buff = mupdf.ll_fz_compressed_image_buffer(img.m_internal)
12700
- if compr_buff:
12701
- img_size = mupdf.ll_fz_compressed_buffer_size(compr_buff)
12617
+ compr_buff = mupdf.fz_compressed_image_buffer(img)
12618
+ if compr_buff.m_internal:
12619
+ img_size = compr_buff.fz_compressed_buffer_size()
12620
+ compr_buff = None
12702
12621
  if hashes:
12703
12622
  r = mupdf.FzIrect(FZ_MIN_INF_RECT, FZ_MIN_INF_RECT, FZ_MAX_INF_RECT, FZ_MAX_INF_RECT)
12704
12623
  assert mupdf.fz_is_infinite_irect(r)
@@ -14834,35 +14753,7 @@ def JM_choice_options(annot):
14834
14753
  '''
14835
14754
  annot_obj = mupdf.pdf_annot_obj( annot.this)
14836
14755
 
14837
- if mupdf_version_tuple >= (1, 24):
14838
- opts = mupdf.pdf_choice_widget_options2( annot, 0)
14839
- else:
14840
- # pdf_choice_widget_options() is not usable from python, so we
14841
- # implement it ourselves here.
14842
- #
14843
- def pdf_choice_widget_options( annot, exportval):
14844
- #log( '{=type(annot)}')
14845
- optarr = mupdf.pdf_dict_get_inheritable( mupdf.pdf_annot_obj(annot.this), PDF_NAME('Opt'))
14846
- #log( '{optarr=}')
14847
- n = mupdf.pdf_array_len(optarr)
14848
- opts = []
14849
- if not n:
14850
- return opts
14851
- optarr = mupdf.pdf_dict_get(annot_obj, PDF_NAME('Opt'))
14852
- for i in range(n):
14853
- m = mupdf.pdf_array_len(mupdf.pdf_array_get(optarr, i))
14854
- if m == 2:
14855
- val = (
14856
- mupdf.pdf_to_text_string(mupdf.pdf_array_get(mupdf.pdf_array_get(optarr, i), 0)),
14857
- mupdf.pdf_to_text_string(mupdf.pdf_array_get(mupdf.pdf_array_get(optarr, i), 1)),
14858
- )
14859
- opts.append(val)
14860
- else:
14861
- val = JM_UnicodeFromStr(mupdf.pdf_to_text_string(mupdf.pdf_array_get(optarr, i)))
14862
- opts.append(val)
14863
- return opts
14864
-
14865
- opts = pdf_choice_widget_options( annot, 0)
14756
+ opts = mupdf.pdf_choice_widget_options2( annot, 0)
14866
14757
  n = len( opts)
14867
14758
  if n == 0:
14868
14759
  return # wrong widget type
@@ -16212,12 +16103,8 @@ def JM_image_reporter(page):
16212
16103
  def __init__(self):
16213
16104
  super().__init__()
16214
16105
  self.use_virtual_image_filter()
16215
- if mupdf_version_tuple >= (1, 23, 11):
16216
- def image_filter(self, ctx, ctm, name, image, scissor):
16217
- JM_image_filter(None, mupdf.FzMatrix(ctm), name, image)
16218
- else:
16219
- def image_filter(self, ctx, ctm, name, image):
16220
- JM_image_filter(None, mupdf.FzMatrix(ctm), name, image)
16106
+ def image_filter(self, ctx, ctm, name, image, scissor):
16107
+ JM_image_filter(None, mupdf.FzMatrix(ctm), name, image)
16221
16108
 
16222
16109
  sanitize_filter_options = SanitizeFilterOptions()
16223
16110
 
@@ -20877,97 +20764,8 @@ def paper_sizes():
20877
20764
  "tabloid-extra": (864, 1296),
20878
20765
  }
20879
20766
 
20880
- if mupdf_version_tuple >= (1, 23, 8):
20881
- def pdf_lookup_page_loc(doc, needle):
20882
- return mupdf.pdf_lookup_page_loc(doc, needle)
20883
-
20884
- else:
20885
- def pdf_lookup_page_loc_imp(doc, node, skip, parentp, indexp):
20886
- assert isinstance(node, mupdf.PdfObj)
20887
- assert isinstance(skip, list) and len(skip) == 1
20888
- assert isinstance(indexp, list) and len(indexp) == 1
20889
- assert isinstance(parentp, list) and len(parentp) == 1 and isinstance(parentp[0], mupdf.PdfObj)
20890
- # Copy of MuPDF's internal pdf_lookup_page_loc_imp().
20891
- hit = None
20892
- stack = []
20893
- try:
20894
- while 1:
20895
- kids = mupdf.pdf_dict_get(node, PDF_NAME('Kids'))
20896
- len_ = mupdf.pdf_array_len( kids)
20897
-
20898
- if len_ == 0:
20899
- raise Exception("malformed page tree")
20900
-
20901
- # Every node we need to unmark goes into the stack
20902
- stack.append(node)
20903
-
20904
- if mupdf.pdf_mark_obj( node):
20905
- raise Exception( "cycle in page tree")
20906
-
20907
- for i in range(len_):
20908
- kid = mupdf.pdf_array_get( kids, i)
20909
- type_ = mupdf.pdf_dict_get( kid, PDF_NAME('Type'))
20910
- if type_.m_internal:
20911
- a = mupdf.pdf_name_eq( type_, PDF_NAME('Pages'))
20912
- else:
20913
- a = (
20914
- mupdf.pdf_dict_get( kid, PDF_NAME('Kids')).m_internal
20915
- and not mupdf.pdf_dict_get( kid, PDF_NAME('MediaBox')).m_internal
20916
- )
20917
- if a:
20918
- count = mupdf.pdf_dict_get_int( kid, PDF_NAME('Count'))
20919
- if (skip[0] < count):
20920
- node = kid
20921
- break
20922
- else:
20923
- skip[0] -= count
20924
- else:
20925
- if type_.m_internal:
20926
- a = not mupdf.pdf_name_eq( type_, PDF_NAME('Page'))
20927
- else:
20928
- a = not mupdf.pdf_dict_get( kid, PDF_NAME('MediaBox')).m_internal
20929
- if a:
20930
- mupdf.fz_warn( f"non-page object in page tree ({mupdf.pdf_to_name( type_)})")
20931
- if skip[0] == 0:
20932
- parentp[0] = node
20933
- indexp[0] = i
20934
- hit = kid
20935
- break
20936
- else:
20937
- skip[0] -= 1
20938
-
20939
- # If i < len && hit != NULL the desired page was found in the
20940
- # Kids array, done. If i < len && hit == NULL the found page tree
20941
- # node contains a Kids array that contains the desired page, loop
20942
- # back to top to extract it. When i == len the Kids array has been
20943
- # exhausted without finding the desired page, give up.
20944
- if not ((hit is None or hit.m_internal is None) and i < len_):
20945
- break
20946
- finally:
20947
- for i in range(len(stack), 0, -1): # (i = stack_len; i > 0; i--)
20948
- mupdf.pdf_unmark_obj( stack[i-1])
20949
-
20950
- return hit
20951
-
20952
- def pdf_lookup_page_loc(doc, needle):
20953
- '''
20954
- Copy of MuPDF's internal pdf_lookup_page_loc().
20955
- '''
20956
- root = mupdf.pdf_dict_get( mupdf.pdf_trailer( doc), PDF_NAME('Root'))
20957
- node = mupdf.pdf_dict_get( root, PDF_NAME('Pages'))
20958
- skip = [needle]
20959
-
20960
- if not node.m_internal:
20961
- raise Exception("cannot find page tree")
20962
- parentp = [mupdf.PdfObj()]
20963
- indexp = [0]
20964
- hit = pdf_lookup_page_loc_imp(doc, node, skip, parentp, indexp)
20965
- skip = skip[0]
20966
- parentp = parentp[0]
20967
- indexp = indexp[0]
20968
- if not hit.m_internal:
20969
- raise Exception("cannot find page %d in page tree" % needle+1)
20970
- return hit, parentp, indexp # We don't seem to return skip.
20767
+ def pdf_lookup_page_loc(doc, needle):
20768
+ return mupdf.pdf_lookup_page_loc(doc, needle)
20971
20769
 
20972
20770
 
20973
20771
  def pdfobj_string(o, prefix=''):
@@ -330,12 +330,9 @@ def embedded_del(args):
330
330
  ):
331
331
  sys.exit("cannot save PDF incrementally")
332
332
 
333
- exception_types = (ValueError, pymupdf.mupdf.FzErrorBase)
334
- if pymupdf.mupdf_version_tuple < (1, 24):
335
- exception_types = ValueError
336
333
  try:
337
334
  doc.embfile_del(args.name)
338
- except exception_types as e: # pylint: disable=catching-non-exception
335
+ except (ValueError, pymupdf.mupdf.FzErrorBase) as e:
339
336
  sys.exit(f'no such embedded file {args.name!r}: {e}')
340
337
  if not args.output or args.output == args.input:
341
338
  doc.saveIncr()
@@ -347,13 +344,10 @@ def embedded_del(args):
347
344
  def embedded_get(args):
348
345
  """Retrieve contents of an embedded file."""
349
346
  doc = open_file(args.input, args.password, pdf=True)
350
- exception_types = (ValueError, pymupdf.mupdf.FzErrorBase)
351
- if pymupdf.mupdf_version_tuple < (1, 24):
352
- exception_types = ValueError
353
347
  try:
354
348
  stream = doc.embfile_get(args.name)
355
349
  d = doc.embfile_info(args.name)
356
- except exception_types as e: # pylint: disable=catching-non-exception
350
+ except (ValueError, pymupdf.mupdf.FzErrorBase) as e:
357
351
  sys.exit(f'no such embedded file {args.name!r}: {e}')
358
352
  filename = args.output if args.output else d["filename"]
359
353
  with open(filename, "wb") as output:
@@ -256,23 +256,6 @@ PyObject* JM_EscapeStrFromBuffer(fz_buffer* buff)
256
256
  return val;
257
257
  }
258
258
 
259
- // Only used for mupdf < 1.24. mupdf >= 1.24 has pdf_rearrange_pages2().
260
- void rearrange_pages2(
261
- mupdf::PdfDocument& doc,
262
- PyObject *new_pages
263
- )
264
- {
265
- int len = (int) PyTuple_Size(new_pages);
266
- int *pages = (int *) malloc((int) len * sizeof(int));
267
- int i;
268
- for (i = 0; i < len; i++) {
269
- pages[i] = (int) PyLong_AsLong(PyTuple_GET_ITEM(new_pages, (Py_ssize_t) i));
270
- }
271
- mupdf::pdf_rearrange_pages(doc, len, pages);
272
- free(pages);
273
- }
274
-
275
-
276
259
  //----------------------------------------------------------------------------
277
260
  // Deep-copies a source page to the target.
278
261
  // Modified version of function of pdfmerge.c: we also copy annotations, but
@@ -3973,40 +3956,6 @@ no_more_matches:;
3973
3956
  return quads;
3974
3957
  }
3975
3958
 
3976
- /* MuPDF-1.23.x has an incorrect and unusable
3977
- fz_new_image_from_compressed_buffer() wrapper that thinks the `decode` and
3978
- `colorkey` args are out-params. So we provide an alternative wrapper where
3979
- we always set these to args to null, which is sufficient for PyMuPDF caller
3980
- `Document._insert_image()`. */
3981
- fz_image* fz_new_image_from_compressed_buffer(
3982
- int w,
3983
- int h,
3984
- int bpc,
3985
- fz_colorspace *colorspace,
3986
- int xres,
3987
- int yres,
3988
- int interpolate,
3989
- int imagemask,
3990
- fz_compressed_buffer *buffer,
3991
- fz_image *mask
3992
- )
3993
- {
3994
- return mupdf::ll_fz_new_image_from_compressed_buffer(
3995
- w,
3996
- h,
3997
- bpc,
3998
- colorspace,
3999
- xres,
4000
- yres,
4001
- interpolate,
4002
- imagemask,
4003
- nullptr,
4004
- nullptr,
4005
- buffer,
4006
- mask
4007
- );
4008
- }
4009
-
4010
3959
  %}
4011
3960
 
4012
3961
  /* Declarations for functions defined above. */
@@ -4129,18 +4078,3 @@ int pixmap_n(mupdf::FzPixmap& pixmap);
4129
4078
  PyObject* JM_search_stext_page(fz_stext_page *page, const char *needle);
4130
4079
 
4131
4080
  PyObject *set_pixel(fz_pixmap* pm, int x, int y, PyObject *color);
4132
-
4133
- fz_image* fz_new_image_from_compressed_buffer(
4134
- int w,
4135
- int h,
4136
- int bpc,
4137
- fz_colorspace *colorspace,
4138
- int xres,
4139
- int yres,
4140
- int interpolate,
4141
- int imagemask,
4142
- fz_compressed_buffer *buffer,
4143
- fz_image *mask
4144
- );
4145
-
4146
- void rearrange_pages2( mupdf::PdfDocument& doc, PyObject *new_pages);
@@ -784,9 +784,6 @@ def get_textpage_ocr(
784
784
  bbox = pymupdf.Rect(block["bbox"])
785
785
  if bbox.width <= 3 or bbox.height <= 3: # ignore tiny stuff
786
786
  continue
787
- exception_types = (RuntimeError, mupdf.FzErrorBase)
788
- if pymupdf.mupdf_version_tuple < (1, 24):
789
- exception_types = RuntimeError
790
787
  try:
791
788
  pix = pymupdf.Pixmap(block["image"]) # get image pixmap
792
789
  if pix.n - pix.alpha != 3: # we need to convert this to RGB!
@@ -805,7 +802,7 @@ def get_textpage_ocr(
805
802
  mat = shrink * block["transform"]
806
803
  imgpage.extend_textpage(tpage, flags=0, matrix=mat)
807
804
  imgdoc.close()
808
- except exception_types:
805
+ except (RuntimeError, mupdf.FzErrorBase):
809
806
  if 0 and g_exceptions_verbose:
810
807
  # Don't show exception info here because it can happen in
811
808
  # normal operation (see test_3842b).
@@ -4418,14 +4415,11 @@ def apply_redactions(
4418
4415
  Returns:
4419
4416
  A rectangle to use instead of the annot rectangle.
4420
4417
  """
4421
- exception_types = (ValueError, mupdf.FzErrorBase)
4422
- if pymupdf.mupdf_version_tuple < (1, 24):
4423
- exception_types = ValueError
4424
4418
  if not new_text or annot_rect.width <= pymupdf.EPSILON:
4425
4419
  return annot_rect
4426
4420
  try:
4427
4421
  text_width = pymupdf.get_text_length(new_text, font, fsize)
4428
- except exception_types: # unsupported font
4422
+ except (ValueError, mupdf.FzErrorBase): # unsupported font
4429
4423
  if g_exceptions_verbose:
4430
4424
  pymupdf.exception_info()
4431
4425
  return annot_rect