使用FastAPI下载pdfkit PDF

问题描述

我将创建一个将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')

解决方法

返回FileResponse解决了我的问题。感谢@Paul H和@clmno 以下代码是返回PDF文件以通过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)**这是使用临时文件的另一种方法-将pdf添加到变量中,只需写False而不是path-

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,filename="ticket.pdf")