From 7e6c61cf12dfff7886c2401c20efc761d89af855 Mon Sep 17 00:00:00 2001 From: Jamie Lemon Date: Thu, 28 May 2026 15:21:42 +0100 Subject: [PATCH 1/4] Updates PyMuPDF4LLM section with further info on boxclass. --- docs/pymupdf4llm/api.rst | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/docs/pymupdf4llm/api.rst b/docs/pymupdf4llm/api.rst index 8f6789203..6fa6ef87f 100644 --- a/docs/pymupdf4llm/api.rst +++ b/docs/pymupdf4llm/api.rst @@ -152,6 +152,8 @@ The PyMuPDF4LLM API "pos": (start, stop), # 0-based integers: bbox_text = chunk["text"][start:stop] } + See: :ref:`box classes ` + :arg float page_height: specify a desired page height. For relevance see the `page_width` parameter. If using the default `None`, the document will appear as one large page with a width of `page_width`. Consequently in this case, no markdown page separators will occur (except the final one), respectively only one page chunk will be returned. :arg bool page_separators: if ``True`` inserts a string ``--- end of page=n ---`` at the end of each page output. Intended for debugging purposes. The page number is 0-based. The separator string is wrapped with line breaks. Default is ``False``. @@ -220,11 +222,13 @@ The PyMuPDF4LLM API "bbox": [x0, y0, x1, y1], # boundary box coordinates "pos": (start, stop), # 0-based integers: bbox_text = chunk["text"][start:stop] } + + See: :ref:`box classes ` .. method:: to_json(doc: pymupdf.Document | str, *, **kwargs) -> str - Parses the document and the specified pages and converts the result into a |JSON|-formatted string. + Parses the document and the specified pages and converts the result into a `JSON formatted string `_. :arg Document,str doc: the file, to be specified either as a file path string, or as a |PyMuPDF| :class:`Document` (created via `pymupdf.open`). In order to use `pathlib.Path` specifications, Python file-like objects, documents in memory etc. you **must** use a |PyMuPDF| :class:`Document`. @@ -246,10 +250,41 @@ The PyMuPDF4LLM API :arg bool embed_images: store image binaries for "picture" boundary boxes. Base64-encoded images are included in the JSON output. Ignores `image_path` if used. This may drastically increase the size of your JSON text. - :arg bool write_images: store image files "picture" boundary boxes.when encountering images, image files will be created from the respective page area and stored in the specified folder. Any text contained in these areas will still be included in the text output. + :arg bool write_images: store image files "picture" boundary boxes. When encountering images, image files will be created from the respective page area and stored in the specified folder. Any text contained in these areas will still be included in the text output. :arg list pages: optional, the pages to consider for output (caution: specify 0-based page numbers). If omitted (`None`) all pages are processed. Specify any valid Python sequence containing integers between `0` and `page_count - 1`. + :rtype: str + + See `JSON Schema `_ for the structure of the output JSON string. + + +.. _pymupdf4llm-api-boxclasses: + +.. note:: + + **About box classes** + + If `page_chunks = True` the return objects for `to_markdown` & `to_text` contains a list of dictionaries representing the layout boundary boxes `page_boxes`, within that a key ``class`` indicates the type of box content therein. + + The return object for `to_json` contains a similar key called ``boxclass``. + + The possible string values are for this ``class`` / ``boxclass`` key are: + + .. code-block:: bash + + text + picture + table + caption + title + section-header + page-header + page-footer + list-item + footnote + formula + .. _pymupdf4llm-api-layout: From 610a6650ec82b776934d0bce7c98a21dba5f0ed6 Mon Sep 17 00:00:00 2001 From: Jamie Lemon Date: Mon, 1 Jun 2026 22:05:03 +0100 Subject: [PATCH 2/4] Adds UTM params to relevant links. --- README.md | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index a0b98a087..3e27dda94 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

- - PyMuPDF + + PyMuPDF

@@ -10,17 +10,17 @@ pymupdf%2FPyMuPDF | Trendshift

-[![Docs](https://img.shields.io/badge/docs-live-brightgreen)](https://pymupdf.readthedocs.io) +[![Docs](https://img.shields.io/badge/docs-live-brightgreen)](https://pymupdf.readthedocs.io?utm_source=github&utm_medium=referral&utm_campaign=pymupdf_github&utm_content=badges&utm_term=docs) [![PyPI Version](https://img.shields.io/pypi/v/pymupdf?color=blue&label=PyPI)](https://pypi.org/project/PyMuPDF/) [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/pymupdf)](https://pypi.org/project/pymupdf/) [![License AGPL](https://img.shields.io/github/license/pymupdf/pymupdf)](https://github.com/pymupdf/PyMuPDF/blob/master/COPYING) [![PyPI Downloads](https://static.pepy.tech/badge/pymupdf/month)](https://pepy.tech/projects/pymupdf) [![Github Stars](https://img.shields.io/github/stars/pymupdf/PyMuPDF?style=social)](https://github.com/pymupdf/PyMuPDF/stargazers) -[![Discord](https://img.shields.io/discord/770681584617652264?color=6A7EC2&logo=discord&logoColor=ffffff)](https://pymupdf.io/discord/artifex/) -[![Forum](https://img.shields.io/badge/Forum-ff6600?logo=python&logoColor=ffffff)](https://forum.mupdf.com/c/general/4) +[![Discord](https://img.shields.io/discord/770681584617652264?color=6A7EC2&logo=discord&logoColor=ffffff)](https://artifex.com/discord/artifex?utm_source=github&utm_medium=referral&utm_campaign=pymupdf_github&utm_content=badges&utm_term=discord) +[![Forum](https://img.shields.io/badge/Forum-ff6600?logo=python&logoColor=ffffff)](https://forum.mupdf.com/c/general/4?utm_source=github&utm_medium=referral&utm_campaign=pymupdf_github&utm_content=badges&utm_term=forum) [![Twitter](https://img.shields.io/twitter/follow/pymupdf4llm)](https://x.com/pymupdf4llm) [![Hugging Face](https://img.shields.io/badge/%F0%9F%A4%97_Hugging_Face-007ec6)](https://huggingface.co/artifex-software) -[![Demo](https://img.shields.io/badge/PyMuPDF4LLM-live?badge&label=DEMO&logo=python&logoColor=ffffff)](https://demo.pymupdf.io) +[![Demo](https://img.shields.io/badge/PyMuPDF4LLM-live?badge&label=DEMO&logo=python&logoColor=ffffff)](https://demo.pymupdf.io?utm_source=github&utm_medium=referral&utm_campaign=pymupdf_github&utm_content=badges&utm_term=demo) **The PDF engine behind over 50 million monthly downloads, powering AI pipelines worldwide.** @@ -32,10 +32,10 @@ ## Why PyMuPDF? -- **Fast** — powered by [MuPDF](https://mupdf.com/), a best-in-class C rendering engine +- **Fast** — powered by [MuPDF](https://mupdf.com?utm_source=github&utm_medium=referral&utm_campaign=pymupdf_github&utm_content=body&utm_term=mupdf), a best-in-class C rendering engine - **Accurate** — pixel-perfect text extraction with font, color, and position metadata - **Versatile** — read, write, annotate, redact, merge, split, and convert documents -- **LLM-ready** — native Markdown output via [PyMuPDF4LLM](https://pypi.org/project/pymupdf4llm/) for RAG and AI pipelines +- **LLM-ready** — native Markdown output via [PyMuPDF4LLM](https://pdf4llm.com?utm_source=github&utm_medium=referral&utm_campaign=pymupdf_github&utm_content=body&utm_term=pymupdf4llm) for RAG and AI pipelines - **No mandatory dependencies** — `pip install pymupdf` and you're done --- @@ -273,7 +273,7 @@ print(md) Supports multi-column layouts, natural reading order and page chunking. -[![Demo](https://img.shields.io/badge/Pymupdf4llm-live?style=for-the-badge&label=DEMO&logo=python&logoColor=ffffff)](https://demo.pymupdf.io) +[![Demo](https://img.shields.io/badge/Pymupdf4llm-live?style=for-the-badge&label=DEMO&logo=python&logoColor=ffffff)](https://demo.pymupdf.io?utm_source=github&utm_medium=referral&utm_campaign=pymupdf_github&utm_content=body&utm_term=demo) --- @@ -392,7 +392,7 @@ for fmt in ["contract.docx", "data.xlsx", "deck.pptx", "report.hwpx"]: print(page.get_text()) ``` -[Get a trial license key for PyMuPDF Pro](https://pymupdf.pro/try-pro) +[Get a trial license key for PyMuPDF Pro](https://pymupdf.pro/try-pro?utm_source=github&utm_medium=referral&utm_campaign=pymupdf_github&utm_content=body&utm_term=pymupdf_pro) **What you can do with Office documents:** @@ -723,15 +723,15 @@ doc.save("output.pdf") ## Documentation -Full installation guide, API reference, cookbook, and tutorial at **[pymupdf.readthedocs.io](https://pymupdf.readthedocs.io)**. +Full installation guide, API reference, cookbook, and tutorial at **[pymupdf.readthedocs.io](https://pymupdf.readthedocs.io?utm_source=github&utm_medium=referral&utm_campaign=pymupdf_github&utm_content=documentation_community&utm_term=docs)**. -- [Installation guide](https://pymupdf.readthedocs.io/en/latest/installation.html) -- [API reference](https://pymupdf.readthedocs.io/en/latest/classes.html) -- [Cookbook](https://pymupdf.readthedocs.io/en/latest/the-basics.html) -- [Tutorial](https://pymupdf.readthedocs.io/en/latest/tutorial.html) -- [Changelog](https://pymupdf.readthedocs.io/en/latest/changes.html) -- [PyMuPDF4LLM docs](https://pymupdf.readthedocs.io/en/latest/pymupdf4llm/) -- [PyMuPDF Pro docs](https://pymupdf.readthedocs.io/en/latest/pymupdf-pro/index.html) +- [Installation guide](https://pymupdf.readthedocs.io/en/latest/installation.html?utm_source=github&utm_medium=referral&utm_campaign=pymupdf_github&utm_content=documentation_community&utm_term=installation) +- [API reference](https://pymupdf.readthedocs.io/en/latest/classes.html?utm_source=github&utm_medium=referral&utm_campaign=pymupdf_github&utm_content=documentation_community&utm_term=classes) +- [Cookbook](https://pymupdf.readthedocs.io/en/latest/the-basics.html?utm_source=github&utm_medium=referral&utm_campaign=pymupdf_github&utm_content=documentation_community&utm_term=the_basics) +- [Tutorial](https://pymupdf.readthedocs.io/en/latest/tutorial.html?utm_source=github&utm_medium=referral&utm_campaign=pymupdf_github&utm_content=documentation_community&utm_term=tutorial) +- [Changelog](https://pymupdf.readthedocs.io/en/latest/changes.html?utm_source=github&utm_medium=referral&utm_campaign=pymupdf_github&utm_content=documentation_community&utm_term=changelog) +- [PyMuPDF4LLM docs](https://docs.pdf4llm.com?utm_source=github&utm_medium=referral&utm_campaign=pymupdf_github&utm_content=documentation_community&utm_term=docs) +- [PyMuPDF Pro docs](https://pymupdf.readthedocs.io/en/latest/pymupdf-pro?utm_source=github&utm_medium=referral&utm_campaign=pymupdf_github&utm_content=documentation_community&utm_term=pymupdf_pro) --- @@ -741,17 +741,17 @@ Full installation guide, API reference, cookbook, and tutorial at **[pymupdf.rea | Project | Description | |---|---| | [PyMuPDF4LLM](https://github.com/pymupdf/pymupdf4llm) | LLM/RAG-optimised Markdown and JSON extraction | -| [PyMuPDF Pro](https://pymupdf.io/pro) | Adds Office and HWP document support | +| [PyMuPDF Pro](https://pymupdf.io/pro?utm_source=github&utm_medium=referral&utm_campaign=pymupdf_github&utm_content=related_projects&utm_term=pymupdf_pro) | Adds Office and HWP document support | | [pymupdf-fonts](https://pypi.org/project/pymupdf-fonts/) | Extended font collection for PyMuPDF text output | --- ## Licensing -PyMuPDF and MuPDF are maintained by [Artifex Software, Inc.](https://artifex.com) +PyMuPDF and MuPDF are maintained by [Artifex Software, Inc.](https://artifex.com?utm_source=github&utm_medium=referral&utm_campaign=pymupdf_github&utm_content=footer&utm_term=website) - **Open source** — [GNU AGPL v3](https://www.gnu.org/licenses/agpl-3.0.html). Free for open-source projects. -- **Commercial** — separate commercial licences available from [Artifex](https://artifex.com/licensing) for proprietary applications. +- **Commercial** — separate commercial licences available from [Artifex](https://artifex.com/licensing?utm_source=github&utm_medium=referral&utm_campaign=pymupdf_github&utm_content=footer&utm_term=licensing) for proprietary applications. --- @@ -760,7 +760,7 @@ PyMuPDF and MuPDF are maintained by [Artifex Software, Inc.](https://artifex.com Contributions are welcome. Please open an issue before submitting large pull requests. - [Issue tracker](https://github.com/pymupdf/PyMuPDF/issues) -- [Discord community](https://pymupdf.pro/discord/artifex/) +- [Discord community](https://artifex.com/discord/artifex?utm_source=github&utm_medium=referral&utm_campaign=pymupdf_github&utm_content=footer&utm_term=discord) ## ⭐ Support this project From 783b327af59d51747b805e62b01013df7079d843 Mon Sep 17 00:00:00 2001 From: Julian Smith Date: Thu, 4 Jun 2026 01:04:29 +0100 Subject: [PATCH 3/4] tests/test_rewrite_images.py: added test_4918(). --- tests/test_rewrite_images.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/test_rewrite_images.py b/tests/test_rewrite_images.py index b3cb290cd..0317b5273 100644 --- a/tests/test_rewrite_images.py +++ b/tests/test_rewrite_images.py @@ -1,5 +1,7 @@ import pymupdf import os +import util + scriptdir = os.path.dirname(__file__) @@ -13,3 +15,25 @@ def test_rewrite_images(): data = doc.tobytes(garbage=3, deflate=True) size1 = len(data) assert (1 - (size1 / size0)) > 0.3 + + +def test_4918(): + ''' + By default this test does nothing, because it requires a rather large input document from: + https://drive.google.com/file/d/1OkIq3XJuKiFfKDWBIcAk8_fLLjpNkuHQ/view?usp=sharing + + It's non-trivial to download from this url, so we only do anything if + environment variable PYMUPDF_TEST_4918_PATH is set to local path of the + input document. + + As of 2026-06-04 this passes with mupdf master, but segvs with current + pymupdf release 1.27.2.3. + ''' + PYMUPDF_TEST_4918_PATH = os.environ.get('PYMUPDF_TEST_4918_PATH') + if not PYMUPDF_TEST_4918_PATH : + print(f'test_4918(): Doing nothing because {PYMUPDF_TEST_4918_PATH=}.') + return + path = PYMUPDF_TEST_4918_PATH + print(f'{path=}') + with pymupdf.open(path) as document: + document.rewrite_images(dpi_threshold=150, dpi_target=100, quality=50) From 65985cc82674edd5128a01de8b2a767e12cd641d Mon Sep 17 00:00:00 2001 From: Julian Smith Date: Thu, 4 Jun 2026 17:43:12 +0100 Subject: [PATCH 4/4] src/__init__.py tests/:JM_choice_options(): fix #4114. Use pdf_dict_get_inheritable() when looking for 'Opt' array. Also added test_4114() to check the fix. --- src/__init__.py | 2 +- tests/resources/test_4114.pdf | Bin 0 -> 106979 bytes tests/test_widgets.py | 18 ++++++++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 tests/resources/test_4114.pdf diff --git a/src/__init__.py b/src/__init__.py index 910862111..bfa801be9 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -18933,7 +18933,7 @@ def JM_choice_options(annot): if n == 0: return # wrong widget type - optarr = mupdf.pdf_dict_get( annot_obj, PDF_NAME('Opt')) + optarr = mupdf.pdf_dict_get_inheritable( annot_obj, PDF_NAME('Opt')) liste = [] for i in range( n): diff --git a/tests/resources/test_4114.pdf b/tests/resources/test_4114.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a06fdaa105edb0e526f585c652bb705721fcb3cf GIT binary patch literal 106979 zcmeEv1$b3Qw|0P_#oal$v~b*7EI@D#q)0fBkQ|cG7!jnUcyTLUplH$J7OX&_xR+9j zTY&<_z1aW0v-g}FPOSI)?sxzH{!f!^Y>X77rv8#Ju0uVKkm@#?i> zCv)X6>kJy5Cc0aXTs3QIn}Z3d0WW^vT6oy!>&LO`1L|8nK%6YK1*)MPg1%Ar&L^cIb{(?rQQ zgU)PD7N@rxlf{{Jx@2)ylPOu8-KzJDGwOA=WN`*lvU-hdmj`}Ev)-O8&SFm14x=?W z&PKa28O|o1#p(&qWY8sRhskJ4)((@&nyeiri#}O9OjdKUc9_typ7nwclC{IEw|?8EY+yF&Y=-&`8rmCJ(Om{}J-wxNO|uoOU%!EGL*IrC z>o+j@+6*SU&0;V%)YY$Vt!Hmoo1!g8TzpV$ydubSxpGvj=-aAct{m?RI@c3qof*vU zlB&+A(D*Qo(XQ9l*O>G=ZNu=0cxSA(VMI{8vw<@>I>f1M0vT%6w$*^H+D|n`qp^1F zxcFFSP$Z=1*=~V>dAkP&1{~RWaA#oGV>^!x^m?5$BIlnuKgwCMOwpo6H{|c`2-JA5 z@6{^&{l+^d4~=bBqsyn~3ih6V|74{+M-R*#a&PvD8QcCmT+f=jonuVB zrh7|GuNPjdRH#%5bg;{}l8{a&?dg!UkwG(%LIy=jH&FY}Q z7u&KmK4jEAn4Rh8UOE3GW-q~X)X zm+|V+vRk03PnH}38ovzLbY7z;4R4Su2h^L|C#s?|o5^!hcdET?NvV6=2k15UcYr-Z zoP7f9c8y7AbZC{%ZygjH83#tMA03ep85O57lG8)NgX5!PHF`ts+Uf|K+IdDY<7zX5-OPxrUs0QFPCOhx%WxX435R$`qP)R7$9e;i976A}IDVjvL^> zTWJ68K@o9I)ZD@u9~2T4AEdEE@L)vw1jj}p^?b_*3TB);LJ3a1I7HDVCm}#Gp9rRt1i3Sau1y+v^ZtIK>V7s;L zoPFXUZ55UwYq_%t!LrQ(W@3XfJE(+w&-g9?uph=^C=8B}-%6&@`pk*>lssPGIbJX(NEH>&WA0-htOTUk!+ zRzGKOe1P6o!(s)gECziIJ%o+PU}Xe2TRc0oZ4wqGE}NL1$4BF{Fuz zA}-QG#FRE7>|1w43_4|$NJNYV!{4Ha7`18fh%ue6Vc)tVA}e+wVl}IXq|GBjY@~@u zI?T$xeGd`q`xG%573MXk!>mGXrHM$|!w6pG!aQ#jtC|D9z|4vW;EzXfh3BgEzlIhE-ggNY4eEC@+l!=w*e36 zaw%C2#KUOqF3aGo%IqCiz4FFLnK|vYD!z689XJc-l7awiHJcb z3=~azh@>l7O=$}>VQ9HiM2dLXHSmmx;hY{K=}J~p+5$~jdhUqGid~49B}K?IsTxMg z6eBHWg{w799`Tf{MzdW|Kq4X~t-+WkBFZEuO+?ZbXa-NoDosU+2pltN*QAYzu!++` z#GJN36UMfC*GLiXLPQnu=}{zon^m87*LX@+X`vZupmF%xm98?;WHs1QGoF>HW||aH zJp!qiiekFqP7yg=B_gtG(nBO&o7Iwb*NFL!J0h6537&8vf@uY9*7OibSF)PZW>zub za!16VH`aiis)2*Oh8|uF_~>ew;21VS!s1G`Ytomj$+|{cuTg-$hK|!)pVpW%x1@y* z^GM9?T{ABcrD7;2cXYUDn=9@mz0RJJf2l=Kd~A3h!q@23%kAEwO<}GsoDnd06co~! zhj(bztp_Hf+IqqRAfa1rH4JcnP)A$L4mbc}BPp*m`Xtv> zaFAc|&ArOKY*qTVvz_(DUq^m|tvnQWeIQsZ(+t;CIKUjBVT;FdV6bSVC@}r`a zQu1+$#(5BvNb0pMgCd>69iy!m6z8P(LOeO+!-Iod&KPu%!f-+mGn3mCStO~j8-#c7 z?u3U0zK{TeN!ty6YNs|hC^kAu8yp@RoDkVP!r4a~0(VMqFgz^Uu!N}4pxA`Sh@gac zZFFdKl=CxfEWAJ3`0$7jCzw#%Ga)+O8HcC{C%iV=(Ac0}Ag#fs?UoP`fr)-dP-rMT z$Vw2>Ekf&zhzO5~3y;$}BSV7X!nE*EGUyIpXLyvhdu&i}d^pevO$d(=U?ZH}EBZJ`gjM9cUL*d)h#zZ82Ca`^46Tn+n~xi_`3P3h`na0zBN)ubS6g3J@2eE{RSNsM74~(N zYNF(6qU34fmZym;k8gaKwxv>CD z{oRWCyUKJ_65EAE$AXoev60}>ZV_?XAf;@Ok{sk#Hb|*9$OQtc+Zbm-7@m?0=u-?X zty3xNbSsQ*QW-K_$rG;R33tmA?#kl?8KRWxqLu8?O7>{C?9pllSE-QjUg22&iB^b^ zpcG6{3MRM}OmLOxt0ZEKf(U(Ov_mmTq}$kCP`O!(QlqqsO>nw|S_5ZXaBO%CR~yV+ z$Ayo!c~D$@{VFn{!!sv&q8hml0*nl zqI{y_!d=g<>fKRwvnAWcJ0m~U*v!JUEX1{1UqnzSmPia(spumx(-qUljRC)X_G< z5=MBij}Xc_C}eO|RH#M|yVR#wsDg{hq}R3xhs=snBdkbeQyQZw?k#n5u&SEfV1?XI zzB1^pP7k*~7kh4hzBd`)?cV0w@|y*l^IZ0eobr3KJpmsEeErRz^(Qy=`TcmksTJ01 z!oC?W$2jENK<_{OALZZN*;{A)(thE~EjN3#JgPlZt*dkNsLq{d9m_L*+^kC>T}!^a zwfOtQ=xp{m$BJDE*2g13s(xGW6O#?U{MMwO_G&$L@gp2V(d@-TRz-5J#WaGvST{6m_0&MXVU7v^(UL#T?ubdd(w_>KLp(9e0*s3`3o1# zDp9oVH@iwy`0l&-2D)YiPOXYtxunpEEES7QnSUv;;)LM;fdX!FS=B#Z~qJS<&)>u+n9Uti|IeT-FRs1jtd`m zUU>G&q2KP6y8CN@?QAY{$qTW+pYMM7`Hf~@d_4EWj*_nui@oT&;KaRqC#KilF>Gtq z?Rn?f{Krh1{KaSf^}fn+)X>s5aY@_p?RJDsAJC)yiU-jbmQ5VItiex*4la80@$39e znvT7iA=_6+E(}k2KF?k<@Q<#hwkGq5zV~|%ux&HXv|hNe^yIgO3WKdh>y#_oIef;W zMHw?TxEouyN~e|j9-n?T;_9j5-*w--w@Rm|Hn&gLYJ6hY{`*I=Rm*fJQ_~BNzrHjx z!$-5Tl&jRFu4eGs87*oK%62@{oip`!znl8WU%~ljb=%}Te0r;4a`==*yRu}weav9E z)_7}$hkL9AN{;utoS|;et`$F1iHmxd0z+Tiob<`!ed z_1@6+uUf{X1)@WLXtv*bt9N3%ZW~^;d-ZF<-un_-^n4ytctK&yXPPWA+g=$?4Xjss z^QD8fuUhGR#!eX1bHCwowB|scBbToHF{bh;L%9wL=vO}f-E!l4&$(R1Htv=$|--*e>~!|t&` z1u8u5uy$$1Aye8|AAC}KLN&|Q9<9vJ);|iU|6S%yl_GY0vNfS=)y+q9cewuNz3X#B zhj+byvuOT5<15`NIPY+Q$#ZkAz^&Sj*;g#mfJI`U7p-4H$^0B^Mo|49r0oN zsCDK+=BTZW{_OnH+;!8%8INbS)Q>M{-4xTY{^0EUzi(c1#8g9k;Z=YA`eu9Yt)rHY zn)v#{l$X`IhWt3Cn}4P~?@rlbdJX^jYPQGU)LmAtP}%lpba{WMdcm+N(BvJ}qsg2y zqblz|H!*KV?;yViw`#TvZ8fWDn_m~TYt{Ud$g4T3-D$G8|BSNl{I53o%J_XWgiE)H>Dk_4LTjMVhX@ zynjLo|6lj)iJutsz$hY!;xmVU~@#lTt%ln(Z zyf**-=%Oz(&VSyk=a>y;pRYUk?d>_6}F`?VmjVlDG4Ir#_D>Hr=XSakqcmyUxd7Eq~m$VzYh&Y%O+t{Oa1&;0iX! zuaTMV9-E)<(H~#Ds<^z<^~xv1*1Xm2KNDs?dTZs@@uANOwmNwKL4_?PZOs;k{r2GK zHG5Y5#*+0ueR;O}fwo<0dGC51^Xi-PWp)KmI~Cwv;AQ`={Sqo%s!{88)bQ%PwIyFf z{ZM1}qq{|xKWTTp(K>9BMfY^?l#3QyzQ4-$=(xAU%!aE=Brb2(<&xK+%I57^ zrmo1BcyCSJEg1%m_q|(U@yEsXAL~`Cch3==2)hYZg@@3XTLmgGy!&@-Y)mXFOv zFFc+Txy5$A!xsPTna9-KzVUHvn>}x8T7K+bd48wBWxF=yYSHNXPH(qHj}My}HF{XT zbL9s1*XOL7@tY#e3{e}_*WUAWl?g}v&U9F@=+9;!kCL$}xydTf2v zc60V4M?3V7_`Jk`QUPCnGWW)B!%VyW*k9uAszTFOZ}@3>)w4yXH`!{+@$I}uFAe#Y zUo3O8*|$~tf84Cwxx72S+}NeeguE};>btHT^wK|H#p@$K___J3zy^)W+|L-jddnx* z+GhCLv3Kr@s)0F&hZM-8@4F<=f<-y|T*;f|tG_1Cs(C6y*JGQr+%4k0^0NTv$=jEv z?dfhg`swn@nad1p-O+b_?=jzPuDxQ!)P;QqcWM+nvS0?keES^zeY%wDl4tl`W9+)U zoj>Sby>7|e=Q5tzV(2mMdG2i`vrO@SHg@26Ysc-CidMb9Zcntg{=)q#o4>d+GW*ut zA>XX}bmfyK+jgJ1ePDCsgyJVZ*F0F1Z)n8rpMS63A@{P}d$#|yA*{{hL*G`;t_^%X zeV%TxeRAiOy?yf*h_8|5<;y>ex_}Em?3~r|;?`HObAn=S_S{``OrfUh`yB0edvVyV zO}ZI*$2@=VGPr1-F0D#iANCw#FJx*xXZ!MMb;1gsd-0${<0-XTyxpi-u`s)#&DFKb zBEKl``MboI6<=07_QU>mX}9I46Iak zNXdCU&Tf0Q*{{&5@vEwC-?V(k3h#y){i5R%{mIkcTaT`4es;?2vlRcbCldT1I*|`K0+TfkkUSxYGXo#zkZ9 zRkLP)c6maZeU>`wri_Zp@~g?WR9ufE*{4Pp`02YkUOyU-P04h^ylvRw5-)yUcVcMl zsZWM(Zg{+ce}RMfBAic0J}aNAe}!T{E&aU8=r_}b*XTOARO0v+MT@prlf!ph=M(+% z&z?N9KqhVb$U<53{66%rhxumA`8niVAA9!}nYw1aQEkfGB@cT%e6x4-hk*lL?Vk7Y z%89QZm-wz*s83vpZJWYsKe5&uJ9puXWkau(4%_9c>%6~v_J#ur-Rpm({IF}G7modu z?T~K~)39IX417}e=ZkOhwD|D(>D9|K4*xP>)4ovy9rLriu4X#D@pR!2x7~Q#`?}rw z%J1Xh_bxi_%*wO&v&?gi+EGvY4;eW8#O*@a*G+ua=IQunb+#`U{`KQi7e+t0dZg_1 z!u5+Ee%Jiyuw1XRKdyga&;2`{ibq}@lGovAR5rV|jcvM5oqc5%nHPk2vj+!`%R6;W zlL95iX#Cm?`?1uI`ND61f3a1jpZBfkJEuvE-B#+8$AOuWbA7uj&(TWF%XhhXu4m%g*2nFYDs}!TXYk<;Wj^zneYMZ4JGr_)eV1)kv5|+q z*gLGxj0;mg-&=TYmb|OAS;If^u26VNm7?>_i3wkyySj6E+t%5aHXl^IX5b+2s$b12 z(Co?1>X`y76fNGMZb7fMl~#W@v`S1S%YqYU+ZLZ%Da)3Ye?-12nk%qC(^fyWJH3DB zaj(r^XUo}SpjRfZrstRFQ*_F>xkuBTkC?=ciB#qziZlQH`N&80q9a05pOh#InyyL6 z-X=dZv1`w!1dtoFY(GZ7neWOLQsC5q21 zg-Kz6!K~wEMa&a*|JN?okA0ok=z@JkxNLZ~Vk;MR)e790F4C}p>^*#uN0v!1G$1c8 zGhoOIyJt0aEE-y|UT48RG+yE!TQtnr6wZ5Itlx+Y*D{TpuVtFd$FjV)psY-@1HQax zyr4615becIH{vYrk&pMpM}~}-ZF1p`JiI4uWSR__pE!y(A|K;fw@fE&6X*$M6(RR; z8PVs!K;;1DWG>9HmEw#bSS12&;{)5y5~4jUsg`D%r~?of$HJl@6YT6r7Q{V~Vg_dB zy;6rnQ-(xS)^EioI|Igvp{c}}QpIMkAi}9>Ts4K)XopCastDFjh>OjOH4<(93 zf}x4(0I=8?7xEmXh~p*dl=s8|7ja<7`ei;D3OGzBt}KUp;_faHj96VW2uZ3CfStg+ z3C6A}evQ z!qIKSt}>B^9%O#TnIWc3fMdokZBes|ftd<~Wz=U8!ne%wI1S{wgs5i+rEm$PT^!+- zfe5=_%p)$u3vO@=$!d~AT=|gSRUybI8|)c!D2N^e((Y;Qb@SdmE!jN?!$u~HC(#I3 zr*o6dZvK4L%WZ;1oVJs@^Q1#j=X7~}UuAlowMK#XvJ*!|=F()V^7Ggt;iI=4nSEn- z-n`8+R@Xjye!bM%rN_U@`shlj8N*APkL_EvFTAt!arqtD}5`)cv4wcEb>Z2G55r{}ESu}}Xshpb=ZTDx?sZmQq3@|(^KKiAFC zxYri%6L)m`Ywz_Ldf;7RrE?pf%(`aj{K@<>h7n#5%jl}rDKnvUwK}8U4)m?ju-GJ@ z;oe0SEYEb@>+?xEuVI5WdR6xt_47|7D-T>eF`L&X1083A^Q_KlD>yJNzLeJ}!?*(8 zb!UaygED;d?%?bni(T%V-}|yx$;!R@<<4{2+Gx1F$ih6E#^=6qq2ZjsmOU~Bwmh{l z)4(eJ_Re{K9NlYX;r(sCK3Uys+mii#qXrczvY^=q+m;**_v+JT%I=B;#|Iff}y60uC-MUxx`mO8Jh72zp_i@WB*WPrz zk=bDwF!aTfMguc=wd{1Yc}lZ8aac)(&jV7tj=H}{K_$yo19 zPbU8enVfUj^Njtomii=qV8zW%n(x#d?=`LDueqBgZY_6U(4YpEf;W#R>Lu?wC^b zs+4KsJEz{MW3TSN($$#%wpisa9*i!!_wxK5Efd3ju>EziXtjl3mALD-z32KO#`Xz4 zYH#aWWWbr>LHQl+Pwnt~wB@JXJ)akC6!-R->DvoGyskE@%(B1CAD7t|lfQTL?dNkc z=1J^Z`_(Y z22&=dS8*@zr6WEp?NvJVtE|6yMLa4UFtGa08kuG-h|G}pyN#WFynZT_t9?xx)N=KWP6nZFj2c|Rrd6iDV#LNb@lQ1Zh5nvl#ViyNQnKPjr+Ht<-n z4T(ihW_xVBa$wJ_aX${&{$1Z0Co2BDc-i*Xg#x`!ue-h|CBcm0s?MogR+c)V|FM=i z<|x+O#-8h*+5s2S|FM=ypnt68_pNowDJh2k6>C{c`&CbdOEP2sOR~e_?ps1SPijGH zx#1TXE)F{6T~(u6%M-^Ii5#-&*6bVO%kG@&-Kop(&#qhB`EB?h&mUH!sZ6cqv!5M% zHE)jd>BNS;v#lHR=5pIj;}U-#Tyt34I@uz>yMJL@ziWTg=#}3;3X=I|%$YnrCr5s` z?DVW{M{hYUe%b7YS_3W|dv<w zwPj+TzoHhGd6qxq>HY4rrua?EwE4vFJ0Y-{ZJAHpK7PQmx8=|u-%Xp8;P`x8Psg_S z2A7<9GhFQ&*sja{*7MqR8Qlw_dBKx@?JRd!_pZ_H}my^ zXg(-J^GdH-3&OqfPVOm0v$=f-uS1Gxo|+?LjMq4d<~*0%Q#3E^y=i=w8%HRbdq6ag zj?CoMrqk~+KHl21%R6Zr`L;am^o;Ya*lEZAlJ z#PWSklp7vUxlhmiUX2o${NWvg?BxNU2N5HcJ8iSra{c^?a`9>zmdYaQDGq(-&P@Gk*6n)1)mI3(wy1 z;@0=~7aV-ow}`fy@419szy0KVRQ729P5YMryya8>bH8>hIpf{0?RuU)dcM=VsnP`yLaUpZW+{jXRhHVDqqZCEjc4cmYCgN_qx1$L(J}Zw+=ra zSYq6@+hIrNEghO?^o>t{=^b`&y;s=1XB!K9`CjOfdvM9mH?Ok|j*a?oTJ7(=j~|M> zUcC0;E+vO;EdR&#XR+P`yF_WT9?1Q}`7YzSj_T5KavWn<-#b3Ke1^^!?k^ZRe9(=N zvCVVmEYf^uV!lG9AJ3{(bbOQ2ou~U<$a|^MEmKR|!k@K=F22bZ=+(7i@U#?|kG@7# z=%jU$TyduUjdSD{yyODg=EOmA#l!or9V1uIpz{>D+=Y!pPj9Tj$$LE@Vt- zGp6FfPuu_8r_lo2=dWs2xVh_VQ|{NRa%Vh}^T7SL-`;=ldhN1lqq}`N>HG1~**DLa z`1sc3d@UD!Q0~C`a`vDX(+aGNn=x}%ww7Zzglwr4`g`U9by~b@bg|Wt*V^B&UVVM- zT%P+QHXh$NApXUt=RbM$_*nb7;JccHZjwtf3P zdYb5ndVTlTE7eXd>bker{jkJ~!xmh~yZc1-%12kUdU>&5c&p)IPqf3|uE_d!U)cJs zufoR6>H5;JuSmIqi%0dG7#F?b;F8uqb{ux`kHRNHKXRB3*V*v>r!Nwt{G0grSNhrM zeB8fO|B)XpZul^-*pcYZ9f`Y+?+9Bo&~iZTNIZSv#v1HMEGTv)mdB37$BQ!68*%n} z-gzPRy-PZdE!(tx@PrxHi!KP+Jl1c=y&;n$8o%x`XT-sskMb_O_j2d`r<#vSXUSjT zfETtTj;K_+uJ`3ZPyd*AWx(iCZ}i!l>(3i*ymAyfxc*>VP$sXZp~b$5ne3SQ^2W?; z;~G_cFi>tu9E2^2SHzaYrmiiC&9No%$e5O5OJaeg#^})V6+?zO1_xAIbN0(o+s#KV z1UXKguQh#Pn-6B1%MH8S=ecubz8rlo_y6#kt>576J%)yisXsMC|MC;ZG}l*t+}_JHtnzodAE(z|{mJae z72^ur+1)*${nm~@d}Mty*>X4J(Y1%4_uVmM(ayqubu6~{qtT;^m0Vmhe0`21^L?jJ zJ?-3(`{cvG<$lg#C3aV8d}C=yfr^=?Bm|bdHK_BN1O8v!o?tf(Ydre$jMZw(�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 literal 0 HcmV?d00001 diff --git a/tests/test_widgets.py b/tests/test_widgets.py index 2ba7a0afb..4158f6e18 100644 --- a/tests/test_widgets.py +++ b/tests/test_widgets.py @@ -447,3 +447,21 @@ def test_4965(): print(f' {name=}') print(f' {value=}') print(f' {f_type=}') + + +def test_4114(): + print() + path = os.path.normpath(f'{__file__}/../../tests/resources/test_4114.pdf') + path_out = os.path.normpath(f'{__file__}/../../tests/test_4114_out.pdf') + expected_values = [' - Select One - ', ' ', 'Cincinnati, OH 45999', 'Memphis, TN 37501', 'Ogden, UT 84201', 'Philadelphia, PA 19255'] + expected_values2 = [expected_values, expected_values] + values = list() + with pymupdf.open(path) as document: + for page_i, page in enumerate(document): + for widget in page.widgets(): + if widget.field_type_string == 'ComboBox': + print(f'test_4114(): {page_i=} {widget.choice_values=}') + values.append(widget.choice_values) + widget.update() + document.save(path_out) + assert values == expected_values2