PDF_Generation_and_Automation/python-pdf-generator/advanced_templates.py
2025-08-23 22:55:07 +05:30

608 lines
22 KiB
Python

#!/usr/bin/env python3
"""
Advanced Property PDF Templates
Highly sophisticated templates with real estate images and professional layouts
"""
import os
from datetime import datetime
from typing import Dict, List, Any
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.units import inch, cm
from reportlab.lib import colors
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT, TA_JUSTIFY
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image, Table, TableStyle, PageBreak
from reportlab.platypus.flowables import KeepTogether
from reportlab.pdfgen import canvas
from reportlab.lib.colors import HexColor
from PIL import Image as PILImage
import io
import base64
class AdvancedPropertyTemplates:
"""Advanced property PDF templates with sophisticated designs"""
def __init__(self):
self.setup_advanced_styles()
def setup_advanced_styles(self):
"""Setup advanced paragraph styles"""
self.styles = {}
# Ultra Premium Title
self.styles['UltraTitle'] = ParagraphStyle(
name='UltraTitle',
fontSize=48,
textColor=HexColor('#1a1a1a'),
alignment=TA_CENTER,
spaceAfter=35,
fontName='Helvetica-Bold',
leading=56
)
# Premium Subtitle
self.styles['PremiumSubtitle'] = ParagraphStyle(
name='PremiumSubtitle',
fontSize=22,
textColor=HexColor('#666666'),
alignment=TA_CENTER,
spaceAfter=30,
fontName='Helvetica',
leading=26
)
# Section Headers
self.styles['SectionHeader'] = ParagraphStyle(
name='SectionHeader',
fontSize=28,
textColor=HexColor('#1f2937'),
alignment=TA_LEFT,
spaceAfter=20,
fontName='Helvetica-Bold',
leading=32
)
# Content Text
self.styles['ContentText'] = ParagraphStyle(
name='ContentText',
fontSize=13,
textColor=HexColor('#374151'),
alignment=TA_JUSTIFY,
spaceAfter=15,
fontName='Helvetica',
leading=18
)
# Feature Text
self.styles['FeatureText'] = ParagraphStyle(
name='FeatureText',
fontSize=14,
textColor=HexColor('#1f2937'),
alignment=TA_LEFT,
spaceAfter=12,
fontName='Helvetica-Bold',
leading=18
)
# Price Display
self.styles['PriceDisplay'] = ParagraphStyle(
name='PriceDisplay',
fontSize=36,
textColor=HexColor('#dc2626'),
alignment=TA_CENTER,
spaceAfter=30,
fontName='Helvetica-Bold',
leading=42
)
# Amenity Item
self.styles['AmenityItem'] = ParagraphStyle(
name='AmenityItem',
fontSize=13,
textColor=HexColor('#4b5563'),
alignment=TA_LEFT,
spaceAfter=10,
fontName='Helvetica',
leading=17
)
def create_luxury_villa_template(self, data: Dict[str, Any], output_path: str) -> str:
"""Create ultra-luxury villa template with sophisticated design"""
doc = SimpleDocTemplate(
output_path,
pagesize=A4,
rightMargin=0.3*cm,
leftMargin=0.3*cm,
topMargin=0.3*cm,
bottomMargin=0.3*cm
)
story = []
# Page 1: Cover Page
story.extend(self._create_cover_page(data))
story.append(PageBreak())
# Page 2: Property Overview
story.extend(self._create_property_overview(data))
story.append(PageBreak())
# Page 3: Features & Amenities
story.extend(self._create_features_page(data))
story.append(PageBreak())
# Page 4: Location & Investment
story.extend(self._create_investment_page(data))
# Build PDF with custom header/footer
doc.build(story, onFirstPage=lambda c, d: self._create_luxury_header_footer(c, 1, "LUXURY VILLA"),
onLaterPages=lambda c, d: self._create_luxury_header_footer(c, d.page, "LUXURY VILLA"))
return output_path
def _create_cover_page(self, data: Dict[str, Any]) -> List:
"""Create sophisticated cover page"""
story = []
# Main Title
story.append(Paragraph("LUXURY VILLA COLLECTION", self.styles['UltraTitle']))
story.append(Spacer(1, 40))
# Property Name
story.append(Paragraph(f"{data.get('propertyName', 'Exclusive Villa')}", self.styles['UltraTitle']))
story.append(Spacer(1, 30))
# Location
story.append(Paragraph(f"Located in {data.get('location', 'Dubai')}", self.styles['PremiumSubtitle']))
story.append(Spacer(1, 50))
# Price Highlight
story.append(Paragraph("INVESTMENT VALUE", self.styles['SectionHeader']))
story.append(Paragraph(f"AED {data.get('price', 'N/A')}", self.styles['PriceDisplay']))
story.append(Spacer(1, 60))
# Property Stats
stats_data = [
['BEDROOMS', 'BATHROOMS', 'AREA', 'LOCATION'],
[
data.get('bedrooms', 'N/A'),
data.get('bathrooms', 'N/A'),
f"{data.get('area', 'N/A')} sq ft",
data.get('location', 'N/A')
]
]
stats_table = Table(stats_data, colWidths=[1.8*inch, 1.8*inch, 1.8*inch, 1.8*inch])
stats_table.setStyle(TableStyle([
('BACKGROUND', (0, 0), (-1, 0), HexColor('#2c1810')),
('TEXTCOLOR', (0, 0), (-1, 0), colors.white),
('ALIGN', (0, 0), (-1, -1), 'CENTER'),
('FONTNAME', (0, 0), (-1, -1), 'Helvetica-Bold'),
('FONTSIZE', (0, 0), (-1, 0), 16),
('FONTSIZE', (0, 1), (-1, 1), 18),
('BOTTOMPADDING', (0, 0), (-1, -1), 20),
('GRID', (0, 0), (-1, -1), 1, HexColor('#2c1810')),
('ROUNDEDCORNERS', [15, 15, 15, 15])
]))
story.append(stats_table)
story.append(Spacer(1, 60))
# Footer Text
story.append(Paragraph("EXCLUSIVE • PRESTIGIOUS • SOPHISTICATED", self.styles['PremiumSubtitle']))
story.append(Paragraph("Where luxury meets lifestyle", self.styles['ContentText']))
return story
def _create_property_overview(self, data: Dict[str, Any]) -> List:
"""Create property overview page"""
story = []
# Page Title
story.append(Paragraph("PROPERTY OVERVIEW", self.styles['SectionHeader']))
story.append(Spacer(1, 30))
# Description
if data.get('description'):
story.append(Paragraph("ABOUT THIS PROPERTY", self.styles['FeatureText']))
story.append(Paragraph(data['description'], self.styles['ContentText']))
story.append(Spacer(1, 30))
# Property Highlights
story.append(Paragraph("PROPERTY HIGHLIGHTS", self.styles['FeatureText']))
highlights = [
"• Premium finishes throughout",
"• High-end appliances and fixtures",
"• Smart home technology integration",
"• Energy-efficient design",
"• Premium security systems",
"• Landscaped gardens and outdoor spaces"
]
for highlight in highlights:
story.append(Paragraph(highlight, self.styles['ContentText']))
story.append(Spacer(1, 30))
# Additional Features
story.append(Paragraph("ADDITIONAL FEATURES", self.styles['FeatureText']))
additional_features = [
"• Premium finishes throughout",
"• Premium flooring materials",
"• Designer lighting fixtures",
"• High-quality windows and doors",
"• Advanced HVAC systems",
"• Premium insulation and soundproofing"
]
for feature in additional_features:
story.append(Paragraph(feature, self.styles['ContentText']))
return story
def _create_features_page(self, data: Dict[str, Any]) -> List:
"""Create features and amenities page"""
story = []
# Page Title
story.append(Paragraph("FEATURES & AMENITIES", self.styles['SectionHeader']))
story.append(Spacer(1, 30))
# Interior Features
story.append(Paragraph("INTERIOR FEATURES", self.styles['FeatureText']))
story.append(Spacer(1, 15))
interior_features = [
"• Master suite with walk-in closet",
"• En-suite bathrooms with premium fixtures",
"• Open-concept living areas",
"• Gourmet kitchen with island",
"• Formal dining room",
"• Home office/study",
"• Media room/home theater",
"• Wine cellar/storage"
]
for feature in interior_features:
story.append(Paragraph(feature, self.styles['ContentText']))
story.append(Spacer(1, 30))
# Exterior Features
story.append(Paragraph("EXTERIOR FEATURES", self.styles['FeatureText']))
story.append(Spacer(1, 15))
exterior_features = [
"• Private swimming pool",
"• Outdoor kitchen and dining area",
"• Landscaped gardens",
"• Private parking/garage",
"• Security gate and fencing",
"• Outdoor entertainment areas",
"• Garden sheds/storage",
"• Professional landscaping"
]
for feature in exterior_features:
story.append(Paragraph(feature, self.styles['ContentText']))
return story
def _create_investment_page(self, data: Dict[str, Any]) -> List:
"""Create investment and location page"""
story = []
# Page Title
story.append(Paragraph("INVESTMENT & LOCATION", self.styles['SectionHeader']))
story.append(Spacer(1, 30))
# Location Benefits
story.append(Paragraph("LOCATION BENEFITS", self.styles['FeatureText']))
story.append(Spacer(1, 15))
location_benefits = [
"• Prime location in prestigious area",
"• Easy access to major highways",
"• Close to shopping and dining",
"• Excellent schools nearby",
"• Public transportation access",
"• Healthcare facilities nearby",
"• Recreational facilities close by",
"• High appreciation potential"
]
for benefit in location_benefits:
story.append(Paragraph(benefit, self.styles['ContentText']))
story.append(Spacer(1, 30))
# Investment Highlights
story.append(Paragraph("INVESTMENT HIGHLIGHTS", self.styles['FeatureText']))
story.append(Spacer(1, 15))
investment_highlights = [
"• Strong rental yield potential",
"• High capital appreciation",
"• Low maintenance costs",
"• Premium tenant attraction",
"• Stable market conditions",
"• Excellent resale value",
"• Tax benefits available",
"• Professional property management"
]
for highlight in investment_highlights:
story.append(Paragraph(highlight, self.styles['ContentText']))
story.append(Spacer(1, 40))
# Contact Information
story.append(Paragraph("CONTACT US", self.styles['FeatureText']))
story.append(Paragraph("For more information about this exclusive property,", self.styles['ContentText']))
story.append(Paragraph("please contact our luxury property specialists.", self.styles['ContentText']))
story.append(Spacer(1, 20))
story.append(Paragraph("LUXURY REAL ESTATE", self.styles['FeatureText']))
story.append(Paragraph("Premium Property Solutions", self.styles['ContentText']))
return story
def _create_luxury_header_footer(self, canvas_obj, page_num: int, template_name: str):
"""Create luxury header and footer"""
# Header
canvas_obj.setFillColor(HexColor('#2c1810'))
canvas_obj.setFont("Helvetica-Bold", 18)
canvas_obj.drawString(50, A4[1] - 40, "LUXURY REAL ESTATE")
canvas_obj.setFont("Helvetica", 14)
canvas_obj.drawString(50, A4[1] - 60, "Premium Property Brochure")
# Template indicator
canvas_obj.setFillColor(HexColor('#8b4513'))
canvas_obj.setFont("Helvetica-Bold", 16)
canvas_obj.drawRightString(A4[0] - 50, A4[1] - 40, template_name)
# Footer
canvas_obj.setFillColor(HexColor('#8b4513'))
canvas_obj.setFont("Helvetica", 12)
canvas_obj.drawCentredString(A4[0]/2, 35, f"Generated on {datetime.now().strftime('%B %d, %Y')}")
canvas_obj.drawCentredString(A4[0]/2, 20, "Luxury Real Estate - Premium Property Solutions")
# Page number
canvas_obj.drawRightString(A4[0] - 50, 20, f"Page {page_num}")
def create_modern_apartment_template(self, data: Dict[str, Any], output_path: str) -> str:
"""Create modern apartment template with contemporary design"""
doc = SimpleDocTemplate(
output_path,
pagesize=A4,
rightMargin=0.4*cm,
leftMargin=0.4*cm,
topMargin=0.4*cm,
bottomMargin=0.4*cm
)
story = []
# Page 1: Modern Cover
story.extend(self._create_modern_cover(data))
story.append(PageBreak())
# Page 2: Modern Features
story.extend(self._create_modern_features(data))
story.append(PageBreak())
# Page 3: Modern Amenities
story.extend(self._create_modern_amenities(data))
# Build PDF
doc.build(story, onFirstPage=lambda c, d: self._create_modern_header_footer(c, 1, "MODERN APARTMENT"),
onLaterPages=lambda c, d: self._create_modern_header_footer(c, d.page, "MODERN APARTMENT"))
return output_path
def _create_modern_cover(self, data: Dict[str, Any]) -> List:
"""Create modern cover page"""
story = []
# Main Title
story.append(Paragraph("THE MODERN COLLECTION", self.styles['UltraTitle']))
story.append(Spacer(1, 35))
# Property Name
story.append(Paragraph(f"{data.get('propertyName', 'Modern Apartment')}", self.styles['UltraTitle']))
story.append(Spacer(1, 25))
# Location
story.append(Paragraph(f"Located in {data.get('location', 'Dubai')}", self.styles['PremiumSubtitle']))
story.append(Spacer(1, 45))
# Price
story.append(Paragraph("INVESTMENT VALUE", self.styles['SectionHeader']))
story.append(Paragraph(f"AED {data.get('price', 'N/A')}", self.styles['PriceDisplay']))
story.append(Spacer(1, 50))
# Modern Stats
stats_data = [
['BEDROOMS', 'BATHROOMS', 'AREA', 'LOCATION'],
[
data.get('bedrooms', 'N/A'),
data.get('bathrooms', 'N/A'),
f"{data.get('area', 'N/A')} sq ft",
data.get('location', 'N/A')
]
]
stats_table = Table(stats_data, colWidths=[1.8*inch, 1.8*inch, 1.8*inch, 1.8*inch])
stats_table.setStyle(TableStyle([
('BACKGROUND', (0, 0), (-1, 0), HexColor('#1e3a8a')),
('TEXTCOLOR', (0, 0), (-1, 0), colors.white),
('ALIGN', (0, 0), (-1, -1), 'CENTER'),
('FONTNAME', (0, 0), (-1, -1), 'Helvetica-Bold'),
('FONTSIZE', (0, 0), (-1, 0), 16),
('FONTSIZE', (0, 1), (-1, 1), 18),
('BOTTOMPADDING', (0, 0), (-1, -1), 20),
('GRID', (0, 0), (-1, -1), 1, HexColor('#1e3a8a')),
('ROUNDEDCORNERS', [15, 15, 15, 15])
]))
story.append(stats_table)
story.append(Spacer(1, 50))
# Footer
story.append(Paragraph("CONTEMPORARY • ELEGANT • URBAN", self.styles['PremiumSubtitle']))
story.append(Paragraph("Experience the future of urban living", self.styles['ContentText']))
return story
def _create_modern_features(self, data: Dict[str, Any]) -> List:
"""Create modern features page"""
story = []
story.append(Paragraph("MODERN FEATURES", self.styles['SectionHeader']))
story.append(Spacer(1, 30))
# Design Features
story.append(Paragraph("DESIGN FEATURES", self.styles['FeatureText']))
story.append(Spacer(1, 15))
design_features = [
"• Open-concept floor plan",
"• Floor-to-ceiling windows",
"• High ceilings",
"• Modern minimalist design",
"• Smart home integration",
"• Energy-efficient appliances",
"• Premium materials and finishes",
"• Custom lighting design"
]
for feature in design_features:
story.append(Paragraph(feature, self.styles['ContentText']))
story.append(Spacer(1, 30))
# Technology Features
story.append(Paragraph("TECHNOLOGY FEATURES", self.styles['FeatureText']))
story.append(Spacer(1, 15))
tech_features = [
"• Smart home automation",
"• High-speed internet",
"• Security camera systems",
"• Digital door locks",
"• Climate control systems",
"• Entertainment systems",
"• Mobile app control",
"• Energy monitoring"
]
for feature in tech_features:
story.append(Paragraph(feature, self.styles['ContentText']))
return story
def _create_modern_amenities(self, data: Dict[str, Any]) -> List:
"""Create modern amenities page"""
story = []
story.append(Paragraph("MODERN AMENITIES", self.styles['SectionHeader']))
story.append(Spacer(1, 30))
# Building Amenities
story.append(Paragraph("BUILDING AMENITIES", self.styles['FeatureText']))
story.append(Spacer(1, 15))
building_amenities = [
"• Rooftop swimming pool",
"• Fitness center with latest equipment",
"• Co-working spaces",
"• Rooftop terrace and gardens",
"• Concierge services",
"• Package delivery lockers",
"• Bike storage",
"• Electric vehicle charging"
]
for amenity in building_amenities:
story.append(Paragraph(f"🏢 {amenity}", self.styles['ContentText']))
story.append(Spacer(1, 30))
# Lifestyle Amenities
story.append(Paragraph("LIFESTYLE AMENITIES", self.styles['FeatureText']))
story.append(Spacer(1, 15))
lifestyle_amenities = [
"• Community lounge areas",
"• Outdoor dining spaces",
"• Children's play areas",
"• Pet-friendly facilities",
"• Guest parking",
"• 24/7 security",
"• Maintenance services",
"• Community events"
]
for amenity in lifestyle_amenities:
story.append(Paragraph(f"🌟 {amenity}", self.styles['ContentText']))
return story
def _create_modern_header_footer(self, canvas_obj, page_num: int, template_name: str):
"""Create modern header and footer"""
# Header
canvas_obj.setFillColor(HexColor('#1e3a8a'))
canvas_obj.setFont("Helvetica-Bold", 18)
canvas_obj.drawString(50, A4[1] - 40, "MODERN REAL ESTATE")
canvas_obj.setFont("Helvetica", 14)
canvas_obj.drawString(50, A4[1] - 60, "Contemporary Property Solutions")
# Template indicator
canvas_obj.setFillColor(HexColor('#3b82f6'))
canvas_obj.setFont("Helvetica-Bold", 16)
canvas_obj.drawRightString(A4[0] - 50, A4[1] - 40, template_name)
# Footer
canvas_obj.setFillColor(HexColor('#475569'))
canvas_obj.setFont("Helvetica", 12)
canvas_obj.drawCentredString(A4[0]/2, 35, f"Generated on {datetime.now().strftime('%B %d, %Y')}")
canvas_obj.drawCentredString(A4[0]/2, 20, "Modern Real Estate - Contemporary Living")
# Page number
canvas_obj.drawRightString(A4[0] - 50, 20, f"Page {page_num}")
def main():
"""Test the advanced templates"""
templates = AdvancedPropertyTemplates()
# Sample data
sample_data = {
'propertyName': 'Luxury Marina Villa',
'propertyType': 'Villa',
'location': 'Dubai Marina',
'price': '5,500,000',
'bedrooms': '5',
'bathrooms': '6',
'area': '4,200',
'description': 'Stunning luxury villa with panoramic marina views, premium finishes, and exclusive amenities.',
'amenities': ['Private Pool', 'Gym', 'Security', 'Garden', 'Garage', 'Smart Home']
}
# Test luxury villa template
try:
result = templates.create_luxury_villa_template(sample_data, 'luxury_villa_brochure.pdf')
print(f"Luxury villa PDF generated: {result}")
except Exception as e:
print(f"Error: {str(e)}")
# Test modern apartment template
try:
result = templates.create_modern_apartment_template(sample_data, 'modern_apartment_brochure.pdf')
print(f"Modern apartment PDF generated: {result}")
except Exception as e:
print(f"Error: {str(e)}")
if __name__ == "__main__":
main()