我们在做PDF文档解析时有时需要解析PDF文档中的图片数据。跟解析文本类似的常见的解决方案也是两种。文档解析跟ocr技术处理。
下面我们来看看使用文档解析的方案来做PDF文档中的图片解析(使用pdfium库)。
以下为读取PDF中图片数据的相关代码:
cpp
std::string strPdfPath = "pdf.pdf";
//初始化库
FPDF_InitLibrary();
//加载文档
FPDF_DOCUMENT document = FPDF_LoadDocument(strPdfPath.c_str(), nullptr);
if (!document)
{
//load error
}
//获取页数
int page_count = FPDF_GetPageCount(document);
//此处我们只演示处理第一页
FPDF_PAGE page = FPDF_LoadPage(document, 0); // 加载第一页 (索引 0)
if (page)
{
int objCount = FPDFPage_CountObjects(page); //获取当前页的对象数
for (int i = 0; i < objCount; ++i)
{
FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, i);
int nObjType = FPDFPageObj_GetType(obj);//对象类型
switch (nObjType)
{
case FPDF_PAGEOBJ_UNKNOWN:
break;
case FPDF_PAGEOBJ_IMAGE:
{
// 获取图片对象
FPDF_BITMAP bitmap = FPDFImageObj_GetBitmap(obj);
//获取宽、高、stride数据
int nWidth = FPDFBitmap_GetWidth(bitmap);
int nHeight = FPDFBitmap_GetHeight(bitmap);
int nStride = FPDFBitmap_GetStride(bitmap);
//获取format
/*
* 0 FPDFBitmap_Unknown Unknown or unsupported format.
* 1 FPDFBitmap_Gray Gray scale bitmap, one byte per pixel.
* 2 FPDFBitmap_BGR 3 bytes per pixel, byte order: blue, green, red.
* 3 FPDFBitmap_BGRx 4 bytes per pixel, byte order: blue, green, red, unused.
* 4 FPDFBitmap_BGRA 4 bytes per pixel, byte order: blue, green, red, alpha.
*/
//int nFormat = FPDFBitmap_GetFormat(bitmap);
//获取METADATA 这个结构中也包含图片大小、x/y-dpi、colorspace等数据
FPDF_IMAGEOBJ_METADATA imgMetaData;
FPDFImageObj_GetImageMetadata(obj, page, &imgMetaData);
//获取图片数据
int nDataSize = nStride * nHeight;
std::vector<uint8_t> imageData(nDataSize);
FPDFImageObj_GetImageDataRaw(obj, imageData.data(), nDataSize);
//保存图片
//TODO:自行实现
}
break;
default:
break;
}
}
}
FPDF_ClosePage(page);
以上即为使用pdfium解析PDF文档中图片数据相关的代码。在实际测试中在word中插入的图片尺寸比转成PDF中的图片尺寸小。但是读到的图片尺寸跟PDF文档中是一致的。