选择 OFD 还是 FLD
福昕 PDF SDK 同时提供 OFD 模块与 FLD 模块。OFD 模块面向 OFD 格式的完整对象模型与专属能力;FLD 模块面向 PDF/OFD 固定版式文档的统一加载、类型识别、页面访问与渲染。本节帮助开发者根据业务需求选择合适的 API 路径。
模块定位对比
| 维度 | OFD 模块 | FLD 模块 |
|---|---|---|
| 支持格式 | OFD | PDF、OFD |
| 主要能力 | 文件包、文档与页面、渲染、文本、注释、图元、书签、大纲、附件、水印、签名、安全、信封、标引树、元数据、优化等 | 统一加载、类型识别、页枚举、页面解析、显示矩阵、统一渲染 |
| 打开 OFD 文件 | OFDPackage → LoadDocument → OFDDoc | FLDDoc(按路径加载)→ 可选 OFDDoc(FLDDoc) |
| 页面与渲染 | OFDPage、OFDRender | FLDPage、FLDRender |
| 典型内容对象 | OFDDoc、OFDPage | FLDDoc、FLDPage |
OFD 模块中,OFDPackage 负责从文件打开 OFD 并加载 OFDDoc;OFDDoc 表示包内文档内容对象,负责文档级操作。详见 OFD 功能概述 与 OFD 文件包。
推荐使用 OFD 模块的场景
- 输入已确认为 OFD,且需要文件包级操作(打开、保存、规范校验、加密检查等)。
- 需要访问或修改 OFD 专有结构(页面树、资源、模板页、附件、书签、大纲等)。
- 需要处理 OFD 水印、签名、签章、安全权限、图形对象、信封、线性包、优化等专属能力。
- 信封解密、优化输出等流程完成后,需继续对 OFD 文件进行包级或内容级处理。
推荐使用 FLD 模块的场景
- 需要统一打开 PDF 或 OFD 固定版式文档,业务层不预先区分格式。
- 只需获取文档类型、页数、页面尺寸、旋转角度等通用信息。
- 构建预览、缩略图、批量渲染等格式无关的处理流程。
- 希望先用统一入口处理,识别类型后再分支到 PDF 或 OFD 专属逻辑。
两种 OFD 处理路径
当业务确定处理 OFD 时,常见有两种入口:
| 路径 | 适用情况 | 简要流程 |
|---|---|---|
| OFD 原生路径 | 已确认 OFD;需要文件包保存、校验,或从文件直接打开 | OFDPackage → LoadDocument → OFDDoc → OFDPage |
| FLD 统一路径 | 与 PDF 共用同一加载流程;仅需预览/渲染或后续再转 OFD 对象 | FLDDoc → GetFLDType → OFDDoc(FLDDoc) 或继续 FLDPage / FLDRender |
若仅需 OFD 专属能力且已通过 FLD 加载,可使用 OFDDoc(FLDDoc) 转入 OFD 文档对象;若涉及文件包保存、规范校验等,仍应使用 OFD 文件包 中的 OFDPackage 流程。
决策流程
建议遵循以下规则:
- 输入为固定版式文件且暂不关心具体格式:优先使用 FLD 模块。
- 已确认是 OFD,且需要文件包操作或 OFD 内部结构:使用 OFD 模块,从
OFDPackage打开。 - 通过 FLD 统一加载后需要格式专属能力:先调用
GetFLDType,再构造PDFDoc或OFDDoc。 - 信封解密等独立流程输出 OFD 文件后:按 OFD 功能概述 中的打开流程,经
OFDPackage加载OFDDoc继续处理。
示例
以下示例演示通过 GetFLDType 分支构造 PDFDoc 或 OFDDoc。
c++
#include "fld/fs_flddoc.h"
#include "pdf/fs_pdfdoc.h"
#include "ofd/fs_ofddoc.h"
using namespace foxit;
using namespace foxit::fld;
void RouteByDocumentType(const wchar_t* input_file) {
FLDDoc fld_doc(input_file);
if (fld_doc.IsEmpty() || fld_doc.Load("") != e_ErrSuccess) {
return;
}
switch (fld_doc.GetFLDType()) {
case FLDDoc::e_FLDTypePDF: {
foxit::pdf::PDFDoc pdf_doc(fld_doc);
break;
}
case FLDDoc::e_FLDTypeOFD: {
foxit::ofd::OFDDoc ofd_doc(fld_doc);
break;
}
default:
break;
}
}
java
import com.foxit.sdk.common.Constants;
import com.foxit.sdk.fld.FLDDoc;
import com.foxit.sdk.ofd.OFDDoc;
import com.foxit.sdk.pdf.PDFDoc;
public class ModuleSelection {
public static void routeByDocumentType(String inputFile) throws Exception {
FLDDoc fldDoc = new FLDDoc(inputFile);
if (fldDoc.isEmpty() || fldDoc.load(null) != Constants.e_ErrSuccess) {
return;
}
switch (fldDoc.getFLDType()) {
case FLDDoc.e_FLDTypePDF: {
PDFDoc pdfDoc = new PDFDoc(fldDoc);
break;
}
case FLDDoc.e_FLDTypeOFD: {
OFDDoc ofdDoc = new OFDDoc(fldDoc);
break;
}
default:
break;
}
}
}