๐Ÿ“„ pdf2video

January 25, 2026 ยท View on GitHub

๐Ÿ“„ pdf2video

Transform PDF documents into engaging video presentations with smooth animations.

MIT License React Remotion TypeScript

Features โ€ข Quick Start โ€ข Configuration โ€ข Demo


Demo

https://github.com/user-attachments/assets/464622be-c855-42c6-bc9e-988350906d92

Features

  • Multiple Scene Types

    • stack - Card stack display with entrance animation
    • focus - Extract and zoom into a specific page with scroll support
    • switch - Smooth page transitions with slide animations
    • fan - Fan/wheel layout with rotation and focus effects
  • Smart Animations

    • Natural card spread when focusing (like poker cards)
    • Breathing effect before scrolling
    • Bounce effect at scroll stop
    • Collapse animation for seamless scene transitions
  • Title System

    • Main title + subtitle at opening
    • Persistent corner title during page viewing
    • Per-page custom titles
  • Bottom Info Bar

    • Scene title with typing effect for descriptions
    • Progress indicator (1/5 format)
    • Customizable per-page descriptions
  • Ending Scene

    • PDF stack moves to left with staggered cards
    • "Thank you" message with title on right
    • Animated decoration line
  • Dynamic Duration

    • Auto-calculates video length from script configuration
  • Background Music

    • Auto fade-in/fade-out (2 seconds each)
    • Duration matches video length automatically
  • High Quality Rendering

    • Focus pages render at 2x resolution for sharp zoom

Quick Start

Installation

npm install

Add Your Files

Place your PDF and background music in the public/ folder:

# PDF document
cp /path/to/your/document.pdf public/sample.pdf

# Background music (optional)
cp /path/to/your/music.mp3 public/background.mp3

Development Preview

npm run dev

# Preview with custom props
npx remotion preview --props=./props/example.json

Render Video

npm run build

# Render with custom props
npx remotion render PdfShowcase out/example.mp4 --props=./props/example.json

Configuration

Basic Props

{
  src: "/sample.pdf",           // PDF file path (in public folder)
  title: "Document Title",       // Main title
  subtitle: "Subtitle",          // Optional subtitle
  highlights: [1, 3, 5],        // Pages to showcase
  pageTitles: {                 // Per-page titles
    "1": "Cover",
    "3": "Key Points",
    "5": "Summary",
  },
  pageDescriptions: {           // Per-page descriptions (typing effect)
    "1": "Introduction to the document...",
    "3": "The core findings are...",
    "5": "In conclusion...",
  },
}

Custom Script

Full control over the presentation flow:

{
  src: "/sample.pdf",
  title: "Custom Flow",
  script: [
    { type: "stack", duration: 60 },            // Stack display
    { type: "focus", page: 1, duration: 120 },  // Focus page 1
    { type: "switch", page: 3, duration: 120 }, // Switch to page 3
    { type: "fan", page: 5, duration: 150 },    // Fan mode for page 5
    { type: "stack", duration: 120 },           // Ending stack
  ],
}

Script Item Types

TypeDescriptionDefault Duration
stackCard stack display60 frames
focusZoom into a page120 frames
switchSlide transition120 frames
fanFan wheel layout150 frames

Example Configurations

Standard Mode

{
  "src": "/sample.pdf",
  "title": "Technical Report",
  "subtitle": "Key Insights",
  "highlights": [1, 3, 9, 14, 20],
  "pageTitles": {
    "1": "Abstract",
    "3": "Architecture",
    "9": "Training",
    "14": "Results",
    "20": "Conclusion"
  },
  "pageDescriptions": {
    "1": "Overview of the technical approach...",
    "3": "The system architecture consists of...",
    "9": "Training process involves...",
    "14": "Benchmark results show...",
    "20": "Key takeaways include..."
  }
}

Fan Mode

{
  "src": "/sample.pdf",
  "title": "Technical Report",
  "subtitle": "Key Insights",
  "script": [
    { "type": "stack", "duration": 60 },
    { "type": "fan", "page": 1, "duration": 150 },
    { "type": "fan", "page": 3, "duration": 150 },
    { "type": "fan", "page": 9, "duration": 150 },
    { "type": "stack", "duration": 120 }
  ]
}

Claude Code Skill

This project includes a Claude Code skill (.claude/skills/pdf-to-video/) for automated PDF to video conversion.

Setup

The skill is already in the correct location. If you want to use it globally, copy to your home directory:

cp -r .claude/skills/pdf-to-video ~/.claude/skills/

Usage

Once installed, simply tell Claude:

"ๅธฎๆˆ‘ๆŠŠ่ฟ™ไธช PDF ่ฝฌๆˆๅฑ•็คบ่ง†้ข‘๏ผš/path/to/document.pdf"

Claude will:

  1. Read and analyze the PDF content
  2. Extract key points and page titles
  3. Generate props.json configuration
  4. Render the video automatically

Project Structure

โ”œโ”€โ”€ props/                      # Props configuration files
โ”‚   โ””โ”€โ”€ example.json            # Example: props/glm45.json
โ”œโ”€โ”€ public/                     # Static assets
โ”‚   โ”œโ”€โ”€ *.pdf                   # PDF source files
โ”‚   โ””โ”€โ”€ background.mp3          # Background music
โ”œโ”€โ”€ out/                        # Rendered video output
โ”‚   โ””โ”€โ”€ example.mp4             # Example: out/glm45.mp4
โ””โ”€โ”€ src/
    โ”œโ”€โ”€ index.ts                # Entry point
    โ”œโ”€โ”€ Root.tsx                # Remotion root component
    โ””โ”€โ”€ templates/
        โ”œโ”€โ”€ Blank.tsx           # Blank template
        โ””โ”€โ”€ PdfShowcase/        # PDF showcase template
            โ”œโ”€โ”€ index.tsx       # Main component
            โ”œโ”€โ”€ types.ts        # Type definitions
            โ”œโ”€โ”€ PdfPage.tsx     # PDF page renderer
            โ”œโ”€โ”€ StackScene.tsx  # Stack scene
            โ”œโ”€โ”€ FocusScene.tsx  # Focus scene
            โ”œโ”€โ”€ SwitchScene.tsx # Switch scene
            โ”œโ”€โ”€ FanScene.tsx    # Fan scene
            โ”œโ”€โ”€ GridBackground.tsx  # Animated grid background
            โ”œโ”€โ”€ PersistentTitle.tsx # Persistent title component
            โ”œโ”€โ”€ BottomInfo.tsx  # Bottom info bar
            โ””โ”€โ”€ EndingOverlay.tsx   # Ending overlay

Video Specs

  • Resolution: 1920 x 1080
  • Frame Rate: 30 fps
  • Duration: Dynamic (based on script)

Tech Stack


Author

Created by @JinsFavorites

If you find this useful, give it a โญ๏ธ!

Twitter Follow

License

MIT