PDF文档中图片解析

我们在做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文档中是一致的。

相关推荐
醉城夜风~8 小时前
(超详细)C++多态(Polymorphism)
开发语言·c++
Albart5758 小时前
Windows快速访问幽灵文件夹彻底解决|清除tmp残留_无效固定项_侧边栏残留(Win10_Win11通用)
windows·powershell脚本·快速访问修复·幽灵文件夹清理·tmp垃圾清除·电脑系统优化
小小龙学IT8 小时前
现代 C++ 内存管理与资源安全深度解析:从 RAII 到所有权模型
c++·安全
欧特克_Glodon8 小时前
OpenCV计算机视觉开发入门与实践<十三>:图像转换之灰度图、二值图
c++·人工智能·opencv·计算机视觉
神仙别闹8 小时前
基于C++ MFC实现动态分区分配存储管理
开发语言·c++·mfc
skr爱码士8 小时前
03_第一个Qt项目:Hello World 的完整拆解
c++·qt·客户端
欧特克_Glodon9 小时前
OpenCV计算机视觉开发入门与实践<十二>:XML 和 YAML 文件读写
xml·c++·opencv·计算机视觉
ryanuo79 小时前
Shadcn/ui × Qt 6/QML:一次从 Web UI 到桌面 UI 的组件化实践
c++·qt·ui·shadcn
余额瞒着我当琳9 小时前
C++--vector第二讲:手写 C++ STL:vector 源码剖析与迭代器失效分析
android·java·c++
Xxtaoaooo9 小时前
极空间部署Stirling PDF:搭建自托管PDF工具箱并实现远程访问
pdf·cpolar·stirling pdf