PDF Processing

SkillDocs & knowledge

PDF manipulation toolkit for extracting text and tables, creating new PDFs, merging/splitting documents, converting to images, and handling forms. Use when Claude needs to read PDF content, create PDF documents, fill PDF forms, merge/split PDFs, or convert PDFs to images.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the PDF Processing skill

What this skill tells your AI

The instructions your AI receives, as published by thesmokedev/taskchad-os in .claude/skills/pdf/SKILL.md and read by ahel’s review.

Quick Reference

TaskToolExample
Extract textpdfplumberpage.extract_text()
Extract tablespdfplumberpage.extract_tables()
Merge PDFspypdfwriter.add_page(page)
Split PDFspypdfOne page per file
Create PDFsreportlabCanvas or Platypus
Convert to imagespypdfium2page.render()
Fill formspypdfSee forms section

Dependencies

pip install pypdf pdfplumber reportlab pypdfium2

Extract Text

import pdfplumber

with pdfplumber.open("document.pdf") as pdf:
    for page in pdf.pages:
        text = page.extract_text()
        print(text)

Extract Tables

import pdfplumber
import pandas as pd

with pdfplumber.open("document.pdf") as pdf:
    for page in pdf.pages:
        tables = page.extract_tables()
        for table in tables:
            if table:
                df = pd.DataFrame(table[1:], columns=table[0])
                print(df)

Merge PDFs

from pypdf import PdfWriter, PdfReader

writer = PdfWriter()
for pdf_file in ["doc1.pdf", "doc2.pdf"]:
    reader = PdfReader(pdf_file)
    for page in reader.pages:
        writer.add_page(page)

with open("merged.pdf", "wb") as output:
    writer.write(output)

Split PDF

from pypdf import PdfReader, PdfWriter

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

Create PDF with reportlab

from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib import colors

doc = SimpleDocTemplate("output.pdf", pagesize=letter)
styles = getSampleStyleSheet()
story = []

# Add title
story.append(Paragraph("Document Title", styles['Title']))
story.append(Spacer(1, 12))

# Add body text
story.append(Paragraph("This is body text.", styles['Normal']))

# Add table
data = [["Header 1", "Header 2"], ["Cell 1", "Cell 2"]]
table = Table(data)
table.setStyle(TableStyle([
    ('BACKGROUND', (0, 0), (-1, 0), colors.grey),
    ('GRID', (0, 0), (-1, -1), 1, colors.black),
]))
story.append(table)

doc.build(story)

Convert PDF to Images

import pypdfium2 as pdfium

pdf = pdfium.PdfDocument("document.pdf")
for i, page in enumerate(pdf):
    bitmap = page.render(scale=2.0)  # Higher = better quality
    img = bitmap.to_pil()
    img.save(f"page_{i+1}.png", "PNG")

Read PDF Metadata

from pypdf import PdfReader

reader = PdfReader("document.pdf")
meta = reader.metadata
print(f"Title: {meta.title}")
print(f"Author: {meta.author}")
print(f"Pages: {len(reader.pages)}")

Fill Form Fields

For PDFs with fillable form fields:

from pypdf import PdfReader, PdfWriter

reader = PdfReader("form.pdf")
writer = PdfWriter()

# Clone the PDF
writer.append(reader)

# Get form fields
fields = reader.get_fields()
for field_name, field in fields.items():
    print(f"Field: {field_name}, Type: {field.get('/FT')}")

# Fill fields
writer.update_page_form_field_values(
    writer.pages[0],
    {"field_name": "value"}
)

with open("filled_form.pdf", "wb") as output:
    writer.write(output)

Password Protection

from pypdf import PdfReader, PdfWriter

reader = PdfReader("input.pdf")
writer = PdfWriter()

for page in reader.pages:
    writer.add_page(page)

writer.encrypt("userpassword", "ownerpassword")

with open("encrypted.pdf", "wb") as output:
    writer.write(output)

Rotate Pages

from pypdf import PdfReader, PdfWriter

reader = PdfReader("input.pdf")
writer = PdfWriter()

page = reader.pages[0]
page.rotate(90)  # 90, 180, or 270
writer.add_page(page)

with open("rotated.pdf", "wb") as output:
    writer.write(output)

Advanced: Forms Reference

For complex form handling (fillable fields, checkboxes, radio buttons), see references/forms.md.

Signals

GitHub stars
23
Forks
5
Last commit
Sep 2026

ahel review

  • K1binfo
    installs-packages

Automated review, not a security audit. Ruleset v1+k2.

Advanced
Catalog kind
skill
Gateway key
pdf-thesmokedev
Source
github.com/thesmokedev/taskchad-os