50 lines
1.5 KiB
Python
50 lines
1.5 KiB
Python
from fastapi import FastAPI, Request
|
|
from fastapi.staticfiles import StaticFiles
|
|
from pydantic import BaseModel
|
|
from reportlab.pdfgen import canvas
|
|
from reportlab.lib.pagesizes import A4
|
|
from reportlab.pdfbase.ttfonts import TTFont
|
|
from reportlab.pdfbase import pdfmetrics
|
|
from reportlab.pdfbase.pdfmetrics import stringWidth
|
|
import uuid, os
|
|
|
|
app = FastAPI()
|
|
|
|
os.makedirs("static", exist_ok=True)
|
|
app.mount("/static", StaticFiles(directory="static"), name="static")
|
|
|
|
pdfmetrics.registerFont(TTFont("TWFont", "NotoSansTC-Medium.ttf"))
|
|
|
|
class TextRequest(BaseModel):
|
|
content: str
|
|
|
|
@app.post("/generate-pdf")
|
|
def generate_pdf(data: TextRequest, request: Request):
|
|
filename = f"{uuid.uuid4()}.pdf"
|
|
filepath = os.path.join("static", filename)
|
|
|
|
c = canvas.Canvas(filepath, pagesize=A4)
|
|
c.setFont("TWFont", 12)
|
|
|
|
text_obj = c.beginText(50, 800)
|
|
text_obj.setFont("TWFont", 12)
|
|
|
|
max_line_width = A4[0] - 50 * 2 # 頁寬扣左右邊距
|
|
|
|
for line in data.content.splitlines():
|
|
while stringWidth(line, "TWFont", 12) > max_line_width:
|
|
for i in range(len(line), 0, -1):
|
|
if stringWidth(line[:i], "TWFont", 12) <= max_line_width:
|
|
text_obj.textLine(line[:i])
|
|
line = line[i:]
|
|
break
|
|
text_obj.textLine(line)
|
|
|
|
c.drawText(text_obj)
|
|
c.showPage()
|
|
c.save()
|
|
|
|
return {
|
|
"download_url": str(request.base_url.rstrip("/")) + f"/static/{filename}"
|
|
}
|