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::LoadDocument | document_index(从 0 起)、password;返回 OFDDoc |
| 文档数量 | OFDPackage::GetDocumentCount | 包内 OFD 文档个数 |
| 空白文档 | OFDPackage::AddBlankDocument | 在包内创建空白 OFDDoc |
| 加密探测 | IsEncrypted、GetEncryptMethod、GetEncryptType | 按文档索引查询;详见 安全与权限 |
| 规范校验 | OFDPackage::Verify | 检查 OFD 是否符合规范(非线性包读文件) |
| 保存选项 | EnableEmbedFont、EnableOptimizeResource、EnableDocumentGrayScale、SetFloatBit | 保存前配置;资源优化与 OFD 优化 互补 |
| 持久化 | Save、SaveAs | 修改文档内容后须包层保存 |
打开文件包并加载文档
OFDPackage 用于表示 OFD 文件包。通过路径打开文件包后,应先检查对象是否为空,再通过 GetDocumentCount 判断包内是否包含文档。加载文档时,文档索引从 0 开始;若文档未加密,密码参数可传入空字符串或 null。LoadDocument 返回的 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为空时,表示文件包对象不可用,应停止后续处理。- 文档索引有效范围为
0至GetDocumentCount() - 1。 - 加载加密文档前,可使用
IsEncrypted、GetEncryptMethod和GetEncryptType获取加密状态。 OFDDoc为空时,表示文档加载失败或索引/密码不正确。- 保存操作作用于文件包;修改页面、附件、书签、签名等对象后,应通过
OFDPackage::Save或OFDPackage::SaveAs写回文件。