Skip to content

选择 OFD 还是 FLD

福昕 PDF SDK 同时提供 OFD 模块与 FLD 模块。OFD 模块面向 OFD 格式的完整对象模型与专属能力;FLD 模块面向 PDF/OFD 固定版式文档的统一加载、类型识别、页面访问与渲染。本节帮助开发者根据业务需求选择合适的 API 路径。

模块定位对比

维度OFD 模块FLD 模块
支持格式OFDPDF、OFD
主要能力文件包、文档与页面、渲染、文本、注释、图元、书签、大纲、附件、水印、签名、安全、信封、标引树、元数据、优化等统一加载、类型识别、页枚举、页面解析、显示矩阵、统一渲染
打开 OFD 文件OFDPackageLoadDocumentOFDDocFLDDoc(按路径加载)→ 可选 OFDDoc(FLDDoc)
页面与渲染OFDPageOFDRenderFLDPageFLDRender
典型内容对象OFDDocOFDPageFLDDocFLDPage

OFD 模块中,OFDPackage 负责从文件打开 OFD 并加载 OFDDocOFDDoc 表示包内文档内容对象,负责文档级操作。详见 OFD 功能概述OFD 文件包

推荐使用 OFD 模块的场景

  • 输入已确认为 OFD,且需要文件包级操作(打开、保存、规范校验、加密检查等)。
  • 需要访问或修改 OFD 专有结构(页面树、资源、模板页、附件、书签、大纲等)。
  • 需要处理 OFD 水印、签名、签章、安全权限、图形对象、信封、线性包、优化等专属能力。
  • 信封解密、优化输出等流程完成后,需继续对 OFD 文件进行包级或内容级处理。

推荐使用 FLD 模块的场景

  • 需要统一打开 PDF 或 OFD 固定版式文档,业务层不预先区分格式。
  • 只需获取文档类型、页数、页面尺寸、旋转角度等通用信息。
  • 构建预览、缩略图、批量渲染等格式无关的处理流程。
  • 希望先用统一入口处理,识别类型后再分支到 PDF 或 OFD 专属逻辑。

两种 OFD 处理路径

当业务确定处理 OFD 时,常见有两种入口:

路径适用情况简要流程
OFD 原生路径已确认 OFD;需要文件包保存、校验,或从文件直接打开OFDPackageLoadDocumentOFDDocOFDPage
FLD 统一路径与 PDF 共用同一加载流程;仅需预览/渲染或后续再转 OFD 对象FLDDocGetFLDTypeOFDDoc(FLDDoc) 或继续 FLDPage / FLDRender

若仅需 OFD 专属能力且已通过 FLD 加载,可使用 OFDDoc(FLDDoc) 转入 OFD 文档对象;若涉及文件包保存、规范校验等,仍应使用 OFD 文件包 中的 OFDPackage 流程。

决策流程

建议遵循以下规则:

  1. 输入为固定版式文件且暂不关心具体格式:优先使用 FLD 模块。
  2. 已确认是 OFD,且需要文件包操作或 OFD 内部结构:使用 OFD 模块,从 OFDPackage 打开。
  3. 通过 FLD 统一加载后需要格式专属能力:先调用 GetFLDType,再构造 PDFDocOFDDoc
  4. 信封解密等独立流程输出 OFD 文件后:按 OFD 功能概述 中的打开流程,经 OFDPackage 加载 OFDDoc 继续处理。

示例

以下示例演示通过 GetFLDType 分支构造 PDFDocOFDDoc

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;
        }
    }
}