Skip to content

OFD 转图片

本节说明如何在精简版中打开 OFD、渲染页面并保存为图片。完整可运行工程见发布包:examples/simple_demo/ofd_render/

工程接入与初始化见 快速开始

流程

  1. OFDPackage 打开 OFD(路径 / 内存 / ReaderCallback)。
  2. LoadDocument 取得 OFDDoc(首个文档通常为索引 0;无密码传空字符串)。
  3. GetPage 取得 OFDPage
  4. 按页面区域与目标 DPI 计算位图尺寸,创建并填充 Bitmap
  5. GetDisplayMatrix 计算显示矩阵,OFDRender::StartRender 渲染;用 Progressive 推进至完成。
  6. Image::AddFrame + SaveAs 写出图片。

API 概览

功能C++ API说明
打开文件包foxit::ofd::OFDPackage路径、内存或 ReaderCallback
加载文档OFDPackage::LoadDocument文档索引、密码
页面OFDDoc::GetPage / GetPageCount取得 OFDPage
页面区域OFDPage::GetPageBoxe_PhysicalBox
显示矩阵OFDPage::GetDisplayMatrix目标区域与旋转
渲染foxit::common::OFDRender绑定 BitmapStartRender
渲染选项OFDRenderOptionSetRenderContentFlags颜色模式、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_RenderPagee_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

详见 快速开始