Files
font2pic/apiserver
2026-02-08 22:31:25 +08:00
..
2026-02-08 18:28:39 +08:00
2026-02-08 18:28:39 +08:00
2026-02-08 22:31:25 +08:00
2026-02-08 22:31:25 +08:00
2026-02-08 18:28:39 +08:00
2026-02-08 22:31:25 +08:00
2026-02-08 22:31:25 +08:00

apiserver

apiserver/ 提供微信小程序用的远端渲染接口:

  • 小程序只上传参数(字体 ID、文字、字号、颜色等
  • 服务端读取 fonts.json + fonts/,生成 SVG/PNG 后返回

1. 启动

在仓库根目录执行:

python3 apiserver/server.py \
  --host 0.0.0.0 \
  --port 9300 \
  --static-root /home/gavin/font2svg

其中 --static-root 目录必须包含:

  • fonts.json
  • fonts/(字体文件目录)

如果不传 --manifest,默认读取 <static-root>/fonts.json

2. API

GET /healthz

返回服务健康状态和已加载字体数量。

POST /api/render-svg

请求示例:

{
  "fontId": "其他字体/AlimamaDaoLiTi",
  "text": "星程字体转换",
  "fontSize": 120,
  "fillColor": "#000000",
  "letterSpacing": 0,
  "maxCharsPerLine": 45
}

POST /api/render-png

请求体与 /api/render-svg 相同,成功时直接返回 image/png 二进制。 小程序应使用 wx.request({ responseType: 'arraybuffer' }) 接收。

成功响应:

{
  "ok": true,
  "data": {
    "fontId": "其他字体/AlimamaDaoLiTi",
    "fontName": "AlimamaDaoLiTi",
    "width": 956.2,
    "height": 144.3,
    "svg": "<?xml ...>"
  }
}

3. Nginx 反向代理

fonts.biboer.cn 的 server 块中增加:

location /api/ {
    proxy_pass http://127.0.0.1:9300;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_connect_timeout 5s;
    proxy_send_timeout 60s;
    proxy_read_timeout 60s;
}

然后执行:

sudo nginx -t && sudo systemctl reload nginx

4. systemd可选

仓库内提供示例:apiserver/font2svg-api.service.example,可复制到:

sudo cp apiserver/font2svg-api.service.example /etc/systemd/system/font2svg-api.service
sudo systemctl daemon-reload
sudo systemctl enable --now font2svg-api
sudo systemctl status font2svg-api

5. 约束

  • 字体解析完全基于 fonts.jsonfontId 必须存在。
  • 服务端启用 CORS允许小程序访问。
  • 不依赖 Flask/FastAPI使用 Python 标准库 HTTP 服务。
  • /api/render-png 依赖 node + sharp(使用 apiserver/svg_to_png.js 转换)。