使用PDFium将PDF文档转化为图片,效率非常高,图片清晰无水印,并且图像DPI可随意设置
1 首先添加pdfium包含目录
2 第二步添加库目录
3 第三步就可以直接使用了
ZFUNCAPI_API void PdfToBMP(char* PDFpath, char* BMPpath, int BMPdpi, BOOL JingXiang,int Range)
{
FPDF_DOCUMENT pdf_doc;
FPDF_PAGE pdf_page;;
int pageCount;
FPDF_InitLibrary();
pdf_doc = FPDF_LoadDocument(PDFpath, NULL);
pageCount = FPDF_GetPageCount(pdf_doc);
CImage reimage;
float image_Sharpness = (float)BMPdpi / 720 * 10;
//当指点页码无效
pdf_page = FPDF_LoadPage(pdf_doc, 0);
const int page_h = (int)(FPDF_GetPageHeight(pdf_page) * image_Sharpness);
const int page_w = (int)((FPDF_GetPageWidth(pdf_page) + 1) * image_Sharpness);
//图片要比页面的宽度多1个像素
FPDF_BITMAP bit;
//创建PDF图片结构体
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);
reimage.Destroy();
reimage.Create(page_w, page_h, 24);
const int step = reimage.GetPitch();
//指向数据区的指针
unsigned char* pucImage = (unsigned char*)reimage.GetBits();
//数据写到目标数据区
if (JingXiang)
{
for (int nRow = 0; nRow < page_h; nRow++)
{
for (int nCol = 0; nCol < stride / 3; nCol++)
{
for (int nCha = 0; nCha < 3; nCha++)
{
pucImage[nRow * step + nCol * 3 + nCha] = *(buffer + nRow * stride + (stride / 3 - nCol - 1) * 3 + (3 - nCha - 1));
//pucImage[nRow * step + nCol * 3 + nCha] = *(buffer + (page_h-nRow-1) * stride + nCol * 3 + nCha);
}
}
}
}
else
{
for (int nRow = 0; nRow < page_h; nRow++)
{
for (int nCol = 0; nCol < stride / 3; nCol++)
{
for (int nCha = 0; nCha < 3; nCha++)
{
pucImage[nRow * step + nCol * 3 + nCha] = *(buffer + nRow * stride + nCol * 3 + nCha);
}
}
}
}
reimage.Save(BMPpath);
FPDFBitmap_Destroy(bit);
FPDF_ClosePage(pdf_page);
FPDF_CloseDocument(pdf_doc);
FPDF_DestroyLibrary();
if (Range>0)
{
Mat src = imread(BMPpath);
Mat destmat = ImgRotate(src, Range);
imwrite(BMPpath, destmat);
destmat.release();
src.release();
}
}
参数意义 char* PDFpath PDF文件的路径
char* BMPpath 生成bmp文件路径
int BMPdpi 生成bmp文件精度 数据越大图像越清晰图片占内存越大
BOOL JingXiang 是否需要对图像进行镜像
int Range 对图像进行旋转