#!/usr/bin/env python3 """ Flask API for Salesforce PDF Generation Takes HTML content from Salesforce and returns a downloadable PDF """ from flask import Flask, request, send_file, jsonify from flask_cors import CORS import pdfkit import os import tempfile import base64 from datetime import datetime import logging import json # Configure logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) app = Flask(__name__) CORS(app) # Configure pdfkit options for better PDF generation PDF_OPTIONS = { 'page-size': 'A4', 'margin-top': '0.75in', 'margin-right': '0.75in', 'margin-bottom': '0.75in', 'margin-left': '0.75in', 'encoding': "UTF-8", 'no-outline': None, 'enable-local-file-access': None, 'print-media-type': None, 'dpi': 300, 'image-quality': 100, 'javascript-delay': 1000, 'no-stop-slow-scripts': None, 'custom-header': [ ('Accept-Encoding', 'gzip') ] } @app.route('/health', methods=['GET']) def health_check(): """Health check endpoint""" return jsonify({ 'status': 'healthy', 'timestamp': datetime.now().isoformat(), 'service': 'Salesforce PDF Generator API' }) @app.route('/generate-pdf', methods=['POST']) def generate_pdf(): """ Generate PDF from HTML content sent from Salesforce Expected JSON payload: { "html_content": "...", "property_data": {...}, "template_name": "everkind", "filename": "property_brochure.pdf" } """ try: logger.info("Received PDF generation request from Salesforce") # Get request data data = request.get_json() if not data: return jsonify({'error': 'No data provided'}), 400 html_content = data.get('html_content') property_data = data.get('property_data', {}) template_name = data.get('template_name', 'default') filename = data.get('filename', f'property_brochure_{datetime.now().strftime("%Y%m%d_%H%M%S")}.pdf') if not html_content: return jsonify({'error': 'HTML content is required'}), 400 logger.info(f"Processing template: {template_name}") logger.info(f"Property data keys: {list(property_data.keys()) if property_data else 'None'}") logger.info(f"HTML content length: {len(html_content)}") # Create complete HTML document with proper styling complete_html = create_complete_html_document(html_content, property_data, template_name) # Generate PDF pdf_path = generate_pdf_from_html(complete_html, filename) if not pdf_path or not os.path.exists(pdf_path): return jsonify({'error': 'Failed to generate PDF'}), 500 logger.info(f"PDF generated successfully: {pdf_path}") # Return the PDF file return send_file( pdf_path, as_attachment=True, download_name=filename, mimetype='application/pdf' ) except Exception as e: logger.error(f"Error generating PDF: {str(e)}") return jsonify({'error': f'PDF generation failed: {str(e)}'}), 500 def create_complete_html_document(html_content, property_data, template_name): """Create a complete HTML document with proper styling and data""" # Base CSS styles for consistent PDF output base_css = """ """ # Create the complete HTML document complete_html = f"""
Villa in Dubai Marina