You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PHPExcel提取Excel工作表中嵌入的PDF文件

解决PHPExcel无法提取Excel中嵌入PDF的问题

首先明确:Excel里嵌入的PDF属于OLE嵌入对象,而非普通图片资源,PHPExcel默认的图片提取方法只处理Drawing对象(对应PNG/JPG这类图片),对OLE对象不生效。

解决方案步骤:

  1. 确认嵌入对象的存储逻辑
    xlsx格式的Excel本质是压缩包,嵌入的OLE对象会存放在xl/embeddings/目录下,文件名多为oleObject1.bin这类格式。你可以直接解压Excel文件查看该目录,确认嵌入文件的存在。

  2. 通过PHPExcel读取并提取OLE对象
    遍历工作表的单元格和绘图集合,筛选出包含PDF的嵌入对象:

    $objPHPExcel = PHPExcel_IOFactory::load('target_file.xlsx');
    $activeSheet = $objPHPExcel->getActiveSheet();
    $drawingCollection = $activeSheet->getDrawingCollection();
    
    foreach ($drawingCollection as $drawing) {
        // 跳过内存绘图对象,只处理文件嵌入的对象
        if ($drawing instanceof PHPExcel_Worksheet_MemoryDrawing) {
            continue;
        }
        
        // 获取嵌入对象的二进制数据
        $rawData = $drawing->getImageData();
        
        // 验证是否为PDF文件(PDF文件头固定为%PDF-)
        if (strpos($rawData, '%PDF-') === 0) {
            file_put_contents('extracted.pdf', $rawData);
            continue;
        }
        
        // 若数据开头带有OLE封装头部,剥离后再保存
        $pdfStartPos = strpos($rawData, '%PDF-');
        if ($pdfStartPos !== false) {
            $purePdfData = substr($rawData, $pdfStartPos);
            file_put_contents('clean_extracted.pdf', $purePdfData);
        }
    }
    
  3. 针对xls格式的补充说明
    老版本xls格式的嵌入对象存储结构不同,需要使用PHPExcel_Reader_Excel5加载文件,且OLE对象的解析需要额外处理二进制头部,建议优先使用xlsx格式简化提取流程。

额外建议

PHPExcel已停止维护,推荐迁移到PhpSpreadsheet(PHPExcel的官方继任者),它对Excel嵌入对象的支持更完善,API也更稳定。

内容的提问来源于stack exchange,提问作者SmonBen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 14:03:09