C++基于pdfium库实现PDF转图片,VS2022,x64环境,opencv455

1,pdfium库下载

链接:https://pan.baidu.com/s/1AU_jsrb1MyNN1t9XTybsrA
提取码:lvnw

解压过后文件如图所示:
C++基于pdfium库实现PDF转图片,VS2022,x64环境,opencv455_第1张图片

2,创建VS2022工程

创建VS2022工程,并将pdfium文件夹放入工程文件夹下,如图所示:
C++基于pdfium库实现PDF转图片,VS2022,x64环境,opencv455_第2张图片将pdfium\bin\x64\pdfium.dll和pdfium\lib\x64\pdfium.lib文件复制到工程文件夹下,如下图所示:
C++基于pdfium库实现PDF转图片,VS2022,x64环境,opencv455_第3张图片在VS2022中的工程文件名处右键,添加现有项,将pdfium.lib添加到工程中,如下所示:
C++基于pdfium库实现PDF转图片,VS2022,x64环境,opencv455_第4张图片
新建cpp文件,将如下代码输入其中:

#include 
#include 
#include 
#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;
}

最终如下图所示:
C++基于pdfium库实现PDF转图片,VS2022,x64环境,opencv455_第5张图片

3,设置VS2022工程

打开工程属性页 ->c/c++ ->常规,在附加包含目录中加入:(工程存放位置)\pdfium\include\public,如下图所示:
C++基于pdfium库实现PDF转图片,VS2022,x64环境,opencv455_第6张图片
C++基于pdfium库实现PDF转图片,VS2022,x64环境,opencv455_第7张图片
打开工程属性页 ->链接器 ->常规,在附加库目录中加入:(工程存放位置)\pdfium\include\public,如下图所示:
C++基于pdfium库实现PDF转图片,VS2022,x64环境,opencv455_第8张图片
C++基于pdfium库实现PDF转图片,VS2022,x64环境,opencv455_第9张图片至此配置完成

4,运行代码

在工程目录下放入一个test.pdf文件,如下所示:
C++基于pdfium库实现PDF转图片,VS2022,x64环境,opencv455_第10张图片在Debug,x64环境下运行代码,如下图所示:
C++基于pdfium库实现PDF转图片,VS2022,x64环境,opencv455_第11张图片运行结果如下图所示,将pdf转成了图片。
C++基于pdfium库实现PDF转图片,VS2022,x64环境,opencv455_第12张图片至此完。

你可能感兴趣的:(c++,visual,studio,opencv)