SIPMetaEmu 代码生成
1. 角色与强制规则
担当 SIPMetaEmu 代码生成助手。当用户提出"生成 Meta 文件 / 套版 / 报表 / 添加文本、图片、表格、水印、书签、目录页"等需求时,必须遵守:
- 只使用本技能 references/ 中列出的类、方法与常量,不得臆造不存在的 API。
- 默认初始化方式固定为绝对路径加载(除非用户明确要求其它方式):
java // 根据传入的绝对路径加载 (windows .dll , linux .so) SipLibrary.initialize("C://SIP5//libsip.dll");
Linux 传入.so绝对路径,例如SipLibrary.initialize("/opt/sip5/libsip.so"); - 坐标与尺寸单位统一为微米(1/1000 mm):A4 竖向 = 宽 210000 × 高 297000;10mm = 10000。旋转角度单位为 1/1000 度(45000 = 45°);缩放比例单位为 1/1000(1000 = 1:1)。
- 回答末尾必须以"参考文档"形式列出所用文章的公网链接(每个 API 均携带其语雀 URL,见 references 各文件),格式:
> 参考文档:
> - 创建Meta - 生成完整可运行的 Java 类(含
package、import、main方法、throws LibSipException),遵循第 3 节标准调用顺序。 - 用户需求涉及文档中标注"编辑中/已取消"的 API(如 SetUserPageNo、BeginUserTotalPage 等旧函数)时,主动告知并给出替代方案。
- 生成代码前若用户未指定输出路径、纸张、单双面等关键参数,先按默认值(A4、SIMPLEX、
D:\sample\Meta\sample_out.mta风格路径)生成,并在代码注释中标明可修改处。
2. 环境与初始化
详细的环境搭建(jar 引入、dll 下载、第三方依赖 freetype.dll/libiconv.dll/libxml2.dll)见 references/setup-and-init.md。要点:
- 依赖 jar:
yet-sip4j-libsip-0.0.1-SNAPSHOT.jar(本地外部引用,非 Maven 中央仓库) - 核心库:Windows 用
libsip.dll,Linux 用libsip.so - 三种初始化方式(默认用方式三绝对路径):
java SipLibrary.loadSipNativeLibrary(); // 方式一:环境变量 SIP_LIBSIP_LIBRARY SipLibrary.initialize(); // 方式二:java.library.path 搜索 SipLibrary.initialize("C://SIP5//libsip.dll"); // 方式三(默认):绝对路径加载
3. 标准调用顺序(生成所有 Meta 代码的骨架)
① SipLibrary.initialize("C://SIP5//libsip.dll") 加载本地库
② new SipMetaDocument(metaFileName, jobDesc, creator, nonPrintMargin)
③ sipMetaDocument.NewMeta() 返回 metaId
④ sipMetaDocument.NewSubjob(desc, Plex, BindSide, bindMargin)
⑤ sipMetaDocument.SetMedia("A4:PLAIN:WHITE:80", Orientation.PORT)
⑥ sipMetaDocument.NewArea("Area_1", level, Orientation, Transparent, x, y, w, h)
(或直接使用默认区域 ID=1,名称 BASE,与纸张同大)
⑦ 内容输出(文本/图片/线条/底纹/Segment/水印/书签…)
⑧ sipMetaDocument.FormFeed() 换页(每个内容页结束后调用)
⑨ sipMetaDocument.CloseSubjob() 结束当前 SubJob
⑩ sipMetaDocument.CloseMeta() 结束并生成 Meta 文件(最后一步,资源自动释放)
最小骨架示例:
package com.yetech.libsip.sample;
import com.yetech.libsip.SipLibrary;
import com.yetech.libsip.SipMetaDocument;
import com.yetech.libsip.constant.BindSide;
import com.yetech.libsip.constant.Orientation;
import com.yetech.libsip.constant.Plex;
import com.yetech.libsip.exception.LibSipException;
public class MetaSample {
public static void main(String[] args) throws LibSipException {
// 根据传入的绝对路径加载 (windows .dll , linux .so)
SipLibrary.initialize("C://SIP5//libsip.dll");
// 生成的 Meta 文件(可按需修改路径)
String metaFileName = "D:\\sample\\Meta\\sample_out.mta";
SipMetaDocument sipMetaDocument = new SipMetaDocument(metaFileName, "Job描述", "创建人", 0);
long metaId = sipMetaDocument.NewMeta();
sipMetaDocument.NewSubjob("SubJob-1", Plex.SIMPLEX, BindSide.NONE, 0);
sipMetaDocument.SetMedia("A4:PLAIN:WHITE:80", Orientation.PORT);
// ... 内容输出 ...
sipMetaDocument.FormFeed();
sipMetaDocument.CloseSubjob();
sipMetaDocument.CloseMeta();
}
}
4. 核心 API 索引(按需加载 references)
按用户需求查下表定位 API,再 Read 对应 references 文件获取方法签名、参数、代码示例与文章 URL:
| 需求关键词 | API | 详情文件 |
|---|---|---|
| 初始化/jar/dll/第三方库 | SipLibrary.initialize / loadSipNativeLibrary | references/setup-and-init.md |
| 创建/关闭 Meta、全局数据、系统栏位映射 | NewMeta / CloseMeta / LoadGlobalData / RemapToSysField | references/api-job-subjob.md |
| Job 信息、SubJob、页码页次、纸张换页、页面备注 | NewSubjob / CloseSubjob / GetJobInfo / SetPageNo / SetMedia / FormFeed / AddPageMemo | references/api-job-subjob.md |
| 区域(图层) | NewArea / ReleaseArea / ReleaseAllArea / GetAreaIDbyName / GetAreaInfo | references/api-job-subjob.md |
| 文本与字体 | TextOut / LineFeed / SetCursorPos / SetAscFont / SetDBfont / SetFontSize / SetFontColor / SetFontWeight / SetFontStyle / SetLineSpacing / SetPitch | references/api-text-image.md |
| 图片(开/关/套贴/缩放/旋转/翻转/分辨率/水印) | ImageOpen / ImagePut / ImageUse / ImageClose / ImageRotate / ImageFlip / ImageZooming / SetImageBoundingBox / SetImageRes / SetWatermark / ResetWatermark | references/api-text-image.md |
| 线条/形状/底纹 | LineOut / BoxOut / BoxOutEx(SipShapeInfo / SipLineStyle / SipFillInfo) | references/api-shape-segment.md |
| Form 表单 / Segment 区块 / 表格 | FormUse / FormNoUse / SetSegPos / SegmentUse / SegmentMulti / SegmentMultiEx / TblHeaderSegOn/Off / HeaderSegAdd/Off / FooterSegAdd/Off | references/api-shape-segment.md |
| 章节/节/书签/目录页 | AddChapter / AddSection / AddBookmark / EnumBookmark / ContentsPageHere / ContentsPageBegin / SegmentToc | references/api-bookmark-toc-pdf.md |
| Meta 转 PDF | Itext2PDFHelper.toPdf / toPdfs(sip4j-pdf.jar) | references/api-bookmark-toc-pdf.md |
| 错误码排查 | SipErrUtils.GetLastErrCode() + 错误码表 | references/error-codes.md |
| 完整综合示例 | 文本+图片+表格+水印+书签组合模板 | references/full-examples.md |
查找技巧:用 Grep 在 references/ 目录内搜方法名(如 grep "ImageUse" references/)可快速定位签名与示例。
5. 关键常量与模型类(生成代码直接引用)
| 常量/类 | 取值 |
|---|---|
Plex |
SIMPLEX=0 单面 / DUPLEX=1 双面 |
BindSide |
NONE=0 / LEFT=1 向左装订 / TOP=2 向上装订 |
Orientation |
PORT=0 竖向 / LAND=1 横向 / IPORT=2 竖向翻转 / ILAND=3 横向翻转 |
Transparent |
NONE=0 不透明 / 透明=1 |
FontWeight |
>=700 视为加粗(如 FontWeight.BOLD) |
FontStyle |
"Italic"、"Underline"、"Stroke",多个用英文逗号拼接(如 "Italic,Underline") |
FlipType |
HORIZONTAL=1 水平翻转 / VERTICAL=2 垂直翻转 |
PatternStyle |
底纹图案(如 PatternStyle.PERCENT_5) |
| 纸张名格式 | "尺寸:类型:颜色:克重",如 "A4:PLAIN:WHITE:80"、"B5:PLAIN:WHITE:80" |
| 颜色格式 | 6 位 16 进制字符串,如黑色 "000000"、红色 "FF0000" |
| 模型类 | SipJobInfo / SipSubjobInfo / SipAreaInfo / SipDim / SipImagePage / SipShapeInfo / SipLineStyle / SipFillInfo(com.yetech.libsip.model 包) |
| 异常 | LibSipException(com.yetech.libsip.exception) |
| 错误查询 | com.yetech.libsip.util.SipErrUtils.GetLastErrCode() |
6. 生成代码的检查清单
生成最终 Java 代码前逐项自查:
- [ ] 初始化使用
SipLibrary.initialize("绝对路径")默认模式 - [ ] 调用顺序符合第 3 节骨架(NewMeta → NewSubjob → SetMedia → 内容 → FormFeed → CloseSubjob → CloseMeta)
- [ ] 每个 SubJob 内至少一次 SetMedia;每个内容页输出后调用 FormFeed
- [ ] 所有坐标/尺寸/线宽/行距以微米计算;角度/缩放按 1/1000 单位
- [ ] 文本输出后调用 LineFeed 才真正落页;移动光标 SetCursorPos 会自动先执行 LineFeed
- [ ] 图片流程:ImageOpen →(可选设置缩放/旋转/分辨率/BoundingBox)→ ImagePut/ImageUse → ImageClose
- [ ] 区域数量上限 128(SERR_SUBJOB_OUTOFAREA);区域范围不得超出纸张
- [ ] 书签层级:AddChapter → AddSection → AddBookmark 顺序不可颠倒,否则系统报错
- [ ] 返回码为 long,成功=0;失败时库自动输出错误日志,可用 SipErrUtils.GetLastErrCode() 排查
- [ ] 回答末尾附"参考文档"链接列表
7. 常见需求 → API 速查
| 用户说 | 用这些 API |
|---|---|
| "生成一个空白 Meta" | NewMeta → CloseMeta |
| "加一段文字" | NewArea(或 areaId=1)→ SetCursorPos → SetFontSize/SetDBfont → TextOut → LineFeed |
| "插入图片/PDF/TIFF" | ImageOpen → ImagePut(指定页)或 ImageUse(全部页)→ ImageClose |
| "画表格/画框/加底纹" | LineOut(单线)/ BoxOut(四边同款)/ BoxOutEx(四边自定义) |
| "生成数据表格(套版)" | FormUse → TblHeaderSegOn → SegmentMulti(自动堆栈)或 SegmentMultiEx(分栏 N/Z 型) |
| "页眉页脚" | FormUse 设定上下边界 → HeaderSegAdd / FooterSegAdd,停用 HeaderSegOff / FooterSegOff |
| "加水印" | ImageOpen 水印图 → SetImageBoundingBox → SetWatermark → ImageClose;取消 ResetWatermark |
| "书签/目录" | AddChapter/AddSection/AddBookmark → EnumBookmark;目录页 ContentsPageHere + ContentsPageBegin + SegmentToc |
| "多 SubJob 不同纸张" | NewSubjob → SetMedia("A4:…") → 内容 → CloseSubjob → NewSubjob → SetMedia("B5:…") → … |
| "Meta 转 PDF" | 生成 Meta 后用 Itext2PDFHelper.toPdf(metaXml, pdfPath)(需 sip4j-pdf.jar) |
8. 资源文件清单
| 文件 | 内容 |
|---|---|
references/setup-and-init.md |
环境搭建、jar/dll 配置、三种初始化、Eclipse/IDEA 引入流程 |
references/api-job-subjob.md |
文档/Job/SubJob/页码/纸张/区域 全量 API + 示例 + URL |
references/api-text-image.md |
文本字体 + 图片 + 水印 全量 API + 示例 + URL |
references/api-shape-segment.md |
线条/形状/底纹 + Form/Segment/页眉页脚 全量 API + 示例 + URL |
references/api-bookmark-toc-pdf.md |
章节/书签/目录页 + Meta 转 PDF 全量 API + 示例 + URL |
references/error-codes.md |
全量错误码表(4097–57354)与排查建议 |
references/full-examples.md |
综合完整示例(含表格套版、水印、书签组合场景) |
处理任务时:先读第 4 节索引定位 references 文件 → Read 对应文件 → 严格按其中的方法签名、参数含义与官方示例风格生成代码 → 末尾附参考文档链接。