OFD 文档与页面
本节介绍 OFDDoc 与 OFDPage 的常用操作,包括通过文件包加载文档、获取页数、访问页面区域,以及页面与模板页的基础管理。取得 OFDDoc 的常见方式请参阅 OFD 文件包;也可通过 OFDDoc(FLDDoc) 从 FLD 统一入口转入,请参阅 FLD 文档与页面。
任务场景
- 从
OFDPackage加载文档后访问页面。 - 获取页数、页面 ID、页面区域(PageBox)。
- 增删改页面、移动页面、保留指定页面。
- 管理模板页、从模板页创建页面。
- 合并其他
OFDDoc内容。
API 概览
| 功能 | C++ API(foxit::ofd) | 核心参数 / 描述 |
|---|---|---|
| 文档对象 | OFDDoc | 由 OFDPackage::LoadDocument 取得;不可按路径直接构造 |
| 页面对象 | OFDPage | GetPage(index)、GetPageByID;GetPageBox、GetDisplayMatrix |
| 页面管理 | OFDDoc::AddPage、InsertPage、RemovePage、MovePage、ReservedPage | 索引从 0 起;MovePage 调整页序 |
| 模板页 | OFDTemplatePage | 继承 OFDPage;AddTemplatePage、GetTemplatePage、GetTemplatePageByName、RemoveTemplatePage |
| 模板应用 | AddPageFromTemplatePage、OFDPage::SetTemplatePage | 从模板新建正文页,或在已有页绑定模板(背景/正文/前景层) |
| 文档合并 | OFDDoc::InsertDocument | dest_index;将另一 OFDDoc 页插入当前文档 |
| 页数查询 | OFDDoc::GetPageCount | 增删页或插入目录页后须重新获取 |
加载文档并访问页面
以下示例演示通过 OFDPackage 加载文档、获取第一页并读取物理页面区域。
c++
#include "ofd/fs_ofdpackage.h"
#include "ofd/fs_ofddoc.h"
#include "ofd/fs_ofdpage.h"
using namespace foxit;
using namespace foxit::ofd;
void ReadFirstOFDPage(const wchar_t* input_file) {
OFDPackage package(input_file);
if (package.IsEmpty() || package.GetDocumentCount() <= 0) {
return;
}
OFDDoc doc = package.LoadDocument(0, "");
if (doc.IsEmpty() || doc.GetPageCount() <= 0) {
return;
}
OFDPage page = doc.GetPage(0);
if (page.IsEmpty()) {
return;
}
RectF page_box = page.GetPageBox(OFDPage::e_PhysicalBox);
float page_width = page_box.right - page_box.left;
float page_height = page_box.bottom - page_box.top;
}
java
import com.foxit.sdk.common.fxcrt.RectF;
import com.foxit.sdk.ofd.OFDDoc;
import com.foxit.sdk.ofd.OFDPackage;
import com.foxit.sdk.ofd.OFDPage;
public class OFDDocumentPage {
public static void readFirstOFDPage(String inputFile) throws Exception {
OFDPackage pkg = new OFDPackage(inputFile);
if (pkg.isEmpty() || pkg.getDocumentCount() <= 0) {
return;
}
OFDDoc doc = pkg.loadDocument(0, null);
if (doc.isEmpty() || doc.getPageCount() <= 0) {
return;
}
OFDPage page = doc.getPage(0);
if (page.isEmpty()) {
return;
}
RectF pageBox = page.getPageBox(OFDPage.e_PhysicalBox);
float pageWidth = pageBox.getRight() - pageBox.getLeft();
float pageHeight = pageBox.getBottom() - pageBox.getTop();
}
}
创建模板页并应用到正文
OFDTemplatePage 继承自 OFDPage,用于定义可复用的页面版式。调用 OFDDoc::AddTemplatePage 会在文档中 创建模板页并加入文档的模板页列表(可通过 GetTemplatePageCount 确认)。典型流程如下:
- 创建模板页:
OFDDoc::AddTemplatePage返回OFDTemplatePage。 - 设置名称:
OFDTemplatePage::SetName设置模板页名称,便于后续通过GetTemplatePageByName查找。 - 编辑模板内容:在模板页上设置页面区域、图层、图元等;
OFDTemplatePage复用OFDPage的页面编辑接口(如SetPageBox)。 - 应用到正文:将模板用于正文页,常见方式包括:
OFDDoc::AddPageFromTemplatePage:按模板页索引 新建 正文页;OFDPage::SetTemplatePage:在 已有 正文页上按图层(背景 / 正文 / 前景)绑定模板页。
以下示例演示在空白文档中创建模板页、设置名称与页面区域,并基于该模板页创建正文页。示例假定已通过 OFDPackage::AddBlankDocument 取得 OFDDoc;若从已有 OFD 文件加载,请先使用 OFD 文件包 取得 OFDDoc 后再执行相同步骤。
c++
#include "ofd/fs_ofdpackage.h"
#include "ofd/fs_ofddoc.h"
#include "ofd/fs_ofdpage.h"
using namespace foxit;
using namespace foxit::ofd;
bool CreateTemplateAndApplyToBody() {
OFDPackage package;
if (package.IsEmpty()) {
return false;
}
OFDDoc doc = package.AddBlankDocument();
if (doc.IsEmpty()) {
return false;
}
// 1. 创建模板页(加入文档模板页列表)
OFDTemplatePage template_page = doc.AddTemplatePage();
if (template_page.IsEmpty()) {
return false;
}
// 2. 设置名称
if (!template_page.SetName(L"BodyTemplate")) {
return false;
}
// 3. 编辑模板内容(设置物理页面区域)
RectF page_box(0, 200, 200, 0);
if (!template_page.SetPageBox(OFDPage::e_PhysicalBox, page_box)) {
return false;
}
// 4. 应用到正文:基于模板页索引创建正文页
int template_index = doc.GetTemplatePageCount() - 1;
OFDPage body_page = doc.AddPageFromTemplatePage(template_index, 0);
if (body_page.IsEmpty()) {
return false;
}
return body_page.SetPageBox(OFDPage::e_PhysicalBox, page_box);
}
java
import com.foxit.sdk.common.fxcrt.RectF;
import com.foxit.sdk.ofd.OFDDoc;
import com.foxit.sdk.ofd.OFDPackage;
import com.foxit.sdk.ofd.OFDPage;
import com.foxit.sdk.ofd.OFDTemplatePage;
public class OFDTemplatePageExample {
public static boolean createTemplateAndApplyToBody() throws Exception {
OFDPackage pkg = new OFDPackage();
if (pkg.isEmpty()) {
return false;
}
OFDDoc doc = pkg.addBlankDocument();
if (doc.isEmpty()) {
return false;
}
// 1. 创建模板页(加入文档模板页列表)
OFDTemplatePage templatePage = doc.addTemplatePage();
if (templatePage.isEmpty()) {
return false;
}
// 2. 设置名称
if (!templatePage.setName("BodyTemplate")) {
return false;
}
// 3. 编辑模板内容(设置物理页面区域)
RectF pageBox = new RectF(0, 200, 200, 0);
if (!templatePage.setPageBox(OFDPage.e_PhysicalBox, pageBox)) {
return false;
}
// 4. 应用到正文:基于模板页索引创建正文页
int templateIndex = doc.getTemplatePageCount() - 1;
OFDPage bodyPage = doc.addPageFromTemplatePage(templateIndex, 0);
if (bodyPage.isEmpty()) {
return false;
}
return bodyPage.setPageBox(OFDPage.e_PhysicalBox, pageBox);
}
}
若正文页已存在,可将模板页绑定到指定图层,例如:
c++
body_page.SetTemplatePage(template_page, foxit::ofd::OFDLayer::e_LayerTypeBody);
java
bodyPage.setTemplatePage(templatePage, com.foxit.sdk.ofd.OFDLayer.e_LayerTypeBody);
注意事项
- 页面索引从
0开始,有效范围为0至GetPageCount() - 1。 GetPageBox、GetDisplayMatrix等几何相关接口用于渲染与版面计算,详见 OFD 渲染。- 附件、书签、大纲、元数据等文档级能力在
OFDDoc上提供,请参阅对应专题章节。 - 修改文档内容后需通过
OFDPackage::Save或SaveAs写回文件。