8.9 KiB
PDF Export Documentation
Overview
The PDF export functionality provides comprehensive report generation capabilities for the WorkForce Pro platform. Users can export data tables, financial reports, and custom reports to PDF format with professional formatting.
Features
Core Capabilities
- Table Export: Export data tables with customizable columns and formatting
- Report Generation: Create multi-section reports with titles, headings, tables, and metadata
- Page Management: Automatic page breaks and pagination
- Customization: Configure page size, orientation, timestamps, and page numbers
- Professional Formatting: Clean, readable output with proper spacing and alignment
Supported Export Formats
- CSV (Comma-Separated Values)
- Excel/XLSX (Microsoft Excel)
- JSON (JavaScript Object Notation)
- PDF (Portable Document Format) ⭐ NEW
Usage
1. Basic Table Export
import { usePDFExport, type PDFTableColumn } from '@/hooks/use-pdf-export'
const { exportTableToPDF } = usePDFExport()
const columns: PDFTableColumn[] = [
{ header: 'Name', key: 'name', align: 'left' },
{ header: 'Amount', key: 'amount', align: 'right', format: (val) => `$${val}` }
]
const data = [
{ name: 'Item 1', amount: 1000 },
{ name: 'Item 2', amount: 2000 }
]
exportTableToPDF(data, columns, {
filename: 'report',
title: 'Financial Report',
orientation: 'portrait',
pageSize: 'a4'
})
2. Advanced Report with Multiple Sections
import { usePDFExport, type PDFSection } from '@/hooks/use-pdf-export'
const { exportReportToPDF } = usePDFExport()
const sections: PDFSection[] = [
{
type: 'heading',
content: 'Executive Summary'
},
{
type: 'paragraph',
content: 'This report covers Q4 2025 financial performance.'
},
{
type: 'spacer',
height: 20
},
{
type: 'divider'
},
{
type: 'table',
data: tableData,
columns: tableColumns
}
]
exportReportToPDF(
{
title: 'Q4 2025 Financial Report',
summary: 'Comprehensive quarterly analysis',
sections
},
{
filename: 'q4-2025-report',
orientation: 'landscape',
includeTimestamp: true,
includePageNumbers: true
}
)
3. Using Data Export Hook (All Formats)
import { useDataExport } from '@/hooks/use-data-export'
const { exportData, exportToPDF } = useDataExport()
// Export to any format
exportData(data, {
format: 'pdf',
filename: 'export',
title: 'Data Export',
columns: ['id', 'name', 'amount']
})
// Or directly to PDF
exportToPDF(data, {
filename: 'report',
title: 'Report Title',
columnHeaders: {
id: 'ID',
name: 'Name',
amount: 'Amount'
}
})
Components with PDF Export
1. Reports View
The main Reports view includes a dedicated PDF export button for financial reports:
- Margin analysis tables
- Revenue and cost breakdowns
- Forecast data
- Summary metrics
Location: src/components/ReportsView.tsx
2. Advanced Data Table
All data tables automatically include PDF export in their export menu:
- Timesheets
- Invoices
- Payroll runs
- Expenses
- Compliance documents
Location: src/components/AdvancedDataTable.tsx
3. Custom Report Builder
Custom reports can be exported to PDF with full formatting:
- Grouped data
- Aggregated metrics
- Filtered results
Location: src/components/reports/ReportResultTable.tsx
4. Scheduled Reports
Scheduled automatic reports support PDF as an output format:
- Daily, weekly, monthly, or quarterly reports
- Automatic generation and distribution
- Email delivery support
Location: src/components/ScheduledReportsManager.tsx
Configuration Options
PDF Export Options
interface PDFExportOptions {
filename?: string // Output filename (without .pdf extension)
title?: string // Document title
orientation?: 'portrait' | 'landscape' // Page orientation
pageSize?: 'a4' | 'letter' | 'legal' // Paper size
includeTimestamp?: boolean // Add generation timestamp
includePageNumbers?: boolean // Add page numbers
metadata?: {
author?: string
subject?: string
keywords?: string
}
}
PDF Table Column Options
interface PDFTableColumn {
header: string // Column header text
key: string // Data key
width?: number // Column width (optional)
align?: 'left' | 'center' | 'right' // Text alignment
format?: (value: any) => string // Custom formatter
}
PDF Section Types
type PDFSection = {
type: 'title' // Large title (24pt)
content: string
} | {
type: 'heading' // Section heading (16pt)
content: string
} | {
type: 'paragraph' // Body text (11pt)
content: string
} | {
type: 'table' // Data table
data: any[]
columns: PDFTableColumn[]
} | {
type: 'spacer' // Vertical spacing
height?: number
} | {
type: 'divider' // Horizontal line
}
Page Sizes and Dimensions
| Size | Portrait (W×H) | Landscape (W×H) |
|---|---|---|
| A4 | 595 × 842 pts | 842 × 595 pts |
| Letter | 612 × 792 pts | 792 × 612 pts |
| Legal | 612 × 1008 pts | 1008 × 612 pts |
Best Practices
1. Column Configuration
- Use clear, descriptive headers
- Apply right alignment for numbers
- Add format functions for currency, dates, and percentages
- Limit columns to 5-7 for portrait, 8-10 for landscape
2. Report Structure
- Start with a title section
- Add summary paragraphs for context
- Use spacers for visual breathing room
- Include dividers to separate major sections
- Add tables after explanatory text
3. Performance
- Limit tables to 100-200 rows per page for readability
- Use pagination for larger datasets
- Consider generating reports server-side for very large datasets
4. Formatting
- Keep text content under 200 characters per line
- Use consistent spacing (20px standard, 10px tight)
- Test both orientations for different data shapes
- Always include timestamps for audit trails
Examples
Financial Report
const sections: PDFSection[] = [
{ type: 'title', content: 'Monthly Financial Report' },
{ type: 'spacer', height: 10 },
{ type: 'paragraph', content: 'Report Period: January 2025' },
{ type: 'spacer', height: 20 },
{ type: 'heading', content: 'Revenue Summary' },
{ type: 'spacer', height: 10 },
{
type: 'table',
data: revenueData,
columns: [
{ header: 'Source', key: 'source', align: 'left' },
{ header: 'Amount', key: 'amount', align: 'right',
format: (v) => `$${v.toLocaleString()}` }
]
}
]
Timesheet Report
exportTableToPDF(timesheets, [
{ header: 'Worker', key: 'workerName', align: 'left' },
{ header: 'Date', key: 'date', align: 'left' },
{ header: 'Hours', key: 'hours', align: 'right' },
{ header: 'Rate', key: 'rate', align: 'right',
format: (v) => `£${v}/hr` },
{ header: 'Total', key: 'amount', align: 'right',
format: (v) => `£${v.toLocaleString()}` }
], {
filename: 'timesheet-report',
title: 'Weekly Timesheet Report',
orientation: 'landscape'
})
Technical Details
PDF Generation
- Uses PDF 1.4 specification
- Direct PDF generation (no external dependencies)
- Client-side processing
- Automatic page break handling
- Font: Helvetica (standard PDF font)
Browser Compatibility
- Chrome/Edge: Full support
- Firefox: Full support
- Safari: Full support
- Mobile browsers: Download support varies
File Size
- Typical report: 50-200 KB
- Large tables (1000+ rows): 500 KB - 2 MB
- Depends on data density and formatting
Troubleshooting
Common Issues
Issue: PDF not downloading
- Solution: Check browser pop-up blockers
- Solution: Ensure user initiated the action (not auto-triggered)
Issue: Text appears truncated
- Solution: Limit text to 200 characters
- Solution: Use multiple paragraph sections for long content
Issue: Table columns don't fit
- Solution: Switch to landscape orientation
- Solution: Reduce number of columns
- Solution: Use shorter header names
Issue: Page breaks in wrong places
- Solution: Add manual spacers to control layout
- Solution: Reduce table row count per page
Future Enhancements
Planned improvements:
- Chart/graph rendering
- Images and logos
- Custom fonts
- Color customization
- Multi-page tables with headers
- Table of contents
- Watermarks
- Digital signatures
- PDF/A compliance
API Reference
See the following files for complete API documentation:
src/hooks/use-pdf-export.ts- Core PDF generation hooksrc/hooks/use-data-export.ts- Unified export interfacesrc/components/ui/export-button.tsx- Export UI component
Support
For issues or questions:
- Check this documentation
- Review code examples in components
- Check TypeScript types for parameter details
- Review browser console for error messages