FastAPIを使用してpdfkitPDFをダウンロードする

Oct 23 2020

HTMLをPDFファイルに変換するAPIを作成します。pdfkitとfastapiを使って作りました。しかし、それはファイルを私のローカルホストに保存します。このAPIをオンラインで提供した後、ユーザーがこのPDFファイルを自分のコンピューターにダウンロードする方法。

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

回答

1 Hakan Oct 23 2020 at 15:30

FileResponseを返すことで、私の問題は解決しました。@Paul Hと@clmnoに感謝します。以下のコードは、FastApiでダウンロードするPDFファイルを返す作業例です。

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)**これはtempfilesを使用する別の方法です-変数にpdfを追加するには、パスの代わりにFalseを書き込むだけです-

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