# import io | |
# from reportlab.lib.pagesizes import letter | |
# from reportlab.platypus import SimpleDocTemplate, Image, Paragraph, Spacer | |
# from reportlab.lib.styles import getSampleStyleSheet | |
# import matplotlib.pyplot as plt | |
# class ReportGenerator: | |
# def __init__(self): | |
# self.styles = getSampleStyleSheet() | |
# def create_combined_pdf(self, intervention_fig, student_metrics_fig, recommendations): | |
# buffer = io.BytesIO() | |
# doc = SimpleDocTemplate(buffer, pagesize=letter) | |
# elements = [] | |
# # Add the intervention statistics chart | |
# elements.extend(self._add_chart(intervention_fig, "Intervention Statistics")) | |
# # Add the student metrics chart | |
# elements.extend(self._add_chart(student_metrics_fig, "Student Metrics")) | |
# # Add the AI recommendations | |
# elements.extend(self._add_recommendations(recommendations)) | |
# # Build the PDF | |
# doc.build(elements) | |
# buffer.seek(0) | |
# return buffer | |
# def _add_chart(self, fig, title): | |
# elements = [] | |
# elements.append(Paragraph(title, self.styles['Heading2'])) | |
# img_buffer = io.BytesIO() | |
# if hasattr(fig, 'write_image'): # Plotly figure | |
# fig.write_image(img_buffer, format="png") | |
# elif isinstance(fig, plt.Figure): # Matplotlib figure | |
# fig.savefig(img_buffer, format='png') | |
# plt.close(fig) # Close the figure to free up memory | |
# else: | |
# raise ValueError(f"Unsupported figure type: {type(fig)}") | |
# img_buffer.seek(0) | |
# elements.append(Image(img_buffer, width=500, height=300)) | |
# elements.append(Spacer(1, 12)) | |
# return elements | |
# def _add_recommendations(self, recommendations): | |
# elements = [] | |
# elements.append(Paragraph("AI Recommendations", self.styles['Heading1'])) | |
# elements.append(Paragraph(recommendations, self.styles['BodyText'])) | |
# return elements | |
import io | |
from reportlab.lib.pagesizes import letter | |
from reportlab.platypus import SimpleDocTemplate, Image, Paragraph, Spacer | |
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle | |
from reportlab.lib.enums import TA_JUSTIFY | |
from reportlab.lib.units import inch | |
import matplotlib.pyplot as plt | |
class ReportGenerator: | |
def __init__(self): | |
self.styles = getSampleStyleSheet() | |
self.styles.add(ParagraphStyle(name='Justify', alignment=TA_JUSTIFY)) | |
# ... (other methods remain the same) | |
def _add_chart(self, fig, title): | |
elements = [] | |
elements.append(Paragraph(title, self.styles['Heading2'])) | |
img_buffer = io.BytesIO() | |
if hasattr(fig, 'write_image'): # Plotly figure | |
fig.write_image(img_buffer, format="png", width=700, height=400) | |
elif isinstance(fig, plt.Figure): # Matplotlib figure | |
fig.set_size_inches(10, 6) # Set a consistent size | |
fig.savefig(img_buffer, format='png', dpi=100, bbox_inches='tight') | |
plt.close(fig) | |
else: | |
raise ValueError(f"Unsupported figure type: {type(fig)}") | |
img_buffer.seek(0) | |
img = Image(img_buffer) | |
# Calculate width and height to maintain aspect ratio | |
max_width = 6.5 * inch # Maximum width (letter width is 8.5 inches, leaving margins) | |
max_height = 4 * inch # Maximum height | |
img_width, img_height = img.getSize() | |
aspect = img_width / float(img_height) | |
if img_width > max_width: | |
img_width = max_width | |
img_height = img_width / aspect | |
if img_height > max_height: | |
img_height = max_height | |
img_width = img_height * aspect | |
img.drawWidth = img_width | |
img.drawHeight = img_height | |
elements.append(img) | |
elements.append(Spacer(1, 12)) | |
return elements |