Baixe pdfkit PDF usando FastAPI

Oct 23 2020

Vou criar uma API que converte html em arquivo PDF. Fiz usando pdfkit e fastapi. Mas ele salva o arquivo no meu host local. Depois de servir esta API online, como os usuários podem baixar este arquivo PDF para seus computadores.

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')

Respostas

1 Hakan Oct 23 2020 at 15:30

Retornar FileResponse resolveu meu problema. Agradecimentos a @Paul H e @clmno Os códigos abaixo são exemplos funcionais de retorno de arquivo pdf para download com 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 é outra maneira de usar arquivos temporários - para adicionar pdf a uma variável, basta escrever False em vez de caminho -

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")