Exemple #1
0
 /**
  * Build the Escher object corresponding to the MSODRAWINGGROUP record
  */
 private function buildWorkbookEscher()
 {
     $escher = null;
     // any drawings in this workbook?
     $found = false;
     foreach ($this->phpExcel->getAllSheets() as $sheet) {
         if (count($sheet->getDrawingCollection()) > 0) {
             $found = true;
             break;
         }
     }
     // nothing to do if there are no drawings
     if (!$found) {
         return;
     }
     // if we reach here, then there are drawings in the workbook
     $escher = new \PHPExcel\Shared\Escher();
     // dggContainer
     $dggContainer = new \PHPExcel\Shared\Escher\DggContainer();
     $escher->setDggContainer($dggContainer);
     // set IDCLs (identifier clusters)
     $dggContainer->setIDCLs($this->IDCLs);
     // this loop is for determining maximum shape identifier of all drawing
     $spIdMax = 0;
     $totalCountShapes = 0;
     $countDrawings = 0;
     foreach ($this->phpExcel->getAllsheets() as $sheet) {
         $sheetCountShapes = 0;
         // count number of shapes (minus group shape), in sheet
         if (count($sheet->getDrawingCollection()) > 0) {
             ++$countDrawings;
             foreach ($sheet->getDrawingCollection() as $drawing) {
                 ++$sheetCountShapes;
                 ++$totalCountShapes;
                 $spId = $sheetCountShapes | $this->phpExcel->getIndex($sheet) + 1 << 10;
                 $spIdMax = max($spId, $spIdMax);
             }
         }
     }
     $dggContainer->setSpIdMax($spIdMax + 1);
     $dggContainer->setCDgSaved($countDrawings);
     $dggContainer->setCSpSaved($totalCountShapes + $countDrawings);
     // total number of shapes incl. one group shapes per drawing
     // bstoreContainer
     $bstoreContainer = new \PHPExcel\Shared\Escher\DggContainer\BstoreContainer();
     $dggContainer->setBstoreContainer($bstoreContainer);
     // the BSE's (all the images)
     foreach ($this->phpExcel->getAllsheets() as $sheet) {
         foreach ($sheet->getDrawingCollection() as $drawing) {
             if ($drawing instanceof \PHPExcel\Worksheet\Drawing) {
                 $filename = $drawing->getPath();
                 list($imagesx, $imagesy, $imageFormat) = getimagesize($filename);
                 switch ($imageFormat) {
                     case 1:
                         // GIF, not supported by BIFF8, we convert to PNG
                         $blipType = \PHPExcel\Shared\Escher\DggContainer\BstoreContainer\BSE::BLIPTYPE_PNG;
                         ob_start();
                         imagepng(imagecreatefromgif($filename));
                         $blipData = ob_get_contents();
                         ob_end_clean();
                         break;
                     case 2:
                         // JPEG
                         $blipType = \PHPExcel\Shared\Escher\DggContainer\BstoreContainer\BSE::BLIPTYPE_JPEG;
                         $blipData = file_get_contents($filename);
                         break;
                     case 3:
                         // PNG
                         $blipType = \PHPExcel\Shared\Escher\DggContainer\BstoreContainer\BSE::BLIPTYPE_PNG;
                         $blipData = file_get_contents($filename);
                         break;
                     case 6:
                         // Windows DIB (BMP), we convert to PNG
                         $blipType = \PHPExcel\Shared\Escher\DggContainer\BstoreContainer\BSE::BLIPTYPE_PNG;
                         ob_start();
                         imagepng(\PHPExcel\Shared\Drawing::imagecreatefrombmp($filename));
                         $blipData = ob_get_contents();
                         ob_end_clean();
                         break;
                     default:
                         continue 2;
                 }
                 $blip = new \PHPExcel\Shared\Escher\DggContainer\BstoreContainer\BSE\Blip();
                 $blip->setData($blipData);
                 $BSE = new \PHPExcel\Shared\Escher\DggContainer\BstoreContainer\BSE();
                 $BSE->setBlipType($blipType);
                 $BSE->setBlip($blip);
                 $bstoreContainer->addBSE($BSE);
             } elseif ($drawing instanceof \PHPExcel\Worksheet\MemoryDrawing) {
                 switch ($drawing->getRenderingFunction()) {
                     case \PHPExcel\Worksheet\MemoryDrawing::RENDERING_JPEG:
                         $blipType = \PHPExcel\Shared\Escher\DggContainer\BstoreContainer\BSE::BLIPTYPE_JPEG;
                         $renderingFunction = 'imagejpeg';
                         break;
                     case \PHPExcel\Worksheet\MemoryDrawing::RENDERING_GIF:
                     case \PHPExcel\Worksheet\MemoryDrawing::RENDERING_PNG:
                     case \PHPExcel\Worksheet\MemoryDrawing::RENDERING_DEFAULT:
                         $blipType = \PHPExcel\Shared\Escher\DggContainer\BstoreContainer\BSE::BLIPTYPE_PNG;
                         $renderingFunction = 'imagepng';
                         break;
                 }
                 ob_start();
                 call_user_func($renderingFunction, $drawing->getImageResource());
                 $blipData = ob_get_contents();
                 ob_end_clean();
                 $blip = new \PHPExcel\Shared\Escher\DggContainer\BstoreContainer\BSE\Blip();
                 $blip->setData($blipData);
                 $BSE = new \PHPExcel\Shared\Escher\DggContainer\BstoreContainer\BSE();
                 $BSE->setBlipType($blipType);
                 $BSE->setBlip($blip);
                 $bstoreContainer->addBSE($BSE);
             }
         }
     }
     // Set the Escher object
     $this->writerWorkbook->setEscher($escher);
 }
Exemple #2
0
 /**
  * Read BlipPNG record. Holds raw PNG image data
  */
 private function readBlipPNG()
 {
     // offset: 0; size: 2; recVer and recInstance
     // bit: 4-15; mask: 0xFFF0; recInstance
     $recInstance = (0xfff0 & \PHPExcel\Reader\Excel5::getInt2d($this->data, $this->pos)) >> 4;
     $length = \PHPExcel\Reader\Excel5::getInt4d($this->data, $this->pos + 4);
     $recordData = substr($this->data, $this->pos + 8, $length);
     // move stream pointer to next record
     $this->pos += 8 + $length;
     $pos = 0;
     // offset: 0; size: 16; rgbUid1 (MD4 digest of)
     $rgbUid1 = substr($recordData, 0, 16);
     $pos += 16;
     // offset: 16; size: 16; rgbUid2 (MD4 digest), only if $recInstance = 0x46B or 0x6E3
     if ($recInstance == 0x6e1) {
         $rgbUid2 = substr($recordData, 16, 16);
         $pos += 16;
     }
     // offset: var; size: 1; tag
     $tag = ord($recordData[$pos]);
     $pos += 1;
     // offset: var; size: var; the raw image data
     $data = substr($recordData, $pos);
     $blip = new \PHPExcel\Shared\Escher\DggContainer\BstoreContainer\BSE\Blip();
     $blip->setData($data);
     $this->object->setBlip($blip);
 }