Description of the bug
PyMuPDF raises pymupdf.mupdf.FzErrorFormat: code=7: cycle in resources when accessing page.rect (or any other page operation) on a PDF where a page object's /Parent entry points to the page itself (instead of to a /Pages node).
Concretely, for the attached file:
- Catalog /Pages points to xref 3 (the real /Pages root).
- Page 0 lives at xref 4 and declares /Parent 4 0 R — i.e. itself.
- Pages 1–7 also declare /Parent 4 0 R (so they inherit through the malformed page rather than through the real
/Pages root).
repro_cycle_in_resources.pdf
When MuPDF inherits page resources by walking up the parent chain, it loops on page 0 → page 0 → … and aborts with cycle in resources. The error fires immediately on pdf_document[0].rect and on page.cropbox, so neither of the workarounds suggested in #2300 (using cropbox instead of rect) nor in #2749 (using insert_pdf to copy the page into a fresh document) works for this defect class. Document.tobytes(garbage=4, clean=True, deflate=True) also preserves the malformed graph and does not break the cycle.
To Reproduce
import fitz
doc = fitz.open("repro_cycle_in_resources.pdf")
print(f"Pages: {len(doc)}")
print(doc[0].rect) # raises FzErrorFormat: code=7: cycle in resources
Output:
Traceback (most recent call last):
File "...", line 4, in <module>
print(doc[0].rect)
File ".../pymupdf/__init__.py", line 10865, in bound
val = mupdf.fz_bound_page(page)
File ".../pymupdf/mupdf.py", line 45171, in fz_bound_page
return _mupdf.fz_bound_page(page)
pymupdf.mupdf.FzErrorFormat: code=7: cycle in resources
My configuration:
Python 3.13
PyMuPDF 1.27.1: Python bindings for the MuPDF 1.27.1 library.
Issues happen on both MacOs arm64 and Linux x86_64.
Attached pdf:
Anonymized 1-file (8-page with anonymized content) reproducer attached: repro_cycle_in_resources.pdf (227 KB). Original file contained personal data; all text was replaced with non-existent glyph indices, all images blanked to 1×1 white, metadata wiped — but the malformed /Parent graph was preserved verbatim.
How to reproduce the bug
repro_cycle_in_resources.pdf
PyMuPDF version
1.27.1
Operating system
Linux
Python version
3.13
Description of the bug
PyMuPDF raises
pymupdf.mupdf.FzErrorFormat: code=7: cycle in resourceswhen accessingpage.rect(or any other page operation) on a PDF where a page object's/Parententry points to the page itself (instead of to a/Pagesnode).Concretely, for the attached file:
/Pagesroot).repro_cycle_in_resources.pdf
When MuPDF inherits page resources by walking up the parent chain, it loops on page 0 → page 0 → … and aborts with
cycle in resources. The error fires immediately onpdf_document[0].rectand onpage.cropbox, so neither of the workarounds suggested in #2300 (using cropbox instead of rect) nor in #2749 (usinginsert_pdfto copy the page into a fresh document) works for this defect class.Document.tobytes(garbage=4, clean=True, deflate=True)also preserves the malformed graph and does not break the cycle.To Reproduce
Output:
My configuration:
Attached pdf:
Anonymized 1-file (8-page with anonymized content) reproducer attached:
repro_cycle_in_resources.pdf(227 KB). Original file contained personal data; all text was replaced with non-existent glyph indices, all images blanked to 1×1 white, metadata wiped — but the malformed /Parent graph was preserved verbatim.How to reproduce the bug
repro_cycle_in_resources.pdf
PyMuPDF version
1.27.1
Operating system
Linux
Python version
3.13