PDF Generation System
Reportr uses React-PDF to generate professional, branded SEO reports as PDF documents. This system replaces the legacy Puppeteer-based approach with a more maintainable, performant solution.Architecture Overview
Core Components
Technology Stack
- React-PDF (
@react-pdf/renderer) - PDF generation engine - React - Component architecture
- TypeScript - Type safety
- Vercel Blob - PDF storage
React-PDF Generator
Class: ReactPDFGenerator
Location: src/lib/pdf/react-pdf-generator.ts:12
Configuration Options
Singleton Instance
Location:src/lib/pdf/react-pdf-generator.ts:219
Report Generation Flow
Step-by-Step Process
1. Data Validation
Location:src/lib/pdf/react-pdf-generator.ts:113
2. Component Loading
Location:src/lib/pdf/react-pdf-generator.ts:151
3. Buffer Rendering with Timeout
Location:src/lib/pdf/react-pdf-generator.ts:92
Report Data Structure
ReportData Interface
Location: src/lib/pdf/types.ts:46
Google Search Console Metrics
Google Analytics 4 Metrics
React-PDF Components
Document Structure
Location:src/lib/pdf/components/ReportDocument.tsx
Cover Page Component
Location:src/lib/pdf/components/CoverPage.tsx
Metrics Display Components
Location:src/lib/pdf/components/GSCMetricsPage.tsx
Styling System
Style Constants
Location:src/lib/pdf/components/styles.ts
White-Label Branding
Dynamic Color Application:Template Utilities
Helper Functions
Location:src/lib/pdf/template-utils.ts
Number Formatting
Percentage Formatting
Date Formatting
HTML Escaping
Integration Points
API Route Integration
Example:src/app/api/reports/generate/route.ts (planned)
Queue System Integration
Background Job: Process reports asynchronouslyPerformance Optimization
Generation Time
Target: < 30 seconds per report Typical Breakdown:- Data validation: < 100ms
- Component loading: < 200ms
- PDF rendering: 10-25 seconds
- Total: ~15-30 seconds
Memory Management
Buffer Handling:Compression
Configuration:src/lib/pdf/react-pdf-generator.ts:19
- Level 0: Fastest, largest files (~5MB)
- Level 6: Balanced (~2MB)
- Level 9: Slowest, smallest files (~1.5MB)
Error Handling
Error Types
Error Creation
Location:src/lib/pdf/react-pdf-generator.ts:183
Diagnostic Logging
Location: Throughoutsrc/lib/pdf/react-pdf-generator.ts
Testing
Unit Tests
Best Practices
Component Design
- Keep Components Small - Break complex pages into smaller components
- Reuse Styles - Define styles once in
styles.ts - Type Everything - Use TypeScript interfaces for all props
- Handle Missing Data - Always provide fallbacks for optional data
Performance
- Lazy Load Images - Load images only when needed
- Optimize Assets - Compress logos and images before embedding
- Minimize Re-renders - Use React.memo for expensive components
- Stream Output - Don’t hold buffers in memory longer than necessary
Debugging
- Enable Debug Mode - Set
debug: truein development - Log Data Structure - Console.log report data before generation
- Test Incrementally - Generate pages one at a time during development
- Use PDF Viewers - Preview output in multiple PDF readers