# PDF Generation Implementation for Complaints ## Overview Implemented professional PDF generation for complaints using WeasyPrint. This feature allows users to download a beautifully formatted PDF document containing all complaint details, including AI analysis, staff assignment, and resolution information. ## Implementation Details ### 1. Dependencies - Added `weasyprint>=60.0` to `pyproject.toml` - WeasyPrint provides CSS-based PDF generation with full support for modern CSS features ### 2. Files Created #### `templates/complaints/complaint_pdf.html` Professional PDF template with: - **Header**: Complaint title, ID, status, severity, patient info - **Basic Information**: Category, source, priority, encounter ID, dates - **Description**: Full complaint details - **Staff Assignment**: Assigned staff member (if any) - **AI Analysis**: - Emotion analysis with confidence score and intensity bar - AI summary - Suggested action - **Resolution**: Resolution details (if resolved) - **Footer**: Generation timestamp, system branding **Features:** - A4 page size with proper margins - Professional purple gradient header - Color-coded badges for status and severity - Page numbers in footer - Proper page breaks for multi-page documents - Print-optimized CSS ### 3. Files Modified #### `apps/complaints/views.py` Added `generate_complaint_pdf()` function: - Validates user permissions (PX Admin, Hospital Admin, Department Manager, or hospital staff) - Renders HTML template with complaint context - Converts HTML to PDF using WeasyPrint - Returns PDF as downloadable attachment - Logs PDF generation to audit trail - Handles errors gracefully with user-friendly messages #### `apps/complaints/urls.py` - Added URL route: `/pdf/` mapped to `generate_complaint_pdf` - Named URL: `complaints:complaint_pdf` #### `templates/complaints/complaint_detail.html` Added "PDF View" tab: - New tab in complaints detail page - Download PDF button with icon - Description of PDF contents - Informational alerts about what's included - Note about WeasyPrint requirement ## Usage ### For Users 1. Navigate to a complaint detail page 2. Click the "PDF View" tab 3. Click the "Download PDF" button 4. The PDF will be generated and downloaded automatically ### For Developers #### Generating a PDF Programmatically ```python from django.template.loader import render_to_string from weasyprint import HTML # Render template html_string = render_to_string('complaints/complaint_pdf.html', { 'complaint': complaint, }) # Generate PDF pdf_file = HTML(string=html_string).write_pdf() # Return as HTTP response response = HttpResponse(pdf_file, content_type='application/pdf') response['Content-Disposition'] = 'attachment; filename="complaint.pdf"' ``` ## Installation Requirements ### System Dependencies (Linux/Ubuntu) ```bash sudo apt-get install python3-dev python3-pip python3-cffi libcairo2 libpango-1.0-0 libgdk-pixbuf2.0-0 shared-mime-info # For additional font support sudo apt-get install fonts-liberation ``` ### Python Dependencies ```bash pip install weasyprint>=60.0 ``` Or using uv/pip with the project's pyproject.toml: ```bash uv pip install weasyprint # or pip install -e . ``` ### macOS Dependencies ```bash brew install cairo pango gdk-pixbuf libffi shared-mime-info ``` ### Windows Dependencies Download and install GTK+ from: https://github.com/tschoonj/GTK-for-Windows-Runtime-Environment-Installer ## PDF Template Customization The PDF template uses standard CSS. You can customize: ### Colors Edit the gradient in the header: ```css .header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); } ``` ### Page Margins Edit the `@page` rule: ```css @page { size: A4; margin: 2cm; } ``` ### Badges Modify badge colors by editing the CSS classes: ```css .status-open { background: #e3f2fd; color: #1976d2; } .severity-high { background: #ffebee; color: #d32f2f; } ``` ### Fonts Add custom fonts using `@font-face`: ```css @page { @font-face { src: url('path/to/font.ttf'); } } ``` ## Features ### Permission Control Only authorized users can generate PDFs: - PX Admins: All complaints - Hospital Admins: Their hospital's complaints - Department Managers: Their department's complaints - Hospital Staff: Their hospital's complaints ### Audit Logging All PDF generations are logged: - Event type: `pdf_generated` - Description includes complaint title - Metadata includes complaint ID - Tracked by user and timestamp ### Error Handling - Graceful error messages if WeasyPrint is not installed - Logs errors for debugging - Returns user-friendly error responses ## PDF Contents ### Header Section - Complaint title (large, prominent) - Complaint ID (truncated to 8 characters) - Status badge (color-coded) - Severity badge (color-coded) - Patient name and MRN - Hospital name - Department name (if assigned) ### Basic Information Grid layout with: - Category (with subcategory if present) - Source - Priority - Encounter ID - Created date - SLA deadline ### Description Full complaint text with line breaks preserved. ### Staff Assignment (if assigned) - Staff member name (English and Arabic) - Job title - Department - AI-extracted staff name (if available) - Staff match confidence score ### AI Analysis (if available) - **Emotion Analysis**: - Emotion type with badge - Confidence percentage - Intensity bar visualization - **AI Summary**: Brief summary of the complaint - **Suggested Action**: AI-recommended action to take ### Resolution (if resolved) - Resolution text - Resolved by (user name) - Resolution date/time ### Footer - Generation timestamp - PX360 branding - AlHammadi Group branding - Page numbers (for multi-page documents) ## Styling Highlights ### Color Scheme - Primary purple gradient: `#667eea` → `#764ba2` - Status colors: Blue, Orange, Green, Gray, Red - Severity colors: Green, Orange, Red, Dark Red - AI section: Purple gradient background - Resolution section: Green background ### Typography - Font family: Segoe UI, Tahoma, Geneva, Verdana, sans-serif - Base font size: 11pt - Labels: 9pt, uppercase, letter-spacing: 0.5px - Values: 11pt ### Layout - Max-width: 210mm (A4 width) - 2cm page margins - Grid-based information layout - Card-based sections with borders and shadows - Proper spacing and padding ## Browser Compatibility WeasyPrint generates PDFs server-side, so the PDF will look the same regardless of the user's browser. The generated PDF can be viewed in: - Adobe Acrobat Reader - Chrome/Edge PDF viewer - Firefox PDF viewer - Safari PDF viewer - Any modern PDF viewer ## Performance Considerations - PDF generation is synchronous (happens in the request/response cycle) - For complaints with extensive updates or attachments, generation may take 1-3 seconds - Consider adding caching for frequently accessed complaints - For high-traffic scenarios, consider asynchronous generation ## Future Enhancements Potential improvements: 1. **Batch PDF generation**: Generate PDFs for multiple complaints 2. **Email PDF**: Option to email PDF directly 3. **Custom branding**: Allow hospital-specific logos/colors 4. **PDF templates**: Multiple template options (minimal, detailed, etc.) 5. **Digital signatures**: Add digital signature capability 6. **Watermarks**: Add watermarks for draft/official versions 7. **Barcodes/QR codes**: Include complaint barcode for scanning 8. **Attachments**: Include complaint attachments in PDF 9. **Bilingual PDF**: Generate PDF in Arabic/English side-by-side 10. **Charts**: Include complaint trend charts ## Troubleshooting ### WeasyPrint Import Error **Error**: `ImportError: No module named 'weasyprint'` **Solution**: ```bash pip install weasyprint ``` ### Cairo Library Error **Error**: `ImportError: No module named 'cairo'` **Solution**: Install system dependencies (see Installation Requirements section) ### Font Issues **Error**: Text appears as squares or missing characters **Solution**: Install additional fonts on the system: ```bash sudo apt-get install fonts-liberation fonts-noto-cjk ``` ### Memory Issues **Error**: PDF generation fails for large complaints **Solution**: 1. Reduce number of updates included 2. Implement pagination for large content 3. Increase server memory allocation ## Testing ### Manual Testing 1. Create a test complaint with AI analysis 2. Navigate to complaint detail page 3. Click PDF View tab 4. Download PDF 5. Verify all sections are present 6. Check styling and formatting 7. Test with different complaint states (open, resolved, etc.) ### Automated Testing ```python from django.test import TestCase from django.urls import reverse from apps.complaints.models import Complaint class PDFGenerationTest(TestCase): def test_pdf_generation(self): complaint = Complaint.objects.first() url = reverse('complaints:complaint_pdf', kwargs={'pk': complaint.pk}) response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertEqual(response['Content-Type'], 'application/pdf') self.assertGreater(len(response.content), 0) ``` ## References - [WeasyPrint Documentation](https://weasyprint.readthedocs.io/) - [CSS Paged Media Module](https://www.w3.org/TR/css-page-3/) - [Django WeasyPrint Guide](https://weasyprint.readthedocs.io/en/latest/django.html) ## Support For issues or questions: 1. Check WeasyPrint installation 2. Review system dependencies 3. Check Django logs for error details 4. Verify user permissions 5. Test with a simple PDF template first ## Changelog ### v1.0.0 (2025-01-10) - Initial implementation - Professional PDF template with complaint details - AI analysis integration - Staff assignment display - Resolution information - Permission-based access control - Audit logging - Download functionality