PDF 转图片
本节说明如何在精简版中打开 PDF、渲染页面并保存为图片。完整可运行工程见发布包:
examples/simple_demo/pdf2image/
工程接入与初始化见 快速开始。
流程
- 用
PDFDoc打开 PDF(路径或内存缓冲区等),调用Load。 GetPage取得页面,StartParse解析页面。- 按页面宽高(及目标缩放)创建并填充
Bitmap。 GetDisplayMatrix计算显示矩阵,Renderer::StartRender渲染。Image::AddFrame+SaveAs写出图片;多页 TIFF 可向同一Image多次AddFrame。
API 概览
| 功能 | C++ API | 说明 |
|---|---|---|
| 打开文档 | foxit::pdf::PDFDoc | 路径、内存或 ReaderCallback |
| 加载 | PDFDoc::Load / LoadW | 可选密码 |
| 页面 | PDFDoc::GetPage / GetPageCount | 取得 PDFPage |
| 解析 | PDFPage::StartParse | 渲染前需解析 |
| 尺寸 / 旋转 | GetWidth、GetHeight、GetRotation | 计算位图与矩阵 |
| 显示矩阵 | PDFPage::GetDisplayMatrix | 目标区域与旋转 |
| 渲染 | foxit::common::Renderer | 绑定 Bitmap(Windows 亦可绑定 HDC)后 StartRender |
| 存图 | Image::AddFrame / SaveAs | 扩展名决定格式 |
支持的图片格式
pdf2image 示例中,单页可分别保存为:
.bmp、.jpg/.jpeg、.png、.jpx、.jp2
多页可合并保存为:
.tif/.tiff
实际以 Image::SaveAs 与目标扩展名支持为准。更多说明可参考全功能库 图片转换(仅适用精简版已提供的接口)。
基本示例
将 PDF 每一页保存为 PNG:
c++
#include "common/fs_common.h"
#include "common/fs_image.h"
#include "common/fs_render.h"
#include "pdf/fs_pdfdoc.h"
#include "pdf/fs_pdfpage.h"
using namespace foxit;
using namespace foxit::common;
using namespace foxit::pdf;
bool SavePdfPagesAsPng(const wchar_t* input_pdf, const wchar_t* output_dir) {
PDFDoc doc(input_pdf);
ErrorCode error_code = doc.Load();
if (error_code != e_ErrSuccess) {
return false;
}
int page_count = doc.GetPageCount();
for (int i = 0; i < page_count; i++) {
PDFPage page = doc.GetPage(i);
page.StartParse(PDFPage::e_ParsePageNormal, NULL, false);
int width = static_cast<int>(page.GetWidth());
int height = static_cast<int>(page.GetHeight());
Matrix matrix = page.GetDisplayMatrix(0, 0, width, height, page.GetRotation());
Bitmap bitmap(width, height, Bitmap::e_DIBArgb, NULL, 0);
bitmap.FillRect(0xFFFFFFFF, NULL);
Renderer render(bitmap, false);
render.StartRender(page, matrix, NULL);
Image image;
image.AddFrame(bitmap);
WString file_name;
file_name.Format(L"page_%d.png", i);
WString output_file = output_path + file_name;
if (!image.SaveAs(output_file)) {
return false;
}
}
return true;
}
NOTE
StartParse/StartRender的pause为NULL时通常一次完成,适合简单同步出图(与随包pdf2image示例一致)。若传入PauseCallback,或需确保复杂页解析/渲染完整,应检查返回的Progressive,并调用Continue推进至进度为 100%。调用前须已成功执行
Library::Initialize。需要更高清晰度时,按目标 DPI 放大width/height(及对应GetDisplayMatrix参数),做法与 OFD 转图片 中高 DPI 示例类似。
常用扩展
随包 pdf2image 示例还演示了:
| 场景 | 做法 |
|---|---|
| 多格式导出 | 同一 Bitmap 多次 SaveAs 不同扩展名 |
| 多页 TIFF | 各页渲染后向同一 Image AddFrame,再保存 .tif / .tiff |
| 从内存打开 PDF | PDFDoc(buffer, size) 后 Load |
| Windows HDC 渲染 | Renderer(HDC) + StartRender(仅 Windows;远程桌面等环境未验证) |
页面渲染选项细节可参考全功能库 PDF 渲染;表单填充、注释编辑等完整 PDF 能力不属于精简版。
相关示例
| 路径 | 说明 |
|---|---|
examples/simple_demo/pdf2image/pdf2image.cpp | 文件/内存加载、多格式出图、多页 TIFF;Windows 另含 HDC 示例 |
- Windows:用
simple_demo_mini_vs*.sln打开并运行pdf2image工程。 - Linux:在
examples/simple_demo/下执行./RunDemo.sh pdf2image(HDC 相关代码仅 Windows 编译)。
详见 快速开始。