Descargar pdfkit PDF usando FastAPI

Oct 23 2020

Voy a crear una API que convierta archivos HTML a PDF. Lo hice usando pdfkit y fastapi. Pero guarda el archivo en mi localhost. Después de servir esta API en línea, cómo los usuarios pueden descargar este archivo PDF en su computadora.

from typing import Optional

from fastapi import FastAPI

import pdfkit

app = FastAPI()
@app.post("/htmltopdf/{url}")
def convert_url(url:str):

  pdfkit.from_url(url, 'converted.pdf')

Respuestas

1 Hakan Oct 23 2020 at 15:30

Devolver FileResponse ha resuelto mi problema. Gracias a @Paul H y @clmno Los siguientes códigos son un ejemplo funcional de devolución de archivos pdf para descargar con FastApi.

from typing import Optional
from fastapi import FastAPI
from starlette.responses import FileResponse
import pdfkit

app = FastAPI()
config = pdfkit.configuration(wkhtmltopdf=r"C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe")

@app.get("/")
def read_root():
    pdfkit.from_url("https://nakhal.expo.com.tr/nakhal/preview","file.pdf", configuration=config)
    return FileResponse(
                "file.pdf",
                media_type="application/pdf",
                filename="ticket.pdf")

** 2) ** Esta es otra forma de usar archivos temporales: para agregar pdf a una variable, simplemente escriba False en lugar de ruta -

from typing import Optional
from fastapi import FastAPI
from starlette.responses import FileResponse
import tempfile
import pdfkit



app = FastAPI()

config = pdfkit.configuration(wkhtmltopdf=r"C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe")


@app.get("/")
def read_root():
    pdf = pdfkit.from_url("https://nakhal.expo.com.tr/nakhal/preview",False, configuration=config)

    with tempfile.NamedTemporaryFile(mode="w+b", suffix=".pdf", delete=False) as TPDF:
        TPDF.write(pdf)
        return FileResponse(
                TPDF.name,
                media_type="application/pdf",
                filename="ticket.pdf")