O3O DocBuilder và chuyển đổi
Ngôn ngữ kịch bản o3oscript
Tham chiếu o3oscript v1, kịch bản JSON khai báo để dựng văn bản, bảng tính và trình chiếu qua POST /v1/build: cấu trúc chung, đơn vị đo, meta, save, font, ràng buộc và lỗi; chi tiết từng thao tác nằm ở ba trang con.
Trong trang này
o3oscript là ngôn ngữ KHAI BÁO viết bằng JSON: bạn mô tả tài liệu muốn có chứ không viết lệnh. Không có biến, vòng lặp, điều kiện hay lời gọi hàm, nên kịch bản không thể chạy vô hạn hay chạm vào máy chủ. Vòng lặp và điều kiện nằm trong mã của bạn, nơi sinh ra JSON. Một kịch bản dựng đúng MỘT tài liệu thuộc một trong ba loại rồi lưu ra một hoặc nhiều định dạng.
{
"o3oscript": 1,
"type": "text",
"meta": {
"title": "Tên tài liệu"
},
"body": [
{
"type": "paragraph",
"text": "Nội dung"
}
],
"save": [
{
"format": "docx"
}
]
}Cấu trúc chung#
Khoá ở gốc
o3oscriptintegerbắt buộcPhiên bản ngôn ngữ, luôn là1.typestringbắt buộctext(văn bản),sheet(bảng tính) hoặcslides(trình chiếu).metaobjecttuỳ chọnThuộc tính tài liệu, xem mục meta.savearray, 1–5 phần tửbắt buộcCác tệp cần lưu, xem mục save.pageobjecttuỳ chọnChỉtext. Khổ giấy và lề.styleobjecttuỳ chọnChỉtext. Kiểu chữ mặc định.headerobjecttuỳ chọnChỉtext. Đầu trang.footerobjecttuỳ chọnChỉtext. Chân trang.bodyarray, 1–20.000 khốituỳ chọnBắt buộc khitype = text. Các khối nội dung theo thứ tự.sheetsarray, 1–50 trang tínhtuỳ chọnBắt buộc khitype = sheet.slide_sizestringtuỳ chọnMặc định:16:9Chỉslides.16:9hoặc4:3.slide_styleobjecttuỳ chọnChỉslides. Kiểu chung của mọi trang chiếu.slidesarray, 1–500 trang chiếutuỳ chọnBắt buộc khitype = slides.
Ba loại tài liệu#
type | Khoá nội dung | Định dạng lưu | Tham chiếu |
|---|---|---|---|
text | page, style, header, footer, body | docx, odt, pdf | o3oscript cho văn bản |
sheet | sheets | xlsx, ods, pdf | o3oscript cho bảng tính |
slides | slide_size, slide_style, slides | pptx, odp, pdf | o3oscript cho trình chiếu |
Đơn vị đo#
- Mọi độ dài (lề, khoảng cách, bề rộng, chiều cao, toạ độ) tính bằng milimét.
- Cỡ chữ và độ dày viền tính bằng point (pt).
- Màu là chuỗi
#RRGGBB, ví dụ#1D55B8. - Giãn dòng tính theo phần trăm:
100là dòng đơn,150là một dòng rưỡi. - Bề rộng cột của bảng văn bản là số TƯƠNG ĐỐI: các cột chia bề rộng bảng theo tỷ lệ.
Thuộc tính tài liệu: meta#
Đối tượng meta
titlestring, ≤ 255tuỳ chọnTiêu đề tài liệu.subjectstring, ≤ 255tuỳ chọnChủ đề.authorstring, ≤ 255tuỳ chọnTác giả.keywordsarray, ≤ 32 chuỗi, mỗi chuỗi ≤ 64tuỳ chọnTừ khoá.descriptionstring, ≤ 2000tuỳ chọnMô tả.langstringtuỳ chọnMặc định:vi-VNNgôn ngữ của tài liệu, dạngvihoặcvi-VN; ảnh hưởng kiểm tra chính tả và ngắt từ.
{
"meta": {
"title": "Hợp đồng cung cấp dịch vụ",
"subject": "Hợp đồng số HD-2026-091",
"author": "Phòng Pháp chế",
"keywords": [
"hợp đồng",
"dịch vụ"
],
"description": "Bản dựng tự động từ hệ thống quản lý hợp đồng.",
"lang": "vi-VN"
}
}Tệp cần lưu: save#
Mỗi phần tử của save
formatstringbắt buộcMột trong docx, odt, pdf, xlsx, ods, pptx, odp, và phải hợp vớitype(xem bảng ba loại tài liệu).filenamestring, 1–255tuỳ chọnMặc định:tai-lieu.<format>Tên tệp kết quả. Không chứa/ \ : * ? " < > |hay ký tự điều khiển.pdfabooleantuỳ chọnMặc định:falseChỉ có nghĩa khiformat = pdf: xuất PDF/A-2b.
{
"save": [
{
"format": "docx",
"filename": "hop-dong.docx"
},
{
"format": "pdf",
"filename": "hop-dong.pdf",
"pdfa": true
}
]
}Font#
Tên font dài 1 tới 64 ký tự. Image DocBuilder v1 có: Liberation Sans, Liberation Serif, Liberation Mono, Carlito, Caladea, DejaVu Sans, Noto Sans, Noto Serif. Font không có thì LibreOffice tự thay bằng font gần nhất. Liberation Serif, Liberation Sans và Carlito có cùng số đo chữ với Times New Roman, Arial và Calibri, nên tài liệu dùng các font đó thường giữ được bố cục.
Kịch bản mẫu#
| Tệp | type | Đơn vị | Nội dung | Xem |
|---|---|---|---|---|
bao-gia.json | text | 28 | Báo giá bản quyền: đầu và chân trang, bảng, danh sách lồng, ngắt trang. | Văn bản |
bang-luong.json | sheet | 34 | Bảng lương hai trang tính: công thức, tham chiếu chéo trang tính, ngày, định dạng số. | Bảng tính |
gioi-thieu.json | slides | 12 | Ba trang chiếu: trang bìa, gạch đầu dòng nhiều cấp, ảnh nhúng base64, ghi chú. | Trình chiếu |
Cả ba kịch bản đều hợp lệ theo lược đồ và dùng được ngay với POST /v1/build. Cách đếm đơn vị kịch bản nằm ở trang Dựng tài liệu.
Ràng buộc kiểm lúc chạy#
- Mọi hàng của một bảng văn bản phải có cùng số ô với
headerhoặccolumns. - Danh sách lồng tối đa 3 cấp.
- Tên trang tính không được trùng nhau.
- Ảnh base64 phải giải mã được và không quá 10 MB.
- Ảnh theo
urlchịu quy tắc chống SSRF như mọi URL khác mà DocBuilder tự tải.
Đọc lỗi kịch bản#
Lỗi kịch bản chỉ vị trí bằng JSON Pointer: /body/2/level là khoá level của phần tử thứ ba trong body (đánh số từ 0). script_invalid liệt kê mọi chỗ sai lược đồ trong detail.errors; script_error chỉ một chỗ trong detail.path; script_too_large báo detail.units và detail.limit.
script_invalid.{
"error": {
"code": "script_invalid",
"message": "Kịch bản không hợp lệ.",
"detail": {
"errors": [
{
"path": "/body/2/level",
"message": "7 lớn hơn giá trị tối đa 6"
}
]
},
"request_id": "req_0123456789abcdef"
}
}Lược đồ JSON Schema#
Lược đồ chính thức là JSON Schema draft-07, $id https://office.o3o.vn/api/schema/o3oscript-v1.schema.json, có sẵn trong image DocBuilder ở /app/o3oscript-v1.schema.json. Cách kiểm kịch bản ở phía bạn bằng Python hoặc JavaScript: xem Dựng tài liệu.
Sắp có#
Chưa có trong o3oscript v1 (khoá lạ bị lược đồ từ chối): biểu đồ, gộp ô trong bảng văn bản, mục lục tự động, chú thích cuối trang, kiểu chữ đặt tên, bảng tổng hợp (pivot), định dạng có điều kiện, hiệu ứng chuyển trang chiếu, mẫu trang chiếu tuỳ biến, tham chiếu trang tính kiểu dấu chấm than của Excel.