import io import requests from flask import Flask, send_file, request from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import A4 from reportlab.lib.units import inch from faker import Faker from reportlab.lib.utils import ImageReader # Import ImageReader import textwrap # Set maximum line width in points (A4 page width is 595 pt, margins ~50 pt) max_width = 480 # You can tweak this as needed app = Flask(__name__) # We can seed 'faker' with 'en_US' or 'de_DE' for random text generation fake_en = Faker('en_US') fake_de = Faker('de_DE') @app.route("/") def index(): return ("

Random PDF Generator

" "

Try the /generate endpoint " "with a 'lang' query param (en or de) for random text.

") @app.route("/generate") def generate_pdf(): # Decide which language to use based on the query parameter; default to English lang = request.args.get('lang', 'en').lower() if lang == 'de': text = "\n\n".join([fake_de.text() for _ in range(4)]) # Generate 4 paragraphs text_after_image = "\n\n".join([fake_de.text() for _ in range(2)]) # Generate 2 paragraphs else: text = "\n\n".join([fake_en.text() for _ in range(4)]) # Generate 4 paragraphs text_after_image = "\n\n".join([fake_en.text() for _ in range(2)]) # Generate 2 paragraphs # Fetch a random image from picsum image_url = "https://picsum.photos/600/400" response = requests.get(image_url) image_data = response.content # raw bytes # Create a PDF in memory pdf_buffer = io.BytesIO() pdf_canvas = canvas.Canvas(pdf_buffer, pagesize=A4) # Add text before the image pdf_canvas.setFont("Helvetica", 12) text_object = pdf_canvas.beginText(50, 780) # Start at the top-left corner text_object.setTextOrigin(50, 780) text_object.setFont("Helvetica", 12) # Wrap and add the paragraphs # Wrap and add the paragraphs for paragraph in text.split("\n\n"): wrapped_lines = textwrap.wrap(paragraph, width=90) # Adjust width to taste for line in wrapped_lines: text_object.textLine(line) text_object.textLine("") # Add a blank line between paragraphs pdf_canvas.drawText(text_object) # Embed the image img_buffer = io.BytesIO(image_data) img_reader = ImageReader(img_buffer) # Process the image data pdf_canvas.drawImage(img_reader, 50, 400, width=4 * inch, height=3 * inch) # Add text after the image text_object = pdf_canvas.beginText(50, 380) # Start below the image text_object.setFont("Helvetica", 12) # Wrap and add the paragraphs for paragraph in text_after_image.split("\n\n"): wrapped_lines = textwrap.wrap(paragraph, width=90) # Adjust width to taste for line in wrapped_lines: text_object.textLine(line) text_object.textLine("") # Add a blank line between paragraphs # Draw the text object on the canvas pdf_canvas.drawText(text_object) # Finalize the PDF pdf_canvas.showPage() pdf_canvas.save() pdf_buffer.seek(0) # Return the PDF to the client return send_file(pdf_buffer, as_attachment=True, download_name="random.pdf", mimetype='application/pdf') if __name__ == "__main__": app.run(host="0.0.0.0", port=5000, debug=True)