问题描述
我将创建一个将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")