From 3a259dc6ea77a6382c68bbe1ff0c266df970a893 Mon Sep 17 00:00:00 2001 From: Julian Smith Date: Fri, 12 Jul 2024 12:46:58 +0100 Subject: [PATCH] Fix use of pymupdf.TOOLS.set_subset_fontnames() and pymupdf.TOOLS.unset_quad_corrections(). We need to propagate changes to the `extra` submodule. Checked with new test tests/test_font.py:test_3677(). This addresses #3677. --- src/__init__.py | 4 ++++ src/extra.i | 14 +++++++++++++- tests/resources/test_3677.pdf | Bin 0 -> 37823 bytes tests/test_font.py | 23 +++++++++++++++++++++++ 4 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 tests/resources/test_3677.pdf diff --git a/src/__init__.py b/src/__init__.py index c51dd2560..9396a3d28 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -21605,6 +21605,8 @@ def set_subset_fontnames(on=None): ''' if on is not None: _globals.subset_fontnames = bool(on) + if g_use_extra: + extra.set_subset_fontnames(_globals.subset_fontnames) return _globals.subset_fontnames @staticmethod @@ -21653,6 +21655,8 @@ def unset_quad_corrections(on=None): ''' if on is not None: _globals.skip_quad_corrections = bool(on) + if g_use_extra: + extra.set_skip_quad_corrections(_globals.skip_quad_corrections) return _globals.skip_quad_corrections # fixme: also defined at top-level. diff --git a/src/extra.i b/src/extra.i index 1e4be61df..b6343fbaa 100644 --- a/src/extra.i +++ b/src/extra.i @@ -1566,11 +1566,20 @@ enum TEXT_FONT_BOLD = 16, }; -/* todo: implement fns to set these and sync with __init__.py. */ int g_skip_quad_corrections = 0; int g_subset_fontnames = 0; int g_small_glyph_heights = 0; +void set_skip_quad_corrections(int on) +{ + g_skip_quad_corrections = on; +} + +void set_subset_fontnames(int on) +{ + g_subset_fontnames = on; +} + void set_small_glyph_heights(int on) { g_small_glyph_heights = on; @@ -4045,7 +4054,10 @@ fz_rect JM_char_bbox(const mupdf::FzStextLine& line, const mupdf::FzStextChar& c static fz_quad JM_char_quad( fz_stext_line *line, fz_stext_char *ch); void JM_print_stext_page_as_text(mupdf::FzBuffer& res, mupdf::FzStextPage& page); +void set_skip_quad_corrections(int on); +void set_subset_fontnames(int on); void set_small_glyph_heights(int on); + mupdf::FzRect JM_cropbox(mupdf::PdfObj& page_obj); PyObject* get_cdrawings(mupdf::FzPage& page, PyObject *extended=NULL, PyObject *callback=NULL, PyObject *method=NULL); diff --git a/tests/resources/test_3677.pdf b/tests/resources/test_3677.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4285785918d4137d64147bfd2a63f2933102dc12 GIT binary patch literal 37823 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

@Q=>p;m0v!rtf0VUN&}GW4wmh0 z0+g`MYs;htSI=X>R?3BFxvSOn_4R7~^7lV{^EZ3%u($ouI~YE9qc(X8O{AWme0m5G Y>^$rRZI9HZVi?O)u`_4#ONFV}e?KO~H2?qr literal 0 HcmV?d00001 diff --git a/tests/test_font.py b/tests/test_font.py index c225bf43c..ac521b63c 100644 --- a/tests/test_font.py +++ b/tests/test_font.py @@ -124,3 +124,26 @@ def test_mupdf_subset_fonts2(): pages = [i*2 for i in range(n//2)] print(f'{pages=}.') pymupdf.mupdf.pdf_subset_fonts2(pymupdf._as_pdf_document(doc), pages) + + +def test_3677(): + pymupdf.TOOLS.set_subset_fontnames(True) + path = os.path.abspath(f'{__file__}/../../tests/resources/test_3677.pdf') + font_names_expected = [ + 'BCDEEE+Aptos', + 'BCDFEE+Aptos', + 'BCDGEE+Calibri-Light', + 'BCDHEE+Calibri-Light', + ] + font_names = list() + with pymupdf.open(path) as document: + for page in document: + for block in page.get_text('dict')['blocks']: + if block['type'] == 0: + if 'lines' in block.keys(): + for line in block['lines']: + for span in line['spans']: + font_name=span['font'] + print(font_name) + font_names.append(font_name) + assert font_names == font_names_expected, f'{font_names=}'