当前位置: 首页 > 工具软件 > PDFium > 使用案例 >

pdfium实现pdf转图片

李华茂
2023-12-01

编译好的pdfium库64&32位下载:

链接:https://pan.baidu.com/s/18TIg_2QutYJ8_imIIgLoRg 
提取码:xyij 

需要依赖以上库文件,里面包含64位和32位的库文件,是从一位大神那里要来的,pdfium编译太难了。

直接上代码,注释写的很详细,不再赘述。

char * getFileContents(const char *fileName, size_t *size)

{

std::fstream instream;

instream.open(fileName, std::ios::_Nocreate | std::ios::binary);

if (!instream.is_open())

{

instream.close();

return nullptr;

}

instream.seekg(0, std::ios::end);

*size = instream.tellg();

instream.seekg(0, std::ios::beg);

// 保存文件数据缓冲区,一点要在调用后释放

char *buffer = new char[*size];

instream.read(buffer, *size);

instream.close();

return buffer;

}

bool convertPdf(const char* fileName, const char* outPath)

{

bool ret = false;

size_t len = 0;

// 裸数据不能用来直接生成图片,这里只用来获取文件长度和判断是否可以打开文件

char *fileData = getFileContents(fileName, &len);

// 若打开文件失败则放弃转换

if (fileData == nullptr)

return ret;

delete[]fileData;

// 初始化Pdfium库

FPDF_InitLibrary();

// 加载pdf文件

FPDF_DOCUMENT doc = FPDF_LoadDocument(fileName, "");

// 获取pdf文件页数,若总页数不大于0这表示打开文件失败

int pageCount = FPDF_GetPageCount(doc);

if (pageCount > 0)

{

// 加载单页数据,页码从0开始

FPDF_PAGE page = FPDF_LoadPage(doc, 0);

// 获取页面数据宽高

int width = static_cast(FPDF_GetPageWidth(page));

int height = static_cast(FPDF_GetPageHeight(page));

// 创建空白位图对象

FPDF_BITMAP bitmap = FPDFBitmap_Create(width, height, 0);

FPDFBitmap_FillRect(bitmap, 0, 0, width, height, 0xFFFFFFFF);

// 渲染图片

FPDF_RenderPageBitmap(bitmap, page, 0, 0, width, height, 0, 0);

const char* buffer = reinterpret_cast(FPDFBitmap_GetBuffer(bitmap));

int size = (int)len;

QImage image((uchar*)buffer, width, height, QImage::Format_RGBA8888);

// 品质因数必须在0到100或-1的范围内。指定0以获取较小的压缩文件,指定100为大型未压缩文件

int quality = -1;

image.save(outPath, 0, quality);

// 释放打开的页

FPDF_ClosePage(page);

ret = true;

}

// 释放pdf文件

FPDF_CloseDocument(doc);

// 释放库

FPDF_DestroyLibrary();

return ret;

}

 类似资料: