OFD 转图片
本节说明如何在精简版中打开 OFD、渲染页面并保存为图片。完整可运行工程见发布包:examples/simple_demo/ofd_render/
工程接入与初始化见 快速开始。
流程
- 用
OFDPackage打开 OFD(路径 / 内存 /ReaderCallback)。 LoadDocument取得OFDDoc(首个文档通常为索引0;无密码传空字符串)。GetPage取得OFDPage。- 按页面区域与目标 DPI 计算位图尺寸,创建并填充
Bitmap。 GetDisplayMatrix计算显示矩阵,OFDRender::StartRender渲染;用Progressive推进至完成。Image::AddFrame+SaveAs写出图片。
API 概览
| 功能 | C++ API | 说明 |
|---|---|---|
| 打开文件包 | foxit::ofd::OFDPackage | 路径、内存或 ReaderCallback |
| 加载文档 | OFDPackage::LoadDocument | 文档索引、密码 |
| 页面 | OFDDoc::GetPage / GetPageCount | 取得 OFDPage |
| 页面区域 | OFDPage::GetPageBox | 如 e_PhysicalBox |
| 显示矩阵 | OFDPage::GetDisplayMatrix | 目标区域与旋转 |
| 渲染 | foxit::common::OFDRender | 绑定 Bitmap 后 StartRender |
| 渲染选项 | OFDRenderOption、SetRenderContentFlags | 颜色模式、DPI、是否渲染签章等 |
| 存图 | Image::AddFrame / SaveAs | 由扩展名决定格式(如 .png) |
基本示例
将第一页渲染为 PNG(默认约 96 DPI):
c++
#include "common/fs_common.h"
#include "common/fs_image.h"
#include "common/fs_render.h"
#include "ofd/fs_ofdpackage.h"
#include "ofd/fs_ofddoc.h"
#include "ofd/fs_ofdpage.h"
using namespace foxit;
using namespace foxit::common;
using namespace foxit::ofd;
bool RenderFirstOFDPageToPng(const wchar_t* input_ofd, const wchar_t* output_png) {
OFDPackage package(input_ofd);
if (package.IsEmpty()) {
return false;
}
OFDDoc doc = package.LoadDocument(0, "");
if (doc.IsEmpty() || doc.GetPageCount() <= 0) {
return false;
}
OFDPage page = doc.GetPage(0);
if (page.IsEmpty()) {
return false;
}
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;
int render_width = (int)(page_width * 96 / 72);
int render_height = (int)(page_height * 96 / 72);
Bitmap bitmap(render_width, render_height, Bitmap::e_DIBArgb);
bitmap.FillRect(0xFFFFFFFF, NULL);
Matrix matrix = page.GetDisplayMatrix(0, 0, render_width, render_height, e_Rotation0);
OFDRender render(bitmap);
Progressive progressive = render.StartRender(page, matrix, NULL);
while (progressive.GetRateOfProgress() != 100) {
progressive.Continue();
}
Image image;
image.AddFrame(bitmap);
return image.SaveAs(output_png);
}
调用前须知
调用前须已成功执行 Library::Initialize。
常用扩展
随包 ofd_render 示例还演示了:
| 场景 | 做法 |
|---|---|
| 灰度映射等颜色模式 | 设置 OFDRenderOption::color_mode 等,再 SetRenderOption |
| 仅页面内容 / 含签章注释 | SetRenderContentFlags(如 e_RenderPage、e_RenderSealAnnot) |
| 高 DPI(如 300) | 按 dpi/72 计算位图尺寸,并设置 OFDRenderOption::x_dpi / y_dpi |
| 渲染全部页面 | 遍历 0 .. GetPageCount()-1,逐页渲染并保存 |
同名接口的参数细节可参考全功能库 OFD 渲染;其中完整 OFD 编辑、搜索、签名等能力不属于精简版。
相关示例
| 路径 | 说明 |
|---|---|
examples/simple_demo/ofd_render/ofd_render.cpp | 默认渲染、颜色模式、内容标志、高 DPI、多页出图 |
- Windows:用
simple_demo_mini_vs*.sln打开并运行ofd_render工程。 - Linux:在
examples/simple_demo/下执行./RunDemo.sh ofd_render。
详见 快速开始。