Document Stack
Document Stack
Docs

Flask Integration

Generate PDFs from Flask applications using the Document Stack Python SDK.

Installation

Bash
pip install flask document-stack python-dotenv

Basic Setup

app.py
import os
from flask import Flask, request, jsonify, send_file
from document_stack import DocumentStack
from dotenv import load_dotenv
import httpx
import io

load_dotenv()

app = Flask(__name__)
ds_client = DocumentStack(api_key=os.environ["DS_API_KEY"])

Generate Endpoint

Generate Route
@app.post("/api/generate")
def generate_pdf():
    body = request.get_json()

    template_id = body.get("templateId")
    if not template_id:
        return jsonify(success=False, error="templateId is required"), 400

    try:
        pdf = ds_client.generate(
            template_id=template_id,
            data=body.get("data", {}),
        )
        return jsonify(success=True, data={"url": pdf.url})
    except Exception as e:
        return jsonify(success=False, error=str(e)), 500

Direct Download

Download Route
@app.get("/api/download/<template_id>")
def download_pdf(template_id):
    try:
        pdf = ds_client.generate(
            template_id=template_id,
            data=dict(request.args),
        )

        response = httpx.get(pdf.url)

        return send_file(
            io.BytesIO(response.content),
            mimetype="application/pdf",
            as_attachment=True,
            download_name="document.pdf",
        )
    except Exception as e:
        return jsonify(success=False, error=str(e)), 500

Using Blueprints

For larger applications, organize PDF routes in a Blueprint:

blueprints/pdf.py
from flask import Blueprint, request, jsonify
from document_stack import DocumentStack
import os

pdf_bp = Blueprint("pdf", __name__, url_prefix="/api/pdf")
ds_client = DocumentStack(api_key=os.environ["DS_API_KEY"])

@pdf_bp.post("/generate")
def generate():
    body = request.get_json()
    pdf = ds_client.generate(
        template_id=body["templateId"],
        data=body.get("data", {}),
    )
    return jsonify(success=True, data={"url": pdf.url})

@pdf_bp.get("/templates")
def list_templates():
    templates = ds_client.templates.list()
    return jsonify(success=True, data=templates)
app.py
from blueprints.pdf import pdf_bp

app = Flask(__name__)
app.register_blueprint(pdf_bp)

Error Handling

Error Handler
from document_stack import DocumentStackError

@app.errorhandler(DocumentStackError)
def handle_ds_error(error):
    return jsonify(
        success=False,
        error=error.message,
    ), error.status

Production Deployment

Use Gunicorn or uWSGI for production. Flask's built-in server is for development only.

Next Steps