Flask Integration
Generate PDFs from Flask applications using the Document Stack Python SDK.
Installation
Bash
pip install flask document-stack python-dotenvBasic 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)), 500Direct 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)), 500Using 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.statusProduction Deployment
Use Gunicorn or uWSGI for production. Flask's built-in server is for development only.Next Steps
- Python SDK — Full SDK reference
- Django Integration — Full-featured Django setup
- FastAPI Integration — Async Python framework