Skip to content

FLD 文档与页面

本节介绍 FLDDocFLDPage 的常用操作,包括从文件路径或内存缓冲区加载文档、获取文档元信息、枚举页面,以及解析页面并读取几何属性。

任务场景

  • 从文件路径或内存缓冲区加载 PDF/OFD 固定版式文档。
  • 获取文档类型、版本、页数等基础信息。
  • 按页索引获取 FLDPage 并解析页面内容。
  • 读取页面宽度、高度、旋转角度、显示矩阵和页面区域。
  • 在确认文档类型后,将 FLDDoc 映射为 PDFDocOFDDoc 继续处理。

API 概览

功能C++ API(foxit::fld核心参数 / 描述
文档加载FLDDoc路径(char* / wchar_t*)或内存 (buffer, size) 构造
加载与类型FLDDoc::LoadGetFLDType
GetVersionGetDocTypeGetPageCount
Load(password)FLDType 为 PDF / OFD / Unknown
页面访问FLDDoc::GetPagepage_index(0 至 GetPageCount()-1
页面解析FLDPage::ParseIsParsed渲染或读几何信息前须解析
页面几何FLDPage::GetWidthGetHeight
GetRotationGetBox
宽高单位 1/72 英寸;GetBox 为 PDF 坐标系
显示矩阵FLDPage::GetDisplayMatrixlefttopwidthheightRotation
映射 PDFpdf::PDFDoc(const FLDDoc&)GetFLDType() == e_FLDTypePDF 时使用
映射 OFDofd::OFDDoc(const FLDDoc&)GetFLDType() == e_FLDTypeOFD 时使用
保存FLDDoc::SaveAs将文档保存到指定路径

加载文档并获取文档信息

FLDDoc 支持通过文件路径(char* / wchar_t*)或内存缓冲区(const void* buffer, size_t size)构造。构造后需调用 Load 完成文档加载,再通过 GetFLDTypeGetVersionGetDocTypeGetPageCount 获取文档信息。

以下示例演示从文件路径加载文档并读取文档元信息(C++ / Java 可通过标签页切换):

c++
#include "fld/fs_flddoc.h"

using namespace foxit;
using namespace foxit::fld;

void LoadFLDDocument(const wchar_t* input_file) {
  FLDDoc doc(input_file);
  if (doc.IsEmpty()) {
    return;
  }

  ErrorCode error_code = doc.Load("");
  if (error_code != e_ErrSuccess) {
    return;
  }

  FLDDoc::FLDType fld_type = doc.GetFLDType();
  String version = doc.GetVersion();
  String doc_type = doc.GetDocType();
  int page_count = doc.GetPageCount();
}
java
import com.foxit.sdk.PDFException;
import com.foxit.sdk.common.Constants;
import com.foxit.sdk.fld.FLDDoc;

public class FLDDocInfo {
    public static void loadFLDDocument(String inputFile) throws PDFException {
        FLDDoc doc = new FLDDoc(inputFile);
        if (doc.isEmpty()) {
            return;
        }

        int errorCode = doc.load(null);
        if (errorCode != Constants.e_ErrSuccess) {
            return;
        }

        int fldType = doc.getFLDType();
        String version = doc.getVersion();
        String docType = doc.getDocType();
        int pageCount = doc.getPageCount();
    }
}

获取页面并解析

通过 GetPage(page_index) 获取页面对象后,需调用 Parse 解析页面,再读取页面几何信息。页面宽度与高度单位为 1/72 英寸。

以下示例演示获取指定页、解析页面并读取宽度、高度、旋转角度、页面区域和显示矩阵:

c++
#include "fld/fs_flddoc.h"
#include "fld/fs_fldpage.h"

using namespace foxit;
using namespace foxit::fld;

void ParseFLDPage(FLDDoc& doc, int page_index) {
  FLDPage page = doc.GetPage(page_index);
  if (page.IsEmpty()) {
    return;
  }

  ErrorCode error_code = page.Parse();
  if (error_code != e_ErrSuccess) {
    return;
  }

  float page_width = page.GetWidth();
  float page_height = page.GetHeight();
  foxit::common::Rotation rotation = page.GetRotation();
  foxit::RectF box = page.GetBox();

  int render_width = (int)(page_width * 96 / 72);
  int render_height = (int)(page_height * 96 / 72);
  Matrix matrix = page.GetDisplayMatrix(0, 0, render_width, render_height, e_Rotation0);
}
java
import com.foxit.sdk.PDFException;
import com.foxit.sdk.common.Constants;
import com.foxit.sdk.common.fxcrt.Matrix2D;
import com.foxit.sdk.common.fxcrt.RectF;
import com.foxit.sdk.fld.FLDDoc;
import com.foxit.sdk.fld.FLDPage;

public class FLDPageParse {
    public static void parseFLDPage(FLDDoc doc, int pageIndex) throws PDFException {
        FLDPage page = doc.getPage(pageIndex);
        if (page.isEmpty()) {
            return;
        }

        int errorCode = page.parse();
        if (errorCode != Constants.e_ErrSuccess) {
            return;
        }

        float pageWidth = page.getWidth();
        float pageHeight = page.getHeight();
        int rotation = page.getRotation();
        RectF box = page.getBox();

        int renderWidth = (int) (pageWidth * 96 / 72);
        int renderHeight = (int) (pageHeight * 96 / 72);
        Matrix2D matrix = page.getDisplayMatrix(0, 0, renderWidth, renderHeight, Constants.e_Rotation0);
    }
}

映射到 PDFDoc 或 OFDDoc

在调用格式专属 API 前,应先通过 GetFLDType 确认文档类型,再构造对应的 PDFDocOFDDoc。若类型未知或不匹配,不应强行构造格式专属文档对象。

以下示例演示根据 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 MapToFormatDoc(FLDDoc& fld_doc) {
  FLDDoc::FLDType doc_type = fld_doc.GetFLDType();
  if (doc_type == FLDDoc::e_FLDTypePDF) {
    foxit::pdf::PDFDoc pdf_doc(fld_doc);
    // 调用 PDF 专属 API。
  } else if (doc_type == FLDDoc::e_FLDTypeOFD) {
    foxit::ofd::OFDDoc ofd_doc(fld_doc);
    // 调用 OFD 专属 API。
  }
}
java
import com.foxit.sdk.fld.FLDDoc;
import com.foxit.sdk.ofd.OFDDoc;
import com.foxit.sdk.pdf.PDFDoc;

public class FLDDocMapping {
    public static void mapToFormatDoc(FLDDoc fldDoc) throws Exception {
        int docType = fldDoc.getFLDType();
        if (docType == FLDDoc.e_FLDTypePDF) {
            PDFDoc pdfDoc = new PDFDoc(fldDoc);
            // 调用 PDF 专属 API。
        } else if (docType == FLDDoc.e_FLDTypeOFD) {
            OFDDoc ofdDoc = new OFDDoc(fldDoc);
            // 调用 OFD 专属 API。
        }
    }
}

注意事项

  • Load 返回错误码时,后续页面操作可能无效,应中止处理。
  • GetPage 的页索引有效范围为 0GetPageCount() - 1
  • 渲染或读取页面几何信息前,应确保页面已成功调用 Parse
  • 受密码保护的文档可通过 Load 的密码参数传入解密口令。

相关示例

  • C++:examples/simple_demo/fld_render/fld_render.cpp
  • Java:examples/simple_demo/fld_render/fld_render.java