Cắt font (subset) API
Cắt font TTF, OTF, WOFF chỉ giữ ký tự cần dùng (văn bản, dải Unicode, preset Latin hoặc tiếng Việt), xuất WOFF2, WOFF và CSS.
Tải font lên qua multipart file (TTF, OTF, WOFF hoặc bộ TrueType collection với face_index) và chọn ký tự cần giữ: văn bản mẫu text, dải unicodes (U+0020-007E, U+1EA0-1EF9) và / hoặc preset: latin, latin-ext (dải của Google Fonts), vietnamese (Latin cơ bản + Latin-1 + mọi chữ tiếng Việt dựng sẵn + dấu thanh tổ hợp + ₫), vietnamese-only hoặc digits. Font được cắt bằng HarfBuzz hb-subset, giữ các glyph dùng qua bảng OpenType (chữ ghép, dấu).
Chọn format woff2 (mặc định), woff, ttf hoặc all. Kết quả có dung lượng trước và sau, missing_characters là ký tự font không có, vietnamese_support (full / partial / none), khối CSS @font-face kèm unicode-range, và file dạng base64 (output=binary trả về chính file font). Tính năng OpenType: features=default (bộ mặc định của HarfBuzz), all, hoặc danh sách như kern,liga; drop_features để bỏ bớt; hinting=false bỏ hinting cho file nhỏ hơn; pin_axes=true chuyển font biến thiên về bản mặc định.
Không nhận đầu vào WOFF2 (hãy gửi bản TTF / WOFF). Font tối đa 30 MB. Chỉ cắt font có giấy phép cho phép (ví dụ SIL OFL); trách nhiệm về giấy phép font thuộc về bạn.
Tham số
| Tên | Vị trí | Kiểu | Bắt buộc | Mặc định | |
|---|---|---|---|---|---|
file | body | file | có | Font TTF, OTF, WOFF hoặc TTC (multipart, body thô hoặc file_base64), tối đa 30 MB. | |
text | body | string | không | Văn bản mẫu: mọi ký tự trong đó được giữ lại. | |
unicodes | body | string | không | Dải Unicode, ví dụ U+0020-007E, U+20AB (cho phép dạng U+1E??). | |
preset | body | string | không | latin, latin-ext, vietnamese, vietnamese-only, digits (có thể ghép bằng dấu phẩy). | |
format | body | string | không | woff2 | woff2, woff, ttf hoặc all (có thể ghép bằng dấu phẩy). |
features | body | string | không | default | Tính năng OpenType giữ lại: default, all hoặc danh sách như kern,liga,ss01. |
drop_features | body | string | không | Tag tính năng cần bỏ, ví dụ dlig,salt. | |
hinting | body | boolean | không | true | false bỏ hinting TrueType (file nhỏ hơn). |
pin_axes | body | boolean | không | false | Font biến thiên: chỉ giữ bản mặc định. |
family | body | string | không | Tên font-family trong CSS (mặc định: tên họ font). | |
output | body | string | không | json | json (file dạng base64) hoặc binary (định dạng đầu tiên dưới dạng file). |
Ví dụ
curl -X POST "https://apibox.io.vn/v1/font-subset" \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "file=@./my-file"const form = new FormData();
form.append('file', fileInput.files[0]);
const res = await fetch('https://apibox.io.vn/v1/font-subset', {
method: 'POST',
headers: { Authorization: 'Bearer YOUR_API_KEY' },
body: form,
});
console.log(await res.json());import requests
res = requests.post(
"https://apibox.io.vn/v1/font-subset",
headers={"Authorization": "Bearer YOUR_API_KEY"},
files={"file": open("my-file", "rb")},
timeout=30,
)
print(res.json())<?php
$ch = curl_init('https://apibox.io.vn/v1/font-subset');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => ['Authorization: Bearer YOUR_API_KEY'],
CURLOPT_POSTFIELDS => ['file' => new CURLFile('my-file')],
]);
$response = curl_exec($ch);
print_r(json_decode($response, true));Kết quả trả về
{
"font": {
"family": "Be Vietnam Pro",
"style": "Regular",
"full_name": "Be Vietnam Pro Regular",
"postscript_name": "BeVietnamPro-Regular",
"input_format": "ttf",
"input_bytes": 132948,
"characters_in_font": 459
},
"requested": 311,
"kept": 309,
"missing": 2,
"missing_characters": "̩‛",
"missing_ranges": "U+0329, U+201B",
"vietnamese_support": "full",
"features": "default",
"hinting": true,
"sizes": {
"original": 132948,
"woff2": 30884,
"woff": 35096
},
"saved_percent": 76.8,
"unicode_range": "U+0020-007E, U+00A0-00FF, U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0306, U+0309, U+0323, U+1EA0-1EF9, U+2013-2014, U+2018-201A, U+201C-201D, U+2026, U+20AB",
"css": "@font-face {\n font-family: 'Be Vietnam Pro';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url('BeVietnamPro-Regular-subset.woff2') format('woff2'),\n url('BeVietnamPro-Regular-subset.woff') format('woff');\n unicode-range: U+0020-007E, U+00A0-00FF, …, U+1EA0-1EF9, …, U+20AB;\n}",
"files": {
"woff2": {
"filename": "BeVietnamPro-Regular-subset.woff2",
"content_base64": "d09GMgABAAAAAHikABEAAAABScwAAHhGAAEAAAAA…"
},
"woff": {
"filename": "BeVietnamPro-Regular-subset.woff",
"content_base64": "d09GRgABAAAAAIkYABEAAAABScwAAQAAAAAAAAAA…"
}
},
"ms": 177
}
Ứng dụng
- Làm web font tiếng Việt tải nhanh mà không mất dấu
- Tạo font siêu nhỏ chỉ chứa chữ của tiêu đề hoặc logo
- Kiểm tra font có hỗ trợ đủ chữ tiếng Việt trước khi dùng
- Chuyển TTF sang WOFF2 / WOFF kèm sẵn đoạn @font-face
Hỏi đáp
Vì sao chữ tiếng Việt bị lỗi khi dùng subset "latin" của Google?
Các chữ ă, ơ, ư, đ và chữ có dấu thanh (ạ, ế, ữ…) nằm ở dải Latin mở rộng. Dùng preset=vietnamese để giữ Latin cơ bản cùng mọi chữ tiếng Việt dựng sẵn và dấu tổ hợp trong một file.
File WOFF2 được tạo thế nào?
Font sau khi cắt được nén Brotli theo định dạng WOFF2 với bảng không biến đổi (null transform cho glyf / loca theo đặc tả). Trình duyệt tải như mọi WOFF2; file lớn hơn vài phần trăm so với khi biến đổi glyf.
Có báo ký tự bị thiếu không?
Có: missing_characters và missing_ranges liệt kê ký tự được yêu cầu nhưng không có trong cmap của font, và vietnamese_support cho biết full, partial hay none.
API liên quan
Metadata ảnh & EXIF
Đọc kích thước, định dạng, thông tin EXIF máy ảnh, thông số chụp và vị trí GPS của ảnh JPEG, PNG, WebP, HEIC, AVIF, GIF… – upload file hoặc qua URL.
PDFMetadata PDF
Đọc metadata file PDF: số trang, tiêu đề, tác giả, phần mềm tạo, ngày tạo, phiên bản PDF, mã hoá, số trường form và khổ giấy từng trang (A4, Letter…).
PDF₫Tạo PDF báo giá, phiếu thu
Tạo PDF báo giá, phiếu thu, đơn đặt hàng, hoá đơn bán hàng gọn đẹp từ JSON: tiếng Việt chuẩn, thuế GTGT, số tiền bằng chữ và mã VietQR để thanh toán.