From b89778bdd4bcd0996c15664ff6c802a6751e970a Mon Sep 17 00:00:00 2001 From: Julian Smith Date: Thu, 11 Jan 2024 12:12:36 +0000 Subject: [PATCH 1/5] changes.txt: in 1.23.9, retropectively mention fixes for issues that have always worked in rebase. --- changes.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/changes.txt b/changes.txt index 5c584c7f4..47830ca22 100644 --- a/changes.txt +++ b/changes.txt @@ -25,6 +25,10 @@ Change Log * **Fixed** `2969 `_: annot.next throws AttributeError * **Fixed** `2978 `_: 1.23.9rc1: module 'fitz.mupdf' has no attribute 'fz_copy_pixmap_rect' + * **Fixed** `2907 `_: segfault trying to call clean_contents on certain pdfs with python 3.12 + * **Fixed** `2905 `_: SystemError: returned a result with an exception set + * **Fixed** `2742 `_: Segmentation Fault when inserting three (but not two) copies of the same source page into one destination page + * Other: * Add optional setting of opacity to `Page.insert_htmlbox()`. From 78cdb5b4ac5801f619bc306e45465f4140e3e165 Mon Sep 17 00:00:00 2001 From: Julian Smith Date: Thu, 11 Jan 2024 12:23:33 +0000 Subject: [PATCH 2/5] src/__init__.py: removed code for mupdf versions before 1.23.0. --- src/__init__.py | 225 +++++++++++++++--------------------------------- 1 file changed, 71 insertions(+), 154 deletions(-) diff --git a/src/__init__.py b/src/__init__.py index 49d80bdf3..686bfd31c 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -5911,31 +5911,6 @@ def xref_xml_metadata(self): xref = mupdf.pdf_to_num( xml) return xref - if mupdf_version_tuple < (1, 22): - @property - def has_old_style_xrefs(self): - ''' - Check if xref table is old style. - ''' - if self.is_closed: - raise ValueError("document closed") - pdf = _as_pdf_document(self) - if pdf.m_internal and pdf.m_internal.has_old_style_xrefs: - return True - return False - - @property - def has_xref_streams(self): - ''' - Check if xref table is a stream. - ''' - if self.is_closed: - raise ValueError("document closed") - pdf = _as_pdf_document(self) - if pdf.m_internal and pdf.m_internal.has_xref_streams: - return True - return False - __slots__ = ('this', 'page_count2', 'this_is_pdf', '__dict__') outline = property(lambda self: self._outline) @@ -7211,51 +7186,48 @@ def _make_PdfFilterOptions( filter_.instance_forms = instance_forms filter_.ascii = ascii - if mupdf_version_tuple >= (1, 22): - filter_.no_update = no_update - if sanitize: - # We want to use a PdfFilterFactory whose `.filter` fn pointer is - # set to MuPDF's `pdf_new_sanitize_filter()`. But not sure how to - # get access to this raw fn in Python; and on Windows raw MuPDF - # functions are not even available to C++. - # - # So we use SWIG Director to implement our own - # PdfFilterFactory whose `filter()` method calls - # `mupdf.ll_pdf_new_sanitize_filter()`. - if sopts: - assert isinstance(sopts, mupdf.PdfSanitizeFilterOptions) - else: - sopts = mupdf.PdfSanitizeFilterOptions() - class Factory(mupdf.PdfFilterFactory2): - def __init__(self): - super().__init__() - self.use_virtual_filter() - self.sopts = sopts - def filter(self, ctx, doc, chain, struct_parents, transform, options): - if 0: - log(f'sanitize filter.filter():') - log(f' {self=}') - log(f' {ctx=}') - log(f' {doc=}') - log(f' {chain=}') - log(f' {struct_parents=}') - log(f' {transform=}') - log(f' {options=}') - log(f' {self.sopts.internal()=}') - return mupdf.ll_pdf_new_sanitize_filter( - doc, - chain, - struct_parents, - transform, - options, - self.sopts.internal(), - ) + filter_.no_update = no_update + if sanitize: + # We want to use a PdfFilterFactory whose `.filter` fn pointer is + # set to MuPDF's `pdf_new_sanitize_filter()`. But not sure how to + # get access to this raw fn in Python; and on Windows raw MuPDF + # functions are not even available to C++. + # + # So we use SWIG Director to implement our own + # PdfFilterFactory whose `filter()` method calls + # `mupdf.ll_pdf_new_sanitize_filter()`. + if sopts: + assert isinstance(sopts, mupdf.PdfSanitizeFilterOptions) + else: + sopts = mupdf.PdfSanitizeFilterOptions() + class Factory(mupdf.PdfFilterFactory2): + def __init__(self): + super().__init__() + self.use_virtual_filter() + self.sopts = sopts + def filter(self, ctx, doc, chain, struct_parents, transform, options): + if 0: + log(f'sanitize filter.filter():') + log(f' {self=}') + log(f' {ctx=}') + log(f' {doc=}') + log(f' {chain=}') + log(f' {struct_parents=}') + log(f' {transform=}') + log(f' {options=}') + log(f' {self.sopts.internal()=}') + return mupdf.ll_pdf_new_sanitize_filter( + doc, + chain, + struct_parents, + transform, + options, + self.sopts.internal(), + ) - factory = Factory() - filter_.add_factory(factory.internal()) - filter_._factory = factory - else: - filter_.sanitize = sanitize + factory = Factory() + filter_.add_factory(factory.internal()) + filter_._factory = factory return filter_ @@ -15893,8 +15865,7 @@ def JM_image_filter(opaque, ctm, name, image): assert isinstance(ctm, mupdf.FzMatrix) r = mupdf.FzRect(mupdf.FzRect.Fixed_UNIT) q = mupdf.fz_transform_quad( mupdf.fz_quad_from_rect(r), ctm) - if mupdf_version_tuple >= (1, 22): - q = mupdf.fz_transform_quad( q, g_img_info_matrix) + q = mupdf.fz_transform_quad( q, g_img_info_matrix) temp = name, JM_py_from_quad(q) g_img_info.append(temp) @@ -15953,92 +15924,38 @@ def JM_image_profile( imagedata, keep_image): return result -if mupdf_version_tuple >= (1, 22): - - def JM_image_reporter(page): - doc = page.doc() - global g_img_info_matrix - g_img_info_matrix = mupdf.FzMatrix() - mediabox = mupdf.FzRect() - mupdf.pdf_page_transform(page, mediabox, g_img_info_matrix) - - class SanitizeFilterOptions(mupdf.PdfSanitizeFilterOptions2): - def __init__(self): - super().__init__() - self.use_virtual_image_filter() - def image_filter(self, ctx, ctm, name, image): - JM_image_filter(None, mupdf.FzMatrix(ctm), name, image) - - sanitize_filter_options = SanitizeFilterOptions() - - filter_options = _make_PdfFilterOptions( - instance_forms=1, - ascii=1, - no_update=1, - sanitize=1, - sopts=sanitize_filter_options, - ) - - global g_img_info - g_img_info = [] - - mupdf.pdf_filter_page_contents( doc, page, filter_options) - - rc = tuple(g_img_info) - g_img_info = [] - return rc - -else: - - def JM_filter_content_stream( - doc, - in_stm, - in_res, - transform, - filter_, - struct_parents, - ): - ''' - Returns (out_buf, out_res). - ''' - out_buf = mupdf.FzBuffer( 1024) - proc_buffer = mupdf.pdf_new_buffer_processor( out_buf, filter_.ascii) - if filter_.sanitize: - out_res = mupdf.pdf_new_dict( doc, 1) - proc_filter = mupdf.pdf_new_filter_processor( doc, proc_buffer, in_res, out_res, struct_parents, transform, filter_) - mupdf.pdf_process_contents( proc_filter, doc, in_res, in_stm, mupdf.FzCookie()) - mupdf.pdf_close_processor( proc_filter) - else: - out_res = in_res # mupdf.pdf_keep_obj( in_res) - mupdf.pdf_process_contents( proc_buffer, doc, in_res, in_stm, mupdf.FzCookie()) - mupdf.pdf_close_processor( proc_buffer) - return out_buf, out_res - - def JM_image_reporter(page): - doc = page.doc() +def JM_image_reporter(page): + doc = page.doc() + global g_img_info_matrix + g_img_info_matrix = mupdf.FzMatrix() + mediabox = mupdf.FzRect() + mupdf.pdf_page_transform(page, mediabox, g_img_info_matrix) + + class SanitizeFilterOptions(mupdf.PdfSanitizeFilterOptions2): + def __init__(self): + super().__init__() + self.use_virtual_image_filter() + def image_filter(self, ctx, ctm, name, image): + JM_image_filter(None, mupdf.FzMatrix(ctm), name, image) + + sanitize_filter_options = SanitizeFilterOptions() + + filter_options = _make_PdfFilterOptions( + instance_forms=1, + ascii=1, + no_update=1, + sanitize=1, + sopts=sanitize_filter_options, + ) - filter_ = JM_image_reporter_Filter() + global g_img_info + g_img_info = [] - filter_._page = page - filter_.recurse = 0 - filter_.instance_forms = 1 - filter_.sanitize = 1 - filter_.ascii = 1 + mupdf.pdf_filter_page_contents( doc, page, filter_options) - ctm = mupdf.FzMatrix() - mupdf.pdf_page_transform( page, mupdf.FzRect(0, 0, 0, 0), ctm) - struct_parents_obj = mupdf.pdf_dict_get( page.obj(), PDF_NAME('StructParents')) - struct_parents = -1 - if mupdf.pdf_is_number( struct_parents_obj): - struct_parents = mupdf.pdf_to_int( struct_parents_obj) - - contents = mupdf.pdf_page_contents( page) - old_res = mupdf.pdf_page_resources( page) - global g_img_info - g_img_info = [] - buffer_, new_res = JM_filter_content_stream( doc, contents, old_res, ctm, filter_, struct_parents) - rc = tuple( g_img_info) - return rc + rc = tuple(g_img_info) + g_img_info = [] + return rc def JM_fitz_config(): From 63351fe3ac5de7c0e406b23cdc8c3b383304c447 Mon Sep 17 00:00:00 2001 From: Julian Smith Date: Sun, 7 Jan 2024 23:36:01 +0000 Subject: [PATCH 3/5] tests/test_font.py: added test of MuPDF master's fitz.mupdf.fz_install_load_system_font_funcs(). --- tests/test_font.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tests/test_font.py b/tests/test_font.py index 8ca653024..26238bb04 100644 --- a/tests/test_font.py +++ b/tests/test_font.py @@ -75,3 +75,31 @@ def test_fontarchive(): 'path': None } ] + +def test_load_system_font(): + if not hasattr(fitz, 'mupdf'): + print(f'test_load_system_font(): Not running on classic.') + return + if fitz.mupdf_version_tuple < (1, 24): + print(f'test_load_system_font(): Not running because mupdf version < 1.24.') + return + trace = list() + def font_f(name, bold, italic, needs_exact_metrics): + trace.append((name, bold, italic, needs_exact_metrics)) + print(f'font_f(): Looking for font: {name=} {bold=} {italic=} {needs_exact_metrics=}.') + return None + def f_cjk(name, ordering, serif): + trace.append((name, ordering, serif)) + print(f'f_cjk(): Looking for font: {name=} {ordering=} {serif=}.') + return None + def f_fallback(script, language, serif, bold, italic): + trace.append((script, language, serif, bold, italic)) + print(f'f_fallback(): looking for font: {script=} {language=} {serif=} {bold=} {italic=}.') + return None + fitz.mupdf.fz_install_load_system_font_funcs(font_f, f_cjk, f_fallback) + f = fitz.mupdf.fz_load_system_font("some-font-name", 0, 0, 0) + assert trace == [ + ('some-font-name', 0, 0, 0), + ], f'Incorrect {trace=}.' + print(f'test_load_system_font(): {f.m_internal=}') + From b37893fdb9f28cbae2ccfbe195da90fbc12264fc Mon Sep 17 00:00:00 2001 From: Julian Smith Date: Thu, 11 Jan 2024 15:50:31 +0000 Subject: [PATCH 4/5] tests/: added test for Page.delete_image(). --- tests/resources/test_delete_image.pdf | Bin 0 -> 52227 bytes tests/test_extractimage.py | 7 +++++++ 2 files changed, 7 insertions(+) create mode 100644 tests/resources/test_delete_image.pdf diff --git a/tests/resources/test_delete_image.pdf b/tests/resources/test_delete_image.pdf new file mode 100644 index 0000000000000000000000000000000000000000..36b2d1939e50a8dfff3573a61eec267b6a4bbbba GIT binary patch literal 52227 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 literal 0 HcmV?d00001 diff --git a/tests/test_extractimage.py b/tests/test_extractimage.py index 4be817fee..0c155c51c 100644 --- a/tests/test_extractimage.py +++ b/tests/test_extractimage.py @@ -48,3 +48,10 @@ def test_2348(): print(f'jpeg_extension={jpeg_extension!r} png_extension={png_extension!r}') assert jpeg_extension == 'jpeg' assert png_extension == 'png' + +def test_delete_image(): + + doc = fitz.open(os.path.abspath(f'{__file__}/../../tests/resources/test_delete_image.pdf')) + page = doc[0] + xref = page.get_images()[0][0] + page.delete_image(xref) From a91c0322a663e7d20cbc3ec5ca8b6c7132308769 Mon Sep 17 00:00:00 2001 From: Julian Smith Date: Thu, 11 Jan 2024 15:50:50 +0000 Subject: [PATCH 5/5] src/__init__.py: fixed test_delete_image(). To create mupdf.FzDefaultColorspaces with m_internal=null, need to do mupdf.FzDefaultColorspaces(None). [FzDefaultColorspaces() uses fz_new_default_colorspaces().] To create mupdf.FzImage with m_internal=null, need to do `FzImage()` [FzImage(0) will fail because ambiguous with single-arg constructors that takes a buffer or a string.] --- src/__init__.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/__init__.py b/src/__init__.py index 686bfd31c..4ed8ce6b0 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -7753,13 +7753,13 @@ def _insert_image(self, arg_pix, mupdf.FzColorspace(0), mupdf.FzColorspace(0), - mupdf.FzDefaultColorspaces(0), + mupdf.FzDefaultColorspaces(None), mupdf.FzColorParams(), 1, ) pm.alpha = 0 pm.colorspace = None - mask = mupdf.fz_new_image_from_pixmap(pm, mupdf.FzImage(0)) + mask = mupdf.fz_new_image_from_pixmap(pm, mupdf.FzImage()) image = mupdf.fz_new_image_from_pixmap(arg_pix, mask) #goto have_image() do_process_stream = 0 @@ -9418,7 +9418,7 @@ def __init__(self, *args): spix, cs, mupdf.FzColorspace(0), - mupdf.FzDefaultColorspaces(0), + mupdf.FzDefaultColorspaces(None), mupdf.FzColorParams(), 1 ) @@ -21652,6 +21652,7 @@ def _atexit(): Document.set_toc_item = utils.set_toc_item Document.subset_fonts = utils.subset_fonts Document.tobytes = Document.write +Document.xref_copy = utils.xref_copy IRect.get_area = utils.get_area