Files
TimeTracker/docs/pdf_template_alternatives_research.md
Dries Peeters 4eeaa2a842 feat: Migrate PDF templates to ReportLab JSON format
- Add ReportLab template renderer with JSON-based template system
- Implement template schema validation and helper functions
- Add database migration for template_json columns
- Update visual editor to generate ReportLab JSON alongside HTML/CSS
- Maintain backward compatibility with legacy templates
- Add comprehensive migration documentation

BREAKING CHANGE: Existing PDF templates need to be saved again through
the visual editor to generate the new template_json format. Templates
will continue to work using the legacy fallback generator until saved.
2026-01-09 11:43:42 +01:00

8.1 KiB

PDF Template Library Alternatives Research

Current Solution Analysis

Current Stack

  • Visual Editor: Konva.js (canvas-based drag-and-drop editor)
  • PDF Generation: WeasyPrint (HTML/CSS to PDF)
  • Template Storage: Database (HTML, CSS, JSON design state)
  • Custom Code: ~3000+ lines of JavaScript + Python for editor and generation

Current Issues

  1. Maintenance burden: Significant custom code for editor, template generation, page size handling
  2. Page size bugs: Hardcoded dimensions, DPI conversion complexity
  3. Limited CSS support: WeasyPrint doesn't support all modern CSS features
  4. Preview accuracy: Browser preview (96 DPI) vs PDF (72 DPI) conversion issues

Alternative Solutions

Option 1: ReportLab (Python-native PDF generation)

Pros:

  • Very reliable and mature (used in production for decades)
  • Precise control over layout and positioning
  • No HTML/CSS parsing needed
  • Excellent documentation and community support
  • Built-in support for all page sizes
  • Fast generation

Cons:

  • No HTML/CSS support (requires rewriting templates)
  • No drag-and-drop editor available
  • Requires learning ReportLab's API
  • Layout code is more verbose
  • Would need to build visual editor from scratch or use a different approach

Integration Effort: High (would need to rewrite all templates and possibly build new editor) Maintenance: Low (mature library, less custom code) Cost: Free (open source)

Rating: (Good for reliability, but requires significant rewrite)


Option 2: xhtml2pdf/pisa

Pros:

  • HTML/CSS to PDF (similar to WeasyPrint)
  • Simpler API than WeasyPrint
  • Based on ReportLab underneath (reliable rendering)
  • Lighter weight than WeasyPrint

Cons:

  • Limited CSS support (similar to WeasyPrint)
  • Less active development
  • Still requires custom editor
  • Same DPI/preview issues as WeasyPrint

Integration Effort: Medium (can reuse HTML/CSS templates, but need to test compatibility) Maintenance: Medium (still need custom editor code) Cost: Free (open source)

Rating: (Marginal improvement over WeasyPrint)


Option 3: Puppeteer/Pyppeteer (Headless Chrome)

Pros:

  • Full modern CSS support (uses Chrome's rendering engine)
  • Accurate preview (same rendering as browser)
  • Supports JavaScript in templates
  • Excellent HTML/CSS compatibility
  • Active development

Cons:

  • Requires Chrome/Chromium installation (larger deployment size)
  • Slower than WeasyPrint (needs to start browser process)
  • Higher memory usage
  • May have issues with fonts/webfonts
  • Still requires custom editor

Integration Effort: Medium (can reuse HTML/CSS templates, minimal changes needed) Maintenance: Medium (still need custom editor, but better CSS support) Cost: Free (open source)

Rating: (Good CSS support, but deployment overhead)


Option 4: Commercial APIs (PDF-API.io, CraftMyPDF, DocRaptor)

PDF-API.io

Pros:

  • Built-in drag-and-drop template designer
  • REST API integration (no library management)
  • Handles page sizes automatically
  • Preview functionality built-in
  • Professional support available

Cons:

  • Monthly cost ($29-299+/month depending on usage)
  • External dependency (API calls)
  • Template storage on their servers (or via API)
  • Less control over rendering
  • Requires internet connectivity
  • Vendor lock-in

Integration Effort: Low-Medium (API-based, but need to redesign template storage) Maintenance: Very Low (they handle rendering) Cost: $$ (Pay-per-use or subscription)

Rating: (Good if budget allows, reduces maintenance significantly)

CraftMyPDF.com

Pros:

  • Drag-and-drop template editor
  • REST API
  • Expressions and advanced formatting
  • Template management via API

Cons:

  • Similar to PDF-API.io (cost, external dependency)
  • Vendor lock-in
  • Requires internet connectivity

Integration Effort: Low-Medium Maintenance: Very Low Cost: $$ (Subscription-based)

Rating: (Similar to PDF-API.io)

DocRaptor (by Expected Behavior)

Pros:

  • High-quality HTML to PDF conversion
  • Based on PrinceXML engine
  • Good CSS support
  • REST API

Cons:

  • No built-in template editor
  • Still requires custom editor
  • Monthly cost ($15-500+/month)
  • External dependency

Integration Effort: Medium (API-based, but still need editor) Maintenance: Medium (still need editor, but better rendering) Cost: $$ (Subscription-based)

Rating: (Better rendering, but still need custom editor)


Option 5: Keep Current + Improvements

Pros:

  • Already implemented and working
  • Full control over features
  • No external dependencies
  • No additional costs

Cons:

  • Maintenance burden remains
  • Need to fix bugs (page sizes, DPI issues)
  • Limited CSS support from WeasyPrint
  • Custom code complexity

Integration Effort: Low (just fix existing issues) Maintenance: High (custom code to maintain) Cost: Free (but developer time)

Rating: (Fixes can make it work, but maintenance burden remains)


Recommendation Matrix

Solution Integration Effort Maintenance Burden Feature Completeness Cost Overall Rating
ReportLab High Low Medium (no editor) Free
xhtml2pdf Medium Medium Medium Free
Puppeteer/Pyppeteer Medium Medium High Free
PDF-API.io Low-Medium Very Low High $$
CraftMyPDF Low-Medium Very Low High $$
DocRaptor Medium Medium High $$
Current + Fixes Low High Medium Free

Short Term (Fix Current Issues)

  1. Fix page_size extraction in quote preview
  2. Add wrapper dimension updates in PDF generation
  3. Add comprehensive logging
  4. Document the current solution better
  5. Create unit tests for page size handling

Medium Term (Evaluate Migration)

If maintenance becomes too burdensome or new features are needed:

Best Option for Feature-Rich Solution:

  • Puppeteer/Pyppeteer if you need full CSS support and can handle deployment overhead
  • Keeps HTML/CSS approach, minimal template changes needed
  • Better preview accuracy (same rendering engine)

Best Option for Maintenance Reduction:

  • PDF-API.io or CraftMyPDF if budget allows
  • Eliminates most custom PDF generation code
  • Built-in editor reduces JavaScript maintenance
  • Monthly cost but saves significant developer time

Best Option for Reliability:

  • ReportLab if you're willing to rewrite templates
  • Most reliable, but requires significant refactoring
  • Would need new editor approach (form-based rather than visual)

Long Term Considerations

  1. If staying with current solution:

    • Refactor editor code into reusable components
    • Extract page size logic into a service class
    • Create better abstractions for template generation
    • Consider TypeScript for JavaScript to catch more bugs
  2. If migrating to Puppeteer:

    • Can reuse most templates with minimal changes
    • Better CSS support enables more design flexibility
    • Preview and PDF will match perfectly (same engine)
    • Need to handle Chrome deployment in Docker
  3. If using Commercial API:

    • Plan for vendor lock-in
    • Ensure API reliability/SLA meets requirements
    • Consider backup generation method
    • Factor ongoing costs into budget

Conclusion

For immediate needs: Fix the current solution (already done). It works, just needs the bugs fixed.

For long-term maintainability: Consider Puppeteer/Pyppeteer if you want better CSS support without vendor lock-in, or commercial API if budget allows and you want to minimize maintenance.

For maximum reliability: ReportLab is the gold standard, but requires significant refactoring.

The current fixes should resolve the immediate issues. Evaluate migration based on:

  • How often new features are needed
  • Developer time spent on PDF-related bugs
  • Whether CSS limitations are blocking features
  • Budget for commercial solutions