Skip to content

OFD 文档与页面

本节介绍 OFDDocOFDPage 的常用操作,包括通过文件包加载文档、获取页数、访问页面区域,以及页面与模板页的基础管理。取得 OFDDoc 的常见方式请参阅 OFD 文件包;也可通过 OFDDoc(FLDDoc) 从 FLD 统一入口转入,请参阅 FLD 文档与页面

任务场景

  • OFDPackage 加载文档后访问页面。
  • 获取页数、页面 ID、页面区域(PageBox)。
  • 增删改页面、移动页面、保留指定页面。
  • 管理模板页、从模板页创建页面。
  • 合并其他 OFDDoc 内容。

API 概览

功能C++ API(foxit::ofd核心参数 / 描述
文档对象OFDDocOFDPackage::LoadDocument 取得;不可按路径直接构造
页面对象OFDPageGetPage(index)GetPageByIDGetPageBoxGetDisplayMatrix
页面管理OFDDoc::AddPageInsertPage
RemovePageMovePageReservedPage
索引从 0 起;MovePage 调整页序
模板页OFDTemplatePage继承 OFDPageAddTemplatePageGetTemplatePage
GetTemplatePageByNameRemoveTemplatePage
模板应用AddPageFromTemplatePage
OFDPage::SetTemplatePage
从模板新建正文页,或在已有页绑定模板(背景/正文/前景层)
文档合并OFDDoc::InsertDocumentdest_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 确认)。典型流程如下:

  1. 创建模板页OFDDoc::AddTemplatePage 返回 OFDTemplatePage
  2. 设置名称OFDTemplatePage::SetName 设置模板页名称,便于后续通过 GetTemplatePageByName 查找。
  3. 编辑模板内容:在模板页上设置页面区域、图层、图元等;OFDTemplatePage 复用 OFDPage 的页面编辑接口(如 SetPageBox)。
  4. 应用到正文:将模板用于正文页,常见方式包括:
    • 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 开始,有效范围为 0GetPageCount() - 1
  • GetPageBoxGetDisplayMatrix 等几何相关接口用于渲染与版面计算,详见 OFD 渲染
  • 附件、书签、大纲、元数据等文档级能力在 OFDDoc 上提供,请参阅对应专题章节。
  • 修改文档内容后需通过 OFDPackage::SaveSaveAs 写回文件。