← PDF: all libraries · Reader board

pypdf vs PyMuPDF: which one reads more real-world PDF files?

pypdf 7.0.0 and PyMuPDF 2.1 on the same 1,077 odd real-world files from Mozilla pdf.js test PDFs (bug reports, fuzzers, broken exporters). Measured, not opinion; re-tested by itself on every new PyPI release. Updated 06 November 2026.

More files readPyMuPDF711 vs 664
Faster on this setPyMuPDF13.2 s vs 145.8 s total (11× faster)
Both read655only pypdf: 9 · only PyMuPDF: 56

PyMuPDF got text from more files: 711 vs 664 of 1,077. pypdf broke (error, hang or crash) on 7 files that PyMuPDF read; PyMuPDF broke on 2 files that pypdf read.

LibraryText from🔴 Fails where
the other reads
🟡 Empty where
the other reads
⏱ Hangs or
crashes
Median
ms/file
Total
seconds
pypdf 7.0.066474904145.8
PyMuPDF 2.1711270213.2

Files only pypdf reads (9)

annotation-text-without-popup.pdfPyMuPDF: no text
crypt_filters.pdfPyMuPDF: FileDataError: Failed to open file '/home/runner/work/reader-board/reader-board/corpora/pdfjs/crypt_filters.pdf' as type pdf.
issue11144_reduced.pdfPyMuPDF: no text
issue19326.pdfPyMuPDF: no text
issue9418.pdfPyMuPDF: no text
poppler-67295-0.pdfPyMuPDF: RuntimeError: code=7: Invalid number of pages
poppler-91414-0-53.pdfPyMuPDF: no text
poppler-91414-0-54.pdfPyMuPDF: no text
recursiveCompositGlyf.pdfPyMuPDF: no text

Files only PyMuPDF reads (56)

annotation-tx.pdfpypdf: no text
annotation-tx2.pdfpypdf: no text
annotation-tx3.pdfpypdf: no text
annotation_hidden_noview.pdfpypdf: no text
bomb_giant.pdfpypdf: DependencyError: jbig2dec binary is not available.
bug1250079.pdfpypdf: PdfStreamError: Stream has ended unexpectedly
bug1675139.pdfpypdf: no text
bug1724918.pdfpypdf: no text
bug1770750.pdfpypdf: no text
bug1782564.pdfpypdf: no text
bug1796741.pdfpypdf: no text
bug1802506.pdfpypdf: no text
bug1802888.pdfpypdf: no text
bug1811510.pdfpypdf: no text
bug1825002.pdfpypdf: no text
bug1844576.pdfpypdf: no text
bug1844583.pdfpypdf: no text
bug1851498.pdfpypdf: no text
bug1865341.pdfpypdf: no text
bug1871353.1.pdfpypdf: no text
bug1871353.pdfpypdf: no text
bug1922766.pdfpypdf: no text
bug1934157.pdfpypdf: no text
bug2026037.pdfpypdf: no text
bug2055455.pdfpypdf: no text
checkbox_no_appearance.pdfpypdf: no text
dates_save.pdfpypdf: no text
evaljs.pdfpypdf: no text
freetext_no_appearance.pdfpypdf: no text
freetexts.pdfpypdf: no text
issue10175.pdfpypdf: DeprecationError: The filter name /A85 is deprecated and has been removed in pypdf 7.0.0. Use /ASCII85Decode instead.
issue15716.pdfpypdf: no text
issue15815.pdfpypdf: no text
issue15818.pdfpypdf: no text
issue16021.pdfpypdf: no text
issue16473.pdfpypdf: no text
issue16633.pdfpypdf: no text
issue17998.pdfpypdf: no text
issue18536.pdfpypdf: no text
issue18561.pdfpypdf: no text

…and 16 more: see each library's page.

Don't want to run it yourself? I also run PDF & Document to Markdown as a pay-per-use API on Apify (it uses pdfplumber and pypdfium2 for PDFs, markitdown for Office files). Disclosure: that tool is mine; the rankings above come only from the measurements.

What this does not tell you

This compares not breaking: whether each library gets any text out of each file. It does not rank text quality (reading order, tables, headings), and speed is one GitHub-hosted runner, default settings, no OCR switched on. If you need structure for RAG, also look at the output on your own files.

How this is measured