Skip to content

07-05: Exercises — PDF Files

Notes reference: 07-05: Working with PDF Files


Q1: Read PDF metadata and page count

Open a PDF and print its metadata (title, author) and total page count.

Solution

from pypdf import PdfReader

reader = PdfReader("document.pdf")   # replace with an actual PDF on your system

print(f"Pages: {len(reader.pages)}")
print(f"Encrypted: {reader.is_encrypted}")

meta = reader.metadata
print(f"Title:  {meta.title}")
print(f"Author: {meta.author}")


Q2: Extract text from a page

Extract and print the text from the first page of a PDF.

Solution

from pypdf import PdfReader

reader = PdfReader("document.pdf")
page   = reader.pages[0]
text   = page.extract_text()
print(text[:500])   # first 500 characters


Q3: Extract text from all pages

Extract text from every page and collect it into a list.

Solution

from pypdf import PdfReader

def extract_all_text(path):
    reader = PdfReader(path)
    pages  = []
    for i, page in enumerate(reader.pages):
        text = page.extract_text()
        if text:
            pages.append(text.strip())
        print(f"Processed page {i+1}/{len(reader.pages)}")
    return pages

pages = extract_all_text("document.pdf")
for i, text in enumerate(pages, 1):
    print(f"--- Page {i} ---")
    print(text[:200])


Q4: Merge PDFs

Merge part1.pdf and part2.pdf into combined.pdf.

Solution

from pypdf import PdfWriter, PdfReader

def merge_pdfs(input_files, output_file):
    writer = PdfWriter()
    for path in input_files:
        reader = PdfReader(path)
        for page in reader.pages:
            writer.add_page(page)
    with open(output_file, "wb") as f:
        writer.write(f)
    print(f"Merged into {output_file}")

merge_pdfs(["part1.pdf", "part2.pdf"], "combined.pdf")


Q5: Split a PDF into single-page files

Split combined.pdf into individual pages saved as page_1.pdf, page_2.pdf, etc.

Solution

from pypdf import PdfWriter, PdfReader

def split_to_pages(input_file):
    reader = PdfReader(input_file)
    for i, page in enumerate(reader.pages):
        writer = PdfWriter()
        writer.add_page(page)
        out_path = f"page_{i+1}.pdf"
        with open(out_path, "wb") as f:
            writer.write(f)
        print(f"Saved {out_path}")

split_to_pages("combined.pdf")


Q6: Extract specific pages

Extract pages 1 and 3 (0-indexed: 0 and 2) from a PDF.

Solution

from pypdf import PdfWriter, PdfReader

def extract_pages(input_file, page_numbers, output_file):
    reader = PdfReader(input_file)
    writer = PdfWriter()
    for n in page_numbers:
        writer.add_page(reader.pages[n])
    with open(output_file, "wb") as f:
        writer.write(f)
    print(f"Extracted pages {page_numbers}{output_file}")

extract_pages("document.pdf", [0, 2], "selected_pages.pdf")


Q7: Rotate pages

Rotate all pages of a PDF by 90 degrees clockwise and save.

Solution

from pypdf import PdfWriter, PdfReader

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

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

with open("rotated.pdf", "wb") as f:
    writer.write(f)
print("Rotated PDF saved.")


Q8: Create a simple PDF with reportlab

Create a PDF report listing Bangladeshi cities and their populations.

Solution

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

def create_city_report(filename):
    c = canvas.Canvas(filename, pagesize=A4)
    width, height = A4

    c.setFont("Helvetica-Bold", 20)
    c.drawCentredString(width / 2, height - 80, "Bangladesh City Population Report")

    c.setFont("Helvetica", 12)
    y = height - 130

    cities = [
        ("Dhaka",      21_006_000),
        ("Chittagong",  4_009_423),
        ("Sylhet",      3_482_000),
        ("Rajshahi",    2_400_000),
        ("Khulna",      2_100_000),
    ]

    c.setFont("Helvetica-Bold", 11)
    c.drawString(80, y, "City")
    c.drawString(280, y, "Population")
    y -= 20
    c.line(80, y, 430, y)
    y -= 15

    c.setFont("Helvetica", 11)
    for city, pop in cities:
        c.drawString(80, y, city)
        c.drawString(280, y, f"{pop:,}")
        y -= 20

    c.save()
    print(f"Created {filename}")

create_city_report("city_report.pdf")


⬅️ Previous: 07-04: Exercises — Excel Files ➡️ Next: 07-06: Exercises — pathlib and File System Operations