Tải xuống pdfkit PDF bằng FastAPI

Oct 23 2020

Tôi sẽ tạo một api để chuyển đổi html sang tệp PDF. Tôi đã thực hiện nó bằng pdfkit và fastapi. Nhưng nó lưu tệp vào localhost của tôi. Sau khi tôi cung cấp api này trực tuyến, người dùng có thể tải tệp PDF này xuống máy tính của họ như thế nào.

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

Trả lời

1 Hakan Oct 23 2020 at 15:30

Trả lại FileResponse đã giải quyết được vấn đề của tôi. Cảm ơn mã @Paul H và @clmno Dưới đây là ví dụ hoạt động về việc trả lại tệp pdf để tải xuống bằng 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) ** Đây là một cách khác với việc sử dụng tệp tạm thời - để thêm pdf vào một biến chỉ cần viết Sai thay vì đường dẫn -

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