Pdf

Extract, create, merge, and manipulate PDFs at scale with Python tools

✨ The solution you've been looking for

Verified
Tested and verified by our team
40937 Stars

Comprehensive PDF manipulation toolkit for extracting text and tables, creating new PDFs, merging/splitting documents, and handling forms. When Claude needs to fill in a PDF form or programmatically process, generate, or analyze PDF documents at scale.

pdf document-processing text-extraction python automation forms data-extraction file-manipulation
Repository

See It In Action

Interactive preview & real-world examples

Live Demo
Skill Demo Animation

AI Conversation Simulator

See how users interact with this skill

User Prompt

Extract all tables from this quarterly earnings PDF and convert them to Excel format

Skill Processing

Analyzing request...

Agent Response

Clean tabular data exported to Excel with proper column headers and formatting preserved

Quick Start (3 Steps)

Get up and running in minutes

1

Install

claude-code skill install pdf

claude-code skill install pdf
2

Config

3

First Trigger

@pdf help

Commands

CommandDescriptionRequired Args
@pdf extract-structured-data-from-pdf-reportsPull tables and text from financial reports, invoices, or research documents for analysisNone
@pdf merge-multiple-documents-into-single-pdfCombine contracts, reports, or presentations into one cohesive documentNone
@pdf process-scanned-documents-with-ocrConvert image-based PDFs to searchable text for analysis or archivalNone

Typical Use Cases

Extract structured data from PDF reports

Pull tables and text from financial reports, invoices, or research documents for analysis

Merge multiple documents into single PDF

Combine contracts, reports, or presentations into one cohesive document

Process scanned documents with OCR

Convert image-based PDFs to searchable text for analysis or archival

Overview

PDF Processing Guide

Overview

This guide covers essential PDF processing operations using Python libraries and command-line tools. For advanced features, JavaScript libraries, and detailed examples, see reference.md. If you need to fill out a PDF form, read forms.md and follow its instructions.

Quick Start

 1from pypdf import PdfReader, PdfWriter
 2
 3# Read a PDF
 4reader = PdfReader("document.pdf")
 5print(f"Pages: {len(reader.pages)}")
 6
 7# Extract text
 8text = ""
 9for page in reader.pages:
10    text += page.extract_text()

Python Libraries

pypdf - Basic Operations

Merge PDFs

 1from pypdf import PdfWriter, PdfReader
 2
 3writer = PdfWriter()
 4for pdf_file in ["doc1.pdf", "doc2.pdf", "doc3.pdf"]:
 5    reader = PdfReader(pdf_file)
 6    for page in reader.pages:
 7        writer.add_page(page)
 8
 9with open("merged.pdf", "wb") as output:
10    writer.write(output)

Split PDF

1reader = PdfReader("input.pdf")
2for i, page in enumerate(reader.pages):
3    writer = PdfWriter()
4    writer.add_page(page)
5    with open(f"page_{i+1}.pdf", "wb") as output:
6        writer.write(output)

Extract Metadata

1reader = PdfReader("document.pdf")
2meta = reader.metadata
3print(f"Title: {meta.title}")
4print(f"Author: {meta.author}")
5print(f"Subject: {meta.subject}")
6print(f"Creator: {meta.creator}")

Rotate Pages

1reader = PdfReader("input.pdf")
2writer = PdfWriter()
3
4page = reader.pages[0]
5page.rotate(90)  # Rotate 90 degrees clockwise
6writer.add_page(page)
7
8with open("rotated.pdf", "wb") as output:
9    writer.write(output)

pdfplumber - Text and Table Extraction

Extract Text with Layout

1import pdfplumber
2
3with pdfplumber.open("document.pdf") as pdf:
4    for page in pdf.pages:
5        text = page.extract_text()
6        print(text)

Extract Tables

1with pdfplumber.open("document.pdf") as pdf:
2    for i, page in enumerate(pdf.pages):
3        tables = page.extract_tables()
4        for j, table in enumerate(tables):
5            print(f"Table {j+1} on page {i+1}:")
6            for row in table:
7                print(row)

Advanced Table Extraction

 1import pandas as pd
 2
 3with pdfplumber.open("document.pdf") as pdf:
 4    all_tables = []
 5    for page in pdf.pages:
 6        tables = page.extract_tables()
 7        for table in tables:
 8            if table:  # Check if table is not empty
 9                df = pd.DataFrame(table[1:], columns=table[0])
10                all_tables.append(df)
11
12# Combine all tables
13if all_tables:
14    combined_df = pd.concat(all_tables, ignore_index=True)
15    combined_df.to_excel("extracted_tables.xlsx", index=False)

reportlab - Create PDFs

Basic PDF Creation

 1from reportlab.lib.pagesizes import letter
 2from reportlab.pdfgen import canvas
 3
 4c = canvas.Canvas("hello.pdf", pagesize=letter)
 5width, height = letter
 6
 7# Add text
 8c.drawString(100, height - 100, "Hello World!")
 9c.drawString(100, height - 120, "This is a PDF created with reportlab")
10
11# Add a line
12c.line(100, height - 140, 400, height - 140)
13
14# Save
15c.save()

Create PDF with Multiple Pages

 1from reportlab.lib.pagesizes import letter
 2from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, PageBreak
 3from reportlab.lib.styles import getSampleStyleSheet
 4
 5doc = SimpleDocTemplate("report.pdf", pagesize=letter)
 6styles = getSampleStyleSheet()
 7story = []
 8
 9# Add content
10title = Paragraph("Report Title", styles['Title'])
11story.append(title)
12story.append(Spacer(1, 12))
13
14body = Paragraph("This is the body of the report. " * 20, styles['Normal'])
15story.append(body)
16story.append(PageBreak())
17
18# Page 2
19story.append(Paragraph("Page 2", styles['Heading1']))
20story.append(Paragraph("Content for page 2", styles['Normal']))
21
22# Build PDF
23doc.build(story)

Command-Line Tools

pdftotext (poppler-utils)

1# Extract text
2pdftotext input.pdf output.txt
3
4# Extract text preserving layout
5pdftotext -layout input.pdf output.txt
6
7# Extract specific pages
8pdftotext -f 1 -l 5 input.pdf output.txt  # Pages 1-5

qpdf

 1# Merge PDFs
 2qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf
 3
 4# Split pages
 5qpdf input.pdf --pages . 1-5 -- pages1-5.pdf
 6qpdf input.pdf --pages . 6-10 -- pages6-10.pdf
 7
 8# Rotate pages
 9qpdf input.pdf output.pdf --rotate=+90:1  # Rotate page 1 by 90 degrees
10
11# Remove password
12qpdf --password=mypassword --decrypt encrypted.pdf decrypted.pdf

pdftk (if available)

1# Merge
2pdftk file1.pdf file2.pdf cat output merged.pdf
3
4# Split
5pdftk input.pdf burst
6
7# Rotate
8pdftk input.pdf rotate 1east output rotated.pdf

Common Tasks

Extract Text from Scanned PDFs

 1# Requires: pip install pytesseract pdf2image
 2import pytesseract
 3from pdf2image import convert_from_path
 4
 5# Convert PDF to images
 6images = convert_from_path('scanned.pdf')
 7
 8# OCR each page
 9text = ""
10for i, image in enumerate(images):
11    text += f"Page {i+1}:\n"
12    text += pytesseract.image_to_string(image)
13    text += "\n\n"
14
15print(text)

Add Watermark

 1from pypdf import PdfReader, PdfWriter
 2
 3# Create watermark (or load existing)
 4watermark = PdfReader("watermark.pdf").pages[0]
 5
 6# Apply to all pages
 7reader = PdfReader("document.pdf")
 8writer = PdfWriter()
 9
10for page in reader.pages:
11    page.merge_page(watermark)
12    writer.add_page(page)
13
14with open("watermarked.pdf", "wb") as output:
15    writer.write(output)

Extract Images

1# Using pdfimages (poppler-utils)
2pdfimages -j input.pdf output_prefix
3
4# This extracts all images as output_prefix-000.jpg, output_prefix-001.jpg, etc.

Password Protection

 1from pypdf import PdfReader, PdfWriter
 2
 3reader = PdfReader("input.pdf")
 4writer = PdfWriter()
 5
 6for page in reader.pages:
 7    writer.add_page(page)
 8
 9# Add password
10writer.encrypt("userpassword", "ownerpassword")
11
12with open("encrypted.pdf", "wb") as output:
13    writer.write(output)

Quick Reference

TaskBest ToolCommand/Code
Merge PDFspypdfwriter.add_page(page)
Split PDFspypdfOne page per file
Extract textpdfplumberpage.extract_text()
Extract tablespdfplumberpage.extract_tables()
Create PDFsreportlabCanvas or Platypus
Command line mergeqpdfqpdf --empty --pages ...
OCR scanned PDFspytesseractConvert to image first
Fill PDF formspdf-lib or pypdf (see forms.md)See forms.md

Next Steps

  • For advanced pypdfium2 usage, see reference.md
  • For JavaScript libraries (pdf-lib), see reference.md
  • If you need to fill out a PDF form, follow the instructions in forms.md
  • For troubleshooting guides, see reference.md

What Users Are Saying

Real feedback from the community

Environment Matrix

Dependencies

Python 3.7+
pypdf (pip install pypdf)
pdfplumber (pip install pdfplumber)
reportlab (pip install reportlab)
pandas (pip install pandas)
pytesseract + pdf2image for OCR (optional)

Framework Support

pypdf ✓ (recommended for basic operations) pdfplumber ✓ (recommended for text/table extraction) reportlab ✓ (recommended for PDF creation) qpdf ✓ (command-line operations) poppler-utils ✓ (text extraction)

Context Window

Token Usage ~1K-10K tokens depending on document size and complexity

Security & Privacy

Information

Author
anthropics
Updated
2026-01-30
Category
productivity-tools