diff --git a/__pycache__/app.cpython-312.pyc b/__pycache__/app.cpython-312.pyc new file mode 100644 index 0000000..d96f7ea Binary files /dev/null and b/__pycache__/app.cpython-312.pyc differ diff --git a/app.py b/app.py index 897bf46..4313921 100644 --- a/app.py +++ b/app.py @@ -2,8 +2,10 @@ from fastapi import FastAPI, Request from fastapi.staticfiles import StaticFiles from pydantic import BaseModel from reportlab.pdfgen import canvas -from reportlab.pdfbase import pdfmetrics +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() @@ -11,13 +13,7 @@ app = FastAPI() os.makedirs("static", exist_ok=True) app.mount("/static", StaticFiles(directory="static"), name="static") -# ✅ 註冊中文字體(請確保字體檔案存在) -font_path = "NotoSansTC-Medium.ttf" # 或使用微軟系統內建:msjh.ttc(微軟正黑體) -if os.path.exists(font_path): - pdfmetrics.registerFont(TTFont("MyFont", font_path)) - font_name = "MyFont" -else: - font_name = "Helvetica" # fallback +pdfmetrics.registerFont(TTFont("TWFont", "NotoSansTC-Medium.ttf")) class TextRequest(BaseModel): content: str @@ -27,11 +23,27 @@ def generate_pdf(data: TextRequest, request: Request): filename = f"{uuid.uuid4()}.pdf" filepath = os.path.join("static", filename) - c = canvas.Canvas(filepath) - c.setFont(font_name, 12) - c.drawString(100, 750, data.content[:1000]) + 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 { - "url": str(request.base_url) + f"static/{filename}" + "download_url": str(request.base_url.rstrip("/")) + f"/static/{filename}" }