Independent guide. Not affiliated with the pdfplumber project or its maintainers.Official repository: jsvine/pdfplumber ↗

Independent guide · examples tested with pdfplumber 0.11.10

pdfplumber, explained and tested.

pdfplumber (sometimes written “pdf plumber”) is an open-source Python library that reads a PDF the way it was drawn: every character, line, rectangle and table cell, with its exact position on the page. This site shows how to use it, and every example is run against the real library.

$ pip install pdfplumber
  • 0.11.10latest release, 2026-06-14
  • 54.2 MPyPI downloads in Oct 2026
  • MITlicence, free for commercial use
  1. Table cells · 40 cellspage.find_tables()
  2. Lines & rects · 16 objectspage.lines + page.rects
  3. Words · 151 wordspage.extract_words()
  4. Characters · 851 charspage.chars
  5. The pagepdfplumber.open("invoice.pdf").pages[0]
Real output of pdfplumber 0.11.10 on invoice.pdf

What it is

A geometry-first PDF reader

A PDF does not store paragraphs or tables. It stores drawing instructions: put this glyph at these coordinates, stroke a line from here to there. pdfplumber, written by Jeremy Singer-Vine and contributors, turns those instructions back into Python objects you can filter, measure and group.

It is built on pdfminer.six, which does the low-level parsing. pdfplumber adds the parts people actually need: words from characters, text with layout, cropping by coordinates, a table finder you can tune, and visual debugging that draws what it found on top of the page.

Because it relies on the text layer and vector graphics, it is exact on born-digital PDFs (exported from Word, Excel, LaTeX, reporting tools) and has nothing to read on scanned pages until you add a text layer with OCR.

PDF bytes are parsed by pdfminer.six into layout objects, which pdfplumber exposes as chars, lines, rects, curves and images, and turns into words, text and tables.PDF filecontent streams, fonts, page boxespdfminer.sixparses operators into LTChar, LTLine, LTRect, LTCurve…pdfplumber objectspage.chars · page.lines · page.rects · page.curvespage.images · page.annots · page.hyperlinksTextextract_text()Tablesfind_tables()Debuggingto_image()

60-second quickstart

Open a PDF, read text and a table

Download invoice.pdf (a fictional sample) and run this after installing pdfplumber. The output below was captured from this exact code.

quickstart.py
import pdfplumber

with pdfplumber.open("samples/invoice.pdf") as pdf:
    page = pdf.pages[0]

    text = page.extract_text()
    print(text.splitlines()[0])

    table = page.extract_table()
    for row in table[:4]:
        print(row)
Outputcaptured · Python 3.13.18 · pdfplumber 0.11.10
Hollow Pine Supply Co. INVOICE
['Item', 'Description', 'Qty', 'Unit price', 'Amount']
['HP-1042', 'Stainless hex bolts M8 x 40 (box of 100)', '12', '18.40', '220.80']
['HP-2210', 'Aluminium extrusion 2020, 1 m', '40', '6.95', '278.00']
['HP-3307', 'Linear bearing LM8UU', '64', '1.85', '118.40']

Every word knows where it is

coordinates.py
import pdfplumber

with pdfplumber.open("samples/invoice.pdf") as pdf:
    words = pdf.pages[0].extract_words()
    total = next(w for w in words if w["text"] == "1,118.23")
    print({k: round(v, 1) if isinstance(v, float) else v
           for k, v in total.items() if k in ("text", "x0", "top", "x1", "bottom")})
Outputcaptured · Python 3.13.18 · pdfplumber 0.11.10
{'text': '1,118.23', 'x0': 513.1, 'x1': 552.0, 'top': 474.1, 'bottom': 484.1}

Coordinates are in PDF points (1/72 inch) measured from the top-left corner of the page. How coordinates work →

Know before you start

What pdfplumber is great at, and what it is not for

Taskpdfplumber?Notes
Tables in born-digital PDFsExcellentRuled tables work out of the box; borderless ones need column positions, from the text strategy or placed explicitly.
Text with positions, fonts and sizesExcellentEvery char has x0, top, fontname, size, colours.
Cropping regions, removing headers and footersExcellentcrop(), within_bbox(), filter().
Seeing what the parser sawExcellentVisual debugging draws objects and table cells on the page.
Very large batches where speed matters mostWorkablePure Python on top of pdfminer.six; slower than C-based libraries. Measured numbers.
Scanned PDFs (images of text)Not aloneNo OCR. Run OCR first, then use pdfplumber on the result.
Creating, editing, merging or splitting PDFsNopdfplumber only reads. Use pypdf for writing.

Guides

Pick your task

Usage

Downloaded tens of millions of times a month

pdfplumber is one of the most-installed PDF libraries in Python. Monthly downloads from PyPI more than doubled between April and October 2026, much of it from servers and containers: about 91% of downloads come from Linux. It has 10,871 stars on GitHub.

pdfplumber downloads from PyPI per month, 2026
0.0 M25.0 M50.0 M75.0 M100.0 MAprMayJunJulAugSepOct54.2 M
Show data
LabelValue
Apr20.9 M
May32.5 M
Jun45.1 M
Jul59.3 M
Aug52.7 M
Sep40.5 M
Oct54.2 M

Source: pypistats.org (without mirrors), fetched 2026-11-04

About this site

Independent, tested, correctable

Not the official projectpdfplumber.dev is an independent guide. The library, its README and its issue tracker live at github.com/jsvine/pdfplumber.
Every example is executedCode on this site runs against pdfplumber 0.11.10 and pdfminer.six 20260107 before it is published, and the output you see is what it printed. Our test workflow runs the examples again on Linux, Windows and macOS.
Wrong? Tell usEmail hello@pdfplumber.dev. We reproduce the problem and fix confirmed errors quickly. How we work →