Skip to content

OFD 文件包

本节介绍 OFD 模块中的文件包能力,包括从文件路径、内存或自定义读取回调打开 OFD、加载包内文档、检查加密状态,以及保存或另存为 OFD 文件包。

在 OFD 模块中,从磁盘或缓冲区打开 OFD 文件并获取 OFDDoc 时,应使用 OFDPackage 作为入口:先构造 OFDPackage,再调用 LoadDocument 取得 OFDDoc。包级操作(打开、保存、校验、加密检查等)在本节说明;取得 OFDDoc 后的文档与页面处理请参阅 OFD 文档与页面OFD 功能概述 中的功能概览。

任务场景

  • 从文件路径、内存缓冲区或自定义读取回调打开 OFD 文件包。
  • 获取 OFD 文件包中的文档数量。
  • 检查指定文档是否加密,并使用密码加载文档。
  • 保存当前 OFD 文件包或另存为新文件。

API 概览

功能C++ API(foxit::ofd核心参数 / 描述
文件包OFDPackage从路径、内存或 ReaderCallback 打开;IsEmpty 判断是否有效
加载文档OFDPackage::LoadDocumentdocument_index(从 0 起)、password;返回 OFDDoc
文档数量OFDPackage::GetDocumentCount包内 OFD 文档个数
空白文档OFDPackage::AddBlankDocument在包内创建空白 OFDDoc
加密探测IsEncryptedGetEncryptMethod
GetEncryptType
按文档索引查询;详见 安全与权限
规范校验OFDPackage::Verify检查 OFD 是否符合规范(非线性包读文件)
保存选项EnableEmbedFontEnableOptimizeResource
EnableDocumentGrayScaleSetFloatBit
保存前配置;资源优化与 OFD 优化 互补
持久化SaveSaveAs修改文档内容后须包层保存

打开文件包并加载文档

OFDPackage 用于表示 OFD 文件包。通过路径打开文件包后,应先检查对象是否为空,再通过 GetDocumentCount 判断包内是否包含文档。加载文档时,文档索引从 0 开始;若文档未加密,密码参数可传入空字符串或 nullLoadDocument 返回的 OFDDoc 表示包内文档内容对象,可用于后续页面访问及各 OFD 功能处理。

以下示例演示打开 OFD 文件包、加载第一个文档并读取页面数量。

c++
#include "ofd/fs_ofdpackage.h"
#include "ofd/fs_ofddoc.h"

using namespace foxit;
using namespace foxit::ofd;

void LoadFirstOFDDocument(const wchar_t* input_file) {
  OFDPackage package(input_file);
  if (package.IsEmpty()) {
    return;
  }

  int document_count = package.GetDocumentCount();
  if (document_count <= 0) {
    return;
  }

  OFDDoc doc = package.LoadDocument(0, "");
  if (doc.IsEmpty()) {
    return;
  }

  int page_count = doc.GetPageCount();
}
java
import com.foxit.sdk.ofd.OFDDoc;
import com.foxit.sdk.ofd.OFDPackage;

public class OFDPackageLoad {
    public static void loadFirstOFDDocument(String inputFile) throws Exception {
        OFDPackage pkg = new OFDPackage(inputFile);
        if (pkg.isEmpty()) {
            return;
        }

        int documentCount = pkg.getDocumentCount();
        if (documentCount <= 0) {
            return;
        }

        OFDDoc doc = pkg.loadDocument(0, null);
        if (doc.isEmpty()) {
            return;
        }

        int pageCount = doc.getPageCount();
    }
}

校验文件包是否符合规范

若需要检查 OFD 文件是否符合规范,应使用 OFDPackage::Verify。该接口与 OFD 线性包 的包内路径读取能力不同:线性包用于按路径读取内部文件内容,不进行规范校验。

c++
#include "ofd/fs_ofdpackage.h"

using namespace foxit::ofd;

bool VerifyOFDPackage(const wchar_t* input_file) {
  OFDPackage package(input_file);
  if (package.IsEmpty()) {
    return false;
  }
  return package.Verify();
}
java
import com.foxit.sdk.ofd.OFDPackage;

public class OFDPackageVerify {
    public static boolean verifyOFDPackage(String inputFile) throws Exception {
        OFDPackage pkg = new OFDPackage(inputFile);
        if (pkg.isEmpty()) {
            return false;
        }
        return pkg.verify();
    }
}

保存文件包

当通过 OFD API 修改文档内容后,可调用 Save 保存当前文件包,或调用 SaveAs 另存为新文件。保存前可根据业务需要设置字体内嵌、资源优化等选项。

以下示例演示将当前 OFD 文件包另存为新文件。

c++
#include "ofd/fs_ofdpackage.h"

using namespace foxit;
using namespace foxit::ofd;

bool SaveOFDPackageAs(const wchar_t* input_file, const wchar_t* output_file) {
  OFDPackage package(input_file);
  if (package.IsEmpty()) {
    return false;
  }

  package.EnableEmbedFont(true);
  package.EnableOptimizeResource(true);
  return package.SaveAs(WString(output_file));
}
java
import com.foxit.sdk.ofd.OFDPackage;

public class OFDPackageSave {
    public static boolean saveOFDPackageAs(String inputFile, String outputFile) throws Exception {
        OFDPackage pkg = new OFDPackage(inputFile);
        if (pkg.isEmpty()) {
            return false;
        }

        pkg.enableEmbedFont(true);
        pkg.enableOptimizeResource(true);
        return pkg.saveAs(outputFile);
    }
}

注意事项

  • OFDPackage 为空时,表示文件包对象不可用,应停止后续处理。
  • 文档索引有效范围为 0GetDocumentCount() - 1
  • 加载加密文档前,可使用 IsEncryptedGetEncryptMethodGetEncryptType 获取加密状态。
  • OFDDoc 为空时,表示文档加载失败或索引/密码不正确。
  • 保存操作作用于文件包;修改页面、附件、书签、签名等对象后,应通过 OFDPackage::SaveOFDPackage::SaveAs 写回文件。