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.
- {pymupdf-1.25.0 → pymupdf-1.25.1}/PKG-INFO +1 -1
- {pymupdf-1.25.0 → pymupdf-1.25.1}/changes.txt +10 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/pipcl.py +44 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/setup.py +3 -3
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src/__init__.py +59 -261
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src/__main__.py +2 -8
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src/extra.i +0 -66
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src/utils.py +2 -8
- pymupdf-1.25.1/tests/resources/test_4125.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_2548.py +6 -16
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_2904.py +1 -4
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_annots.py +1 -3
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_font.py +0 -9
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_general.py +10 -29
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_memory.py +105 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_pixmap.py +0 -4
- pymupdf-1.25.0/tests/test-rtl.py → pymupdf-1.25.1/tests/test_rtl.py +4 -1
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_tesseract.py +7 -11
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_textextract.py +36 -50
- pymupdf-1.25.0/tests/resources/test_1645_expected_1.22.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/COPYING +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/README.md +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/READMEb.md +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/READMEd.md +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/pyproject.toml +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/pytest.ini +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/scripts/gh_release.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/scripts/sysinstall.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/scripts/test.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src/_apply_pages.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src/fitz___init__.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src/fitz_table.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src/fitz_utils.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src/pymupdf.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src/table.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/__init__.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/__main__.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/_config.h +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/fitz_old.i +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-annot.i +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-convert.i +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-defines.i +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-devices.i +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-fields.i +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-fileobj.i +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-geo-c.i +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-geo-py.i +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-globals.i +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-other.i +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-pdfinfo.i +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-pixmap.i +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-portfolio.i +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-python.i +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-select.i +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-stext.i +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/helper-xobject.i +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/utils.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/src_classic/version.i +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/README.md +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/conftest.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/gentle_compare.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/001003ED.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/1.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/2.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/2201.00069.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/3.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/4.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/Bezier.epub +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/PragmaticaC.otf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/battery-file-22.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/bug1945.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/bug1971.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/chinese-tables.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/chinese-tables.pickle +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/circular-toc.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/cython.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/cython.pickle +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/dotted-gridlines.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/full_toc.txt +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/github_sample.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/has-bad-fonts.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/image-file1.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/img-transparent.png +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/joined.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/metadata.txt +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/mupdf_explored.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/nur-ruhig.jpg +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/quad-calc-0.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/simple_toc.txt +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/small-table.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/strict-yes-no.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/symbol-list.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/symbols.txt +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test-2333.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test-2462.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test-2812.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test-3143.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test-3150.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test-3207.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test-3591.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test-3820.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test-707448.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test-707673.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test-E+A.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test-linebreaks.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test2093.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test2182.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test2238.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_1645_expected_1.24.2.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_1645_expected_1.24.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_1645_expected_1.25.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_1824.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2108.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2270.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2533.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2548.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2553-2.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2553.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2596.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2608_expected +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2634.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2635.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2645_1.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2645_2.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2645_3.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2710.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2730.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2742.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2788.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2791_content.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2791_coverpage.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2861.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2871.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2885.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2904.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2907.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2954.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2957_1.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2957_2.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2969.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_2979.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3058.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3062.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3070.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3072.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3087.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3179.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3186.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3197.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3357.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3362.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3376.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3448.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3448.pdf-expected.png +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3450.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3493.epub +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3569.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3594.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3615.epub +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3624.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3624_expected.png +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3650.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3654.docx +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3677.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3687-3.epub +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3687.epub +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3705.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3725.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3727.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3780.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3789.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3842.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3848.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3854.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3854_expected.png +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3863.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3863.pdf.pdf.0.png +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3863.pdf.pdf.1.png +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3863.pdf.pdf.2.png +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3863.pdf.pdf.3.png +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3863.pdf.pdf.4.png +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3863.pdf.pdf.5.png +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3863.pdf.pdf.6.png +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3863.pdf.pdf.7.png +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3933.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3950.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_3994.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_4004.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_4017.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_4026.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_4034.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_4043.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_4047.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_4079.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_4079_after.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_4090.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_annot_file_info.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_delete_image.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/test_toc_count.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/text-find-ligatures.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/type3font.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/v110-changes.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/resources/widgettest.pdf +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/run_compound.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_2634.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_2907.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_badfonts.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_balance_count.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_cluster_drawings.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_codespell.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_crypting.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_docs_samples.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_drawings.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_embeddedfiles.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_extractimage.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_flake8.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_geometry.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_imagebbox.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_import.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_insertimage.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_insertpdf.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_linebreaks.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_linequad.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_metadata.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_mupdf_regressions.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_named_links.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_nonpdf.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_object_manipulation.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_objectstreams.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_optional_content.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_page_links.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_pagedelete.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_pagelabels.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_pylint.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_remove-rotation.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_showpdfpage.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_story.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_tables.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_textbox.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_textsearch.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_toc.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_widgets.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/tests/test_word_delimiters.py +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/valgrind.supp +0 -0
- {pymupdf-1.25.0 → pymupdf-1.25.1}/wdev.py +0 -0
|
@@ -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.
|
|
1161
|
-
version_b = '1.25.
|
|
1162
|
-
version_mupdf = '1.25.
|
|
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.
|
|
376
|
+
pymupdf_version = "1.25.1"
|
|
377
377
|
mupdf_version = mupdf.FZ_VERSION
|
|
378
|
-
pymupdf_date = "2024-12-
|
|
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
|
-
|
|
3014
|
-
|
|
3015
|
-
|
|
3016
|
-
|
|
3017
|
-
|
|
3018
|
-
|
|
3019
|
-
|
|
3020
|
-
|
|
3021
|
-
|
|
3022
|
-
|
|
3023
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
8109
|
-
|
|
8110
|
-
|
|
8111
|
-
|
|
8112
|
-
|
|
8113
|
-
|
|
8114
|
-
|
|
8115
|
-
|
|
8116
|
-
|
|
8117
|
-
|
|
8118
|
-
|
|
8119
|
-
|
|
8120
|
-
|
|
8121
|
-
|
|
8122
|
-
|
|
8123
|
-
|
|
8124
|
-
|
|
8125
|
-
|
|
8126
|
-
|
|
8127
|
-
|
|
8128
|
-
|
|
8129
|
-
|
|
8130
|
-
|
|
8131
|
-
|
|
8132
|
-
|
|
8133
|
-
|
|
8134
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
12694
|
-
|
|
12695
|
-
|
|
12696
|
-
|
|
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
|
-
|
|
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
|
-
|
|
16216
|
-
|
|
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
|
-
|
|
20881
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
4422
|
+
except (ValueError, mupdf.FzErrorBase): # unsupported font
|
|
4429
4423
|
if g_exceptions_verbose:
|
|
4430
4424
|
pymupdf.exception_info()
|
|
4431
4425
|
return annot_rect
|
|
Binary file
|