用 JavaScript / TypeScript 生成 OFD 版式文档(GB/T 33190-2016)— API 对齐 jsPDF
零依赖核心 · 浏览器与 Node 同构 · 含 PDF → OFD 转换
English | 中文
import { jsOFD } from '@hufe921/jsofd';
const doc = new jsOFD({ unit: 'mm', format: 'a4' });
doc.setFont('simsun');
doc.text('你好,OFD', 105, 30, { align: 'center' });
doc.save('hello.ofd');pnpm add @hufe921/jsofd # 核心库
pnpm add @hufe921/jsofd pdfjs-dist # + PDF → OFD 转换| 类别 | 说明 |
|---|---|
| 文本 | 字体/字号/颜色、对齐(含两端)、自动断行(中英混排)、基线、旋转、字距 |
| 中文字体 | 内置宋/黑/楷/仿宋 + TTF 嵌入(任何阅读器渲染一致) |
| 图形 | 直线、贝塞尔、矩形、圆角矩形、圆、椭圆、三角形、虚线、透明度 |
| 图像 | PNG/JPEG/GIF/BMP/TIFF 原样嵌入、旋转、去重 |
| 交互 | 超链接、层级书签、附件 |
| PDF 转换 | 逐条重放绘制指令流,保留真实排版数据 |
| 输出 | 全同步:arraybuffer · blob · dataurlstring 等 |
const ttf = new Uint8Array(await (await fetch('/fonts/MyFont.ttf')).arrayBuffer());
doc.addFontTtf('simsun', 'My Font', ttf);
doc.setFont('simsun');必须使用 TrueType(.ttf) 格式。推荐 Noto Sans SC。
import { pdfToOfd } from '@hufe921/jsofd/pdf';
const doc = await pdfToOfd(pdfBytes, { workerSrc: '/pdf.worker.min.mjs' });
doc.save('converted.ofd');nvm use 24 && pnpm install
pnpm dev # Playground → http://127.0.0.1:5173/jsofd-playground/
pnpm test # 全部测试
pnpm docs # 文档站 → http://127.0.0.1:5174/jsofd-docs/
pnpm lint · pnpm typecheck · pnpm build两个站点都按子路径构建,产物可直接放入 nginx 的 html/ 目录:
pnpm build # packages/playground/dist → html/jsofd-playground/
pnpm docs:build # docs/.vitepress/dist → html/jsofd-docs/基础路径在 packages/playground/vite.config.ts(base: '/jsofd-playground/')与
docs/.vitepress/config.ts(base: '/jsofd-docs/')中定义;Playground 的
PDF 转换依赖(pdfjs cmaps / 标准字体)会随构建自动拷入 dist/assets/pdfjs/。
packages/
├── core/ # jsofd 发布包(库源码 + 150 项测试)
└── playground/ # 交互演示
MIT © hufe