← Back to Skills
Productivity

PDF Processing

Create, read, and manipulate PDF documents programmatically. Use when users need to generate, extract, or convert PDF files.

Create, read, and manipulate PDF documents programmatically.

Setup

Installation

pip install PyPDF2 reportlab

Basic Usage

from PyPDF2 import PdfReader, PdfWriter

# Read PDF
reader = PdfReader('input.pdf')
for page in reader.pages:
    text = page.extract_text()
    print(text)

# Write PDF
writer = PdfWriter()
# Add pages...
writer.write('output.pdf')

PDF Reading

Extract Text

from PyPDF2 import PdfReader

def extract_text(pdf_path):
    reader = PdfReader(pdf_path)
    text = ''
    for page in reader.pages:
        text += page.extract_text()
    return text

Extract Metadata

from PyPDF2 import PdfReader

def get_metadata(pdf_path):
    reader = PdfReader(pdf_path)
    return reader.metadata

PDF Creation

Using ReportLab

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter

def create_pdf(output_path, content):
    c = canvas.Canvas(output_path, pagesize=letter)
    width, height = letter
    
    # Add content
    c.drawString(72, height - 72, content['title'])
    c.drawString(72, height - 100, content['body'])
    
    c.save()

Using Template

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.lib.units import inch

def create_report(data):
    c = canvas.Canvas('report.pdf', pagesize=letter)
    width, height = letter
    
    # Header
    c.setFont('Helvetica-Bold', 24)
    c.drawString(72, height - 72, data['title'])
    
    # Body
    c.setFont('Helvetica', 12)
    y = height - 120
    for line in data['content']:
        c.drawString(72, y, line)
        y -= 20
    
    c.save()

PDF Manipulation

Merge PDFs

from PyPDF2 import PdfMerger

def merge_pdfs(pdf_list, output_path):
    merger = PdfMerger()
    for pdf in pdf_list:
        merger.append(pdf)
    merger.write(output_path)
    merger.close()

Split PDF

from PyPDF2 import PdfReader, PdfWriter

def split_pdf(pdf_path, page_ranges):
    reader = PdfReader(pdf_path)
    
    for i, (start, end) in enumerate(page_ranges):
        writer = PdfWriter()
        for page_num in range(start, end + 1):
            writer.add_page(reader.pages[page_num])
        writer.write(f'output_{i}.pdf')

Rotate Pages

from PyPDF2 import PdfReader, PdfWriter

def rotate_pdf(pdf_path, rotation, output_path):
    reader = PdfReader(pdf_path)
    writer = PdfWriter()
    
    for page in reader.pages:
        page.rotate(rotation)
        writer.add_page(page)
    
    writer.write(output_path)

PDF Forms

Read Form Fields

from PyPDF2 import PdfReader

def get_form_fields(pdf_path):
    reader = PdfReader(pdf_path)
    return reader.get_form_text_fields()

Fill Form Fields

from PyPDF2 import PdfReader, PdfWriter

def fill_form(pdf_path, fields, output_path):
    reader = PdfReader(pdf_path)
    writer = PdfWriter()
    
    writer.append(reader)
    writer.update_page_form_field_values(writer.pages[0], fields)
    
    writer.write(output_path)

Best Practices

  • Handle encoding issues with extract_text()
  • Use appropriate PDF library for task
  • Test with different PDF versions
  • Handle password-protected PDFs
  • Validate input files
  • Consider memory usage for large PDFs
  • Provide clear error messages