#!/usr/bin/env python3 """Combine PNG visualizations into a single PDF report.""" import sys from pathlib import Path from PIL import Image def create_pdf_report(report_type="trends"): """Combine all PNG files into a single PDF.""" viz_dir = Path("/home/vibert/data/suno_data_monitor/viz") # Define different report types report_configs = { "trends": { "files": [ "duplicate_ids_trends.png", "lists_trends.png", "s3_categories_pie_charts.png", "s3_categories_trends.png", "stems_trends.png", "tags_trends.png", "text_trends.png", "validation_trends.png", "distributions_v0.png", "distributions_v1.png", "distributions_v2.png", "distributions_v3.png", "distributions_v4.png", "distributions_v5.png", "distributions_v6.png", "distributions_v8.png", "distributions_v9.png", ], "output": "data_monitoring_report.pdf", }, "filtered": { "files": [ "v9_filtered_dataset_sizes.png", "v9_filtered_tags_comparison.png", "v9_filtered_tags_per_song_histograms.png", "v9_filtered_top_tags_table.png", "v9_filtered_top_regular_tags_table.png", "v9_filtered_text_language_comparison.png", "v9_filtered_text_length_histograms.png", "v9_filtered_bracket_statistics.png", "v9_filtered_stems_lists_comparison.png", "v9_filtered_lists_count_distribution.png", "v9_filtered_artist_ids_histograms.png", "v9_filtered_cover_ids_histograms.png", "v9_filtered_playlist_ids_histograms.png", "v9_filtered_stems_histograms.png", ], "output": "v9_filtered_report.pdf", }, } if report_type not in report_configs: print(f"Error: Unknown report type '{report_type}'") print(f"Available types: {', '.join(report_configs.keys())}") return config = report_configs[report_type] png_files = config["files"] # Load images images = [] for png_file in png_files: png_path = viz_dir / png_file if png_path.exists(): img = Image.open(png_path) # Convert to RGB if needed (PDF doesn't support RGBA) if img.mode == "RGBA": rgb_img = Image.new("RGB", img.size, (255, 255, 255)) rgb_img.paste(img, mask=img.split()[3]) images.append(rgb_img) else: images.append(img.convert("RGB")) print(f"Added: {png_file}") else: print(f"Warning: {png_file} not found") if not images: print("Error: No images found!") return # Save as PDF output_path = viz_dir / config["output"] images[0].save(output_path, save_all=True, append_images=images[1:], resolution=100.0, quality=95) print(f"\nPDF created: {output_path}") print(f"Total pages: {len(images)}") if __name__ == "__main__": report_type = sys.argv[1] if len(sys.argv) > 1 else "trends" create_pdf_report(report_type)