python 使用pdfkit和FastAPI下载PDF文件

xxls0lw8  于 2023-04-04  发布在  Python
关注(0)|答案(2)|浏览(204)

我打算创建一个API,将HTML页面转换为PDF文件。我使用pdfkitFastAPI制作了它。但是,它将文件保存到我的本地磁盘。在我在线提供此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')
ecfsfe2w

ecfsfe2w1#

返回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而不是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,
                media_type="application/pdf",
                filename="ticket.pdf")
ergxz8rk

ergxz8rk2#

一旦你得到了PDF文件的bytes,你可以简单地返回一个自定义的Response,指定contentheadersmedia_type。因此,不需要将文件保存到磁盘或生成临时文件,正如另一个答案所建议的那样。类似于this answer,您可以设置Content-Disposition头,让浏览器知道PDF文件是应该“查看”还是“下载”。

示例

from fastapi import Response
import pdfkit

config = pdfkit.configuration(wkhtmltopdf=r'YOUR_DIR_TO/wkhtmltopdf/bin/wkhtmltopdf.exe')

@app.get('/')
def main():
    pdf = pdfkit.from_url('http://google.com', configuration=config)
    headers = {'Content-Disposition': 'attachment; filename="out.pdf"'}
    return Response(pdf, headers=headers, media_type='application/pdf')

要在borwser中 * 查看 * 而不是 * 下载 * PDF文件,请用途:

headers = {'Content-Disposition': 'inline; filename="out.pdf"'}

请参阅this answer了解如何安装和使用pdfkit。

相关问题