1,pdfium库下载
链接:https://pan.baidu.com/s/1AU_jsrb1MyNN1t9XTybsrA
提取码:lvnw
解压过后文件如图所示:
2,创建VS2022工程
创建VS2022工程,并将pdfium文件夹放入工程文件夹下,如图所示:
将pdfium\bin\x64\pdfium.dll和pdfium\lib\x64\pdfium.lib文件复制到工程文件夹下,如下图所示:
在VS2022中的工程文件名处右键,添加现有项,将pdfium.lib添加到工程中,如下所示:
新建cpp文件,将如下代码输入其中:
#include <iostream>
#include <string>
#include <opencv2\opencv.hpp>
#include "fpdfview.h"
#include "fpdf_formfill.h"
#include "fpdf_ext.h"
#include "fpdf_dataavail.h"
#include "fpdf_text.h"
using namespace std;
//file_path(取值如: "test.pdf"): 文件路径
//image_Sharpness(取值如: 5): 得到的图片尺寸与页面尺寸的倍数,越大得到的图片尺寸越大,也就越清晰
void pdf2cimage(char *file_path, const int image_Sharpness)
{
//初始化函数
FPDF_InitLibrary();
//读取pdf文件
FPDF_DOCUMENT pdf_doc = FPDF_LoadDocument(file_path, NULL);
if (pdf_doc == NULL)
{
printf("open file failed.");
return;
}
//读取pdf页数
int pageCount = FPDF_GetPageCount(pdf_doc);
if (pageCount <= 0)
{
FPDF_CloseDocument(pdf_doc);
return;
}
//循环读取pdf每一页并保存为图片
for (int npage = 0; npage < pageCount; npage++)
{
//读取当前pdf页
FPDF_PAGE pdf_page = FPDF_LoadPage(pdf_doc, npage);
//获得当前页高度与宽度(图片要比页面的宽度多1个像素)
const int page_h = FPDF_GetPageHeight(pdf_page) * image_Sharpness;
const int page_w = (FPDF_GetPageWidth(pdf_page) + 1) * image_Sharpness;
//创建PDF图片结构体
FPDF_BITMAP bit;
bit = FPDFBitmap_CreateEx(page_w, page_h, FPDFBitmap_BGR, NULL, NULL);
//图片背景涂色
FPDFBitmap_FillRect(bit, 0, 0, page_w, page_h, 0xffffff);
//渲染图片
FPDF_RenderPageBitmap(bit, pdf_page, 0, 0, page_w, page_h, 0, 0);
//获取图片指针
unsigned char* buffer = (unsigned char*)FPDFBitmap_GetBuffer(bit);
const int stride = FPDFBitmap_GetStride(bit);
//创建opencv图片变量
cv::Mat img(page_h, page_w, CV_8UC3, cv::Scalar(0, 0, 0));
//逐元素赋值
for (int nRow = 0; nRow < page_h; nRow++)
{
for (int nCol = 0; nCol < stride / 3; nCol++)
{
for (int nCha = 0; nCha < 3; nCha++)
{
img.at<cv::Vec3b>(nRow, nCol)[nCha] = *(buffer + nRow * stride + nCol * 3 + nCha);
}
}
}
//保存图像
string save_path(file_path);
save_path.erase(save_path.end() - 4, save_path.end());
save_path = save_path + "_" + std::to_string(npage) + ".jpg";
//std::cout << save_path << std::endl;
cv::imwrite(save_path, img);
//销毁PDF图片结构体
FPDFBitmap_Destroy(bit);
//关闭页面
FPDF_ClosePage(pdf_page);
}
//关闭文件
FPDF_CloseDocument(pdf_doc);
}
int main()
{
char file_path[] = "test2.pdf";
pdf2cimage(file_path, 10);
return 0;
}
最终如下图所示:
3,设置VS2022工程
打开工程属性页 ->c/c++ ->常规,在附加包含目录中加入:(工程存放位置)\pdfium\include\public,如下图所示:
打开工程属性页 ->链接器 ->常规,在附加库目录中加入:(工程存放位置)\pdfium\include\public,如下图所示:
至此配置完成
4,运行代码
在工程目录下放入一个test.pdf文件,如下所示:
在Debug,x64环境下运行代码,如下图所示:
运行结果如下图所示,将pdf转成了图片。
至此完。