608 lines
22 KiB
Python
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() |