← PDF: all libraries · Reader board

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

pdfplumber 0.11.10 and pypdf 7.0.0 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 227.6 s total (2× faster)
Both read643only pdfplumber: 6 · only pypdf: 21

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

LibraryText from🔴 Fails where
the other reads
🟡 Empty where
the other reads
⏱ Hangs or
crashes
Median
ms/file
Total
seconds
pdfplumber 0.11.1064971405227.6
pypdf 7.0.06646004145.8

Files only pdfplumber 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

Files only pypdf reads (21)

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

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