Finds every PyMuPDF / fitz import, call and requirement line (AGPL-3.0 or paid Artifex licence) and prints the exact pypdf, pypdfium2 or pdfplumber line that replaces it. Runs entirely in your browser — nothing is uploaded.
Same engine as the VS Code extension, byte for byte.
Whole-workspace migration plan (each use mapped to its replacement), a dated AGPL exposure report for the company and a CI gate that fails builds adding new PyMuPDF use.
One payment, one licence key for this tool. The key is shown right after payment.
Aspose.PDF for Python via .NET, Developer Small Business: US$1199 (1 developer, 1 location)
Buy the full version — $29· ReadyStack
Real numbers from this tool, line by line.

Migrate from PyMuPDF to pypdf: 6 findings in one invoice worker
6 findings in a 13-line invoice export worker: that is what the checker printed for a Python backend team running PyMuPDF behind a customer portal.
What Artifex states
Artifex licenses PyMuPDF under the GNU AGPLv3 or a commercial licence. Its licensing page (artifex.com/licensing) says you cannot deploy the open-source edition as part of a server-based application or service without disclosing your own application's full source code under AGPL to any users interacting with it, and that if you cannot meet the AGPL requirements a commercial licence is required. There is no public price on that page. The exposure starts the day the service is deployed to users.
pymupdf4llm, the LLM and RAG helper, is published on PyPI under the same dual licence. So is the binary wheel PyMuPDFb.
What the sample file looked like
The worker opened a PDF, joined the text of every page, rendered page one to a PNG thumbnail, searched the last page for "Total due" and pulled its tables. Six lines touch PyMuPDF:
import fitz -> from pypdf import PdfReader, PdfWriter fitz.open(path) -> reader = PdfReader(path) page.get_text() -> page.extract_text() page.get_pixmap(dpi=110) -> pypdfium2.PdfDocument(path)[i].render(scale=dpi/72).to_pil() page.search_for("Total due") -> pdfplumber.open(path).pages[i].search("text") page.find_tables() -> pdfplumber.open(path).pages[i].extract_tables()
After the rewrite the same file returns 0 findings. pypdf (BSD-3-Clause) handles reading, text, merging and metadata. pdfplumber (MIT) handles word positions, search and tables. pypdfium2 (BSD-3-Clause / Apache-2.0) renders pages to images. The versions in the fixes were read on PyPI on 2026-09-30: pypdf 6.19.0, pdfplumber 0.11.10, pypdfium2 5.13.0.
Why a package scanner is not enough
pip-licenses and similar tools tell you that pymupdf is AGPL. They stop there. They do not find the six call sites, and they cannot tell you that get_pixmap needs a different library from get_text. Chatbots often answer with PyPDF2, which the project itself retired in favour of pypdf. And the PyPI package literally named fitz is an unrelated 0.0.0 project, so a requirements line reading fitz is a bug on top of a licence question.
The 25 rules
Five dependency rules cover requirements*.txt, pyproject.toml (PEP 621 and Poetry) and conda environment.yml: pymupdf, PyMuPDFb, pymupdf4llm, pymupdfpro and fitz. Six import rules cover import fitz, import pymupdf, from fitz import, pymupdf4llm, the LangChain PyMuPDFLoader and the LlamaIndex PyMuPDFReader. Fourteen call rules cover open, Matrix and Rect, get_text, get_pixmap, search_for, find_tables, insert_pdf, page_count, get_toc, set_metadata, set_rotation, get_images, insert_text and authenticate. Call rules only fire in a file that imports fitz or pymupdf, so a Tkinter get_text call stays quiet.
How to run it
Open the file in VS Code with the extension installed, or paste it into the web version. The Problems panel lists each line with its replacement.
What comes next
A single file is where most people start. The next job is the whole repository: every service, every requirements file, and proof for the company that nobody adds import fitz back next quarter. That is the workspace plan, the dated exposure report and the CI gate.
This is not legal advice. Read the Artifex terms with your counsel before deciding between a commercial licence and a migration.
It reads Python files, requirements*.txt, pyproject.toml and environment.yml, finds every PyMuPDF use (import fitz, fitz.open, get_text, get_pixmap, search_for, find_tables and 19 more patterns, 25 rules in total) and prints the exact pypdf, pdfplumber or pypdfium2 line that replaces each one. On the bundled 13-line invoice worker it reports 6 findings, one per PyMuPDF line.
Python backend developers and tech leads at companies that run PyMuPDF inside a closed-source product or a SaaS, API or RAG pipeline, for example a FastAPI invoice service or a LangChain ingest job using PyMuPDFLoader. Artifex's licensing page says server-based use under AGPL requires disclosing your full source, so these teams either buy a commercial licence or migrate.
pip-licenses and similar scanners tell you that the pymupdf package is AGPL, then stop. They do not find the 6 call sites in your code or say what replaces get_pixmap or find_tables. Chatbots often suggest PyPDF2, which is deprecated in favour of pypdf. This checker maps each line to a replacement read from PyPI on 2026-09-30.
Free, with no key and no limit: the full map for the open file, every finding with its replacement line, in VS Code and in the web version. A licence key adds the whole-workspace migration plan with each use mapped to its replacement, a dated AGPL exposure report for the company, and a CI gate that fails a build adding new PyMuPDF use.
Artifex does not publish a PyMuPDF commercial price; you contact sales. A comparable commercial library, Aspose.PDF for Python via .NET, lists its Developer Small Business licence at US$1199 for 1 developer and 1 deployment location. pypdf (BSD-3-Clause), pdfplumber (MIT) and pypdfium2 (BSD-3-Clause / Apache-2.0) cost nothing to ship in closed code.
One question, answered by the person who built it. Your email only if you want the answer sent.