FLD 文档与页面
本节介绍 FLDDoc 与 FLDPage 的常用操作,包括从文件路径或内存缓冲区加载文档、获取文档元信息、枚举页面,以及解析页面并读取几何属性。
任务场景
- 从文件路径或内存缓冲区加载 PDF/OFD 固定版式文档。
- 获取文档类型、版本、页数等基础信息。
- 按页索引获取
FLDPage并解析页面内容。 - 读取页面宽度、高度、旋转角度、显示矩阵和页面区域。
- 在确认文档类型后,将
FLDDoc映射为PDFDoc或OFDDoc继续处理。
API 概览
| 功能 | C++ API(foxit::fld) | 核心参数 / 描述 |
|---|---|---|
| 文档加载 | FLDDoc | 路径(char* / wchar_t*)或内存 (buffer, size) 构造 |
| 加载与类型 | FLDDoc::Load、GetFLDType、GetVersion、GetDocType、GetPageCount | Load(password);FLDType 为 PDF / OFD / Unknown |
| 页面访问 | FLDDoc::GetPage | page_index(0 至 GetPageCount()-1) |
| 页面解析 | FLDPage::Parse、IsParsed | 渲染或读几何信息前须解析 |
| 页面几何 | FLDPage::GetWidth、GetHeight、GetRotation、GetBox | 宽高单位 1/72 英寸;GetBox 为 PDF 坐标系 |
| 显示矩阵 | FLDPage::GetDisplayMatrix | left、top、width、height、Rotation |
| 映射 PDF | pdf::PDFDoc(const FLDDoc&) | GetFLDType() == e_FLDTypePDF 时使用 |
| 映射 OFD | ofd::OFDDoc(const FLDDoc&) | GetFLDType() == e_FLDTypeOFD 时使用 |
| 保存 | FLDDoc::SaveAs | 将文档保存到指定路径 |
加载文档并获取文档信息
FLDDoc 支持通过文件路径(char* / wchar_t*)或内存缓冲区(const void* buffer, size_t size)构造。构造后需调用 Load 完成文档加载,再通过 GetFLDType、GetVersion、GetDocType 和 GetPageCount 获取文档信息。
以下示例演示从文件路径加载文档并读取文档元信息(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 确认文档类型,再构造对应的 PDFDoc 或 OFDDoc。若类型未知或不匹配,不应强行构造格式专属文档对象。
以下示例演示根据 GetFLDType 结果分支构造 PDFDoc 或 OFDDoc:
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的页索引有效范围为0至GetPageCount() - 1。- 渲染或读取页面几何信息前,应确保页面已成功调用
Parse。 - 受密码保护的文档可通过
Load的密码参数传入解密口令。
相关示例
- C++:
examples/simple_demo/fld_render/fld_render.cpp - Java:
examples/simple_demo/fld_render/fld_render.java