FLD 功能概述
FLD(Fixed-layout document)模块用于统一承载 PDF/OFD 文档访问能力,提供文档加载、类型识别、页枚举、页面几何信息与显示矩阵计算等通用接口。开发者可先通过 FLDDoc 建立统一处理流程,再依据文档类型映射到 PDFDoc 或 OFDDoc 执行格式专属能力,从而降低多格式接入成本并提升业务代码复用性。
支持范围
FLD 模块随 福昕 PDF SDK 发布,当前支持以下运行环境:
| 维度 | 支持项 |
|---|---|
| 语言 | C++、Java |
| 操作系统 | Windows、Linux |
| 架构 | Windows x86、Windows x64、Linux x86_64 |
请选用与目标平台匹配的 SDK 发布包。未列出的操作系统或 CPU 架构不在当前预编译库支持范围内。不同语言中的类名、头文件和包路径略有差异,请参阅下方「API 概览」及接口文档。
适用场景
FLD 模块适用于以下场景:
- 使用统一入口加载 PDF 或 OFD 文档。
- 在业务层不预先区分文件格式的情况下,获取文档类型、页数和页面信息。
- 基于统一页面对象获取页面尺寸、旋转角度和显示矩阵。
- 构建 PDF/OFD 共用的预览、缩略图、批量渲染或格式分发流程。
- 在识别文档类型后,将
FLDDoc映射为PDFDoc或OFDDoc,继续调用格式专属 API。
如果业务需要处理 OFD 书签、附件、水印、签名、图形对象等 OFD 专属能力,应使用 OFD 模块
API 概览
| 功能 | C++ API(foxit::fld / foxit::common) | 核心参数 / 描述 |
|---|---|---|
| 文档对象 | FLDDoc | 路径或内存构造 → Load → 识别 PDF/OFD |
| 页面对象 | FLDPage | GetPage 取得 → Parse → 读尺寸/矩阵 |
| 文档类型 | FLDDoc::FLDType | e_FLDTypePDF、e_FLDTypeOFD、e_FLDTypeUnknown |
| 引擎映射 | PDFDoc(FLDDoc)、OFDDoc(FLDDoc) | 识别类型后进入 PDF / OFD 引擎专属 API |
| 页面渲染 | FLDRender | 构造绑定 Bitmap;Render(FLDPage, matrix) 同步渲染 |
| 渲染选项 | FLDRenderOption | color_mode、back_color、fore_color、x_dpi / y_dpi、is_print |
示例
以下示例基于接口 FLDDoc、PDFDoc(FLDDoc) 和 OFDDoc(FLDDoc),演示如何先通过 FLD 统一加载文档,再根据文档类型进入 PDF 或 OFD 专属处理流程,并读取首页几何信息。
c++
#include "common/fs_common.h"
#include "fld/fs_flddoc.h"
#include "pdf/fs_pdfdoc.h"
#include "ofd/fs_ofddoc.h"
using namespace foxit;
using namespace foxit::fld;
void HandleFixedLayoutDocument(const wchar_t* input_file) {
FLDDoc fld_doc(input_file);
if (fld_doc.IsEmpty()) {
return;
}
ErrorCode error_code = fld_doc.Load("");
if (error_code != e_ErrSuccess) {
return;
}
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 继续处理。
}
int page_count = fld_doc.GetPageCount();
if (page_count > 0) {
FLDPage page = fld_doc.GetPage(0);
if (!page.IsEmpty()) {
error_code = page.Parse();
if (error_code == e_ErrSuccess) {
float page_width = page.GetWidth();
float page_height = page.GetHeight();
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);
// 获取页面几何信息,或使用 FLDRender 渲染页面。
}
}
}
}
java
import com.foxit.sdk.PDFException;
import com.foxit.sdk.common.Constants;
import com.foxit.sdk.common.fxcrt.Matrix2D;
import com.foxit.sdk.fld.FLDDoc;
import com.foxit.sdk.fld.FLDPage;
import com.foxit.sdk.ofd.OFDDoc;
import com.foxit.sdk.pdf.PDFDoc;
public class FLDWorkflow {
public static void handleFixedLayoutDocument(String inputFile) throws PDFException {
FLDDoc fldDoc = new FLDDoc(inputFile);
if (fldDoc.isEmpty()) {
return;
}
int errorCode = fldDoc.load(null);
if (errorCode != Constants.e_ErrSuccess) {
return;
}
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 继续处理。
}
int pageCount = fldDoc.getPageCount();
if (pageCount > 0) {
FLDPage page = fldDoc.getPage(0);
if (!page.isEmpty()) {
errorCode = page.parse();
if (errorCode == Constants.e_ErrSuccess) {
float pageWidth = page.getWidth();
float pageHeight = page.getHeight();
int renderWidth = (int) (pageWidth * 96 / 72);
int renderHeight = (int) (pageHeight * 96 / 72);
Matrix2D matrix = page.getDisplayMatrix(0, 0, renderWidth, renderHeight, Constants.e_Rotation0);
// 获取页面几何信息,或使用 FLDRender 渲染页面。
}
}
}
}
}
相关示例
可运行示例位于 福昕 PDF SDK 发布包 中,路径均相对于 SDK 根目录。各专题章节正文不重复列出示例路径;需要对照完整工程时,请在发布包中打开下列目录:
- C++:
examples/simple_demo/fld_render/fld_render.cpp - Java:
examples/simple_demo/fld_render/fld_render.java