โ† PDF: all libraries ยท Reader board

pypdf vs pdfminer.six: which one reads more real-world PDF files?

pypdf 7.0.0 and pdfminer.six 20260107 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 readpypdf664 vs 649
Faster on this setpypdf145.8 s vs 179.5 s total (about as fast)
Both read643only pypdf: 21 ยท only pdfminer.six: 6

pypdf got text from more files: 664 vs 649 of 1,077. pypdf broke (error, hang or crash) on 6 files that pdfminer.six read; pdfminer.six broke on 7 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.06646004145.8
pdfminer.six 2026010764971404179.5

Files only pypdf reads (21)

Brotli-Prototype-FileA.pdfpdfminer.six: PDFNotImplementedError: Unsupported filter: /'BrotliDecode'
bug1978317.pdfpdfminer.six: no text
bug920426.pdfpdfminer.six: no text
crypt_filters.pdfpdfminer.six: PDFEncryptionError: Unsupported crypt filter: param={'Filter': /'Standard', 'V': 4, 'R': 4, 'Length': 128, 'P': -4, 'O': b'Vo\xa8s\xee3\xc7\x97\xcd;\x90O\xda\xd
franz_2.pdfpdfminer.six: TypeError: unsupported operand type(s) for +: 'int' and 'PDFObjRef'
issue11549_reduced.pdfpdfminer.six: PSSyntaxError: Invalid dictionary construct: [/'BaseFont', /'AASGAA+Arial,Unicode', /b'MS', /'DescendantFonts', [<PDFObjRef:56>], /'Encoding', /'Identity-H', /'
issue1293r.pdfpdfminer.six: no text
issue18099_reduced.pdfpdfminer.six: no text
issue18117.pdfpdfminer.six: no text
issue22011.pdfpdfminer.six: PSSyntaxError: Invalid dictionary construct: [/'Type', /'Page', /'Parent', <PDFObjRef:2>, /'MediaBox', [0, 0, 595.276, 841.89], /'Resources', {'Font': {'F1': <P
issue2931.pdfpdfminer.six: no text
issue3323.pdfpdfminer.six: no text
issue4402_reduced.pdfpdfminer.six: no text
issue6108.pdfpdfminer.six: Error: Odd-length string
issue7665.pdfpdfminer.six: TypeError: 'PDFObjRef' object is not subscriptable
issue7901.pdfpdfminer.six: no text
issue9418.pdfpdfminer.six: no text
issue9534_reduced.pdfpdfminer.six: no text
issue9915_reduced.pdfpdfminer.six: no text
perf_text_cmap_mixed.pdfpdfminer.six: no text
prefilled_f1040.pdfpdfminer.six: no text

Files only pdfminer.six reads (6)

Pages-tree-refs.pdfpypdf: PdfReadError: Detected cyclic page references.
bomb_giant.pdfpypdf: DependencyError: jbig2dec binary is not available.
issue10175.pdfpypdf: DeprecationError: The filter name /A85 is deprecated and has been removed in pypdf 7.0.0. Use /ASCII85Decode instead.
issue15893_reduced.pdfpypdf: FileNotDecryptedError: File has not been decrypted
issue19800.pdfpypdf: PdfReadError: startxref not found
issue6069.pdfpypdf: PdfStreamError: Stream has ended unexpectedly

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