예제 #1
0
 /**
  * The OfficeArtSpContainer record specifies a shape container.
  * @param string $stream
  * @param integer $pos
  * @link https://msdn.microsoft.com/en-us/library/dd943794(v=office.12).aspx
  */
 private function readRecordOfficeArtSpContainer($stream, $pos)
 {
     $arrayReturn = array('length' => 0, 'shape' => null);
     $data = $this->loadRecordHeader($stream, $pos);
     if ($data['recVer'] == 0xf && $data['recInstance'] == 0x0 && $data['recType'] == 0xf004) {
         // Record Header
         $arrayReturn['length'] += 8;
         // shapeGroup
         $shapeGroup = $this->readRecordOfficeArtFSPGR($stream, $pos + $arrayReturn['length']);
         $arrayReturn['length'] += $shapeGroup['length'];
         // shapeProp
         $shapeProp = $this->readRecordOfficeArtFSP($stream, $pos + $arrayReturn['length']);
         if ($shapeProp['length'] == 0) {
             throw new \Exception('PowerPoint97 Reader : record OfficeArtFSP');
         }
         $arrayReturn['length'] += $shapeProp['length'];
         if ($shapeProp['fDeleted'] == 0x1 && $shapeProp['fChild'] == 0x0) {
             // deletedShape
             $deletedShape = $this->readRecordOfficeArtFPSPL($stream, $pos + $arrayReturn['length']);
             $arrayReturn['length'] += $deletedShape['length'];
         }
         // shapePrimaryOptions
         $shpPrimaryOptions = $this->readRecordOfficeArtFOPT($stream, $pos + $arrayReturn['length']);
         $arrayReturn['length'] += $shpPrimaryOptions['length'];
         // shapeSecondaryOptions1
         $shpSecondaryOptions1 = $this->readRecordOfficeArtSecondaryFOPT($stream, $pos + $arrayReturn['length']);
         $arrayReturn['length'] += $shpSecondaryOptions1['length'];
         // shapeTertiaryOptions1
         $shpTertiaryOptions1 = $this->readRecordOfficeArtTertiaryFOPT($stream, $pos + $arrayReturn['length']);
         $arrayReturn['length'] += $shpTertiaryOptions1['length'];
         // childAnchor
         $childAnchor = $this->readRecordOfficeArtChildAnchor($stream, $pos + $arrayReturn['length']);
         $arrayReturn['length'] += $childAnchor['length'];
         // clientAnchor
         $clientAnchor = $this->readRecordOfficeArtClientAnchor($stream, $pos + $arrayReturn['length']);
         $arrayReturn['length'] += $clientAnchor['length'];
         // clientData
         $clientData = $this->readRecordOfficeArtClientData($stream, $pos + $arrayReturn['length']);
         $arrayReturn['length'] += $clientData['length'];
         // clientTextbox
         $clientTextbox = $this->readRecordOfficeArtClientTextbox($stream, $pos + $arrayReturn['length']);
         $arrayReturn['length'] += $clientTextbox['length'];
         // shapeSecondaryOptions2
         if ($shpSecondaryOptions1['length'] == 0) {
             $shpSecondaryOptions2 = $this->readRecordOfficeArtSecondaryFOPT($stream, $pos + $arrayReturn['length']);
             $arrayReturn['length'] += $shpSecondaryOptions2['length'];
         }
         // shapeTertiaryOptions2
         if ($shpTertiaryOptions1['length'] == 0) {
             $shpTertiaryOptions2 = $this->readRecordOfficeArtTertiaryFOPT($stream, $pos + $arrayReturn['length']);
             $arrayReturn['length'] += $shpTertiaryOptions2['length'];
         }
         // Core : Shape
         // Informations about group are not defined
         $arrayDimensions = array();
         $bIsGroup = false;
         if (is_object($this->oCurrentGroup)) {
             if (!$this->bFirstShapeGroup) {
                 if ($clientAnchor['length'] > 0) {
                     // $this->oCurrentGroup->setOffsetX($clientAnchor['left']);
                     // $this->oCurrentGroup->setOffsetY($clientAnchor['top']);
                     // $this->oCurrentGroup->setHeight($clientAnchor['height']);
                     // $this->oCurrentGroup->setWidth($clientAnchor['width']);
                 }
                 $bIsGroup = true;
                 $this->bFirstShapeGroup = true;
             } else {
                 if ($childAnchor['length'] > 0) {
                     $arrayDimensions = $childAnchor;
                 }
             }
         } else {
             if ($clientAnchor['length'] > 0) {
                 $arrayDimensions = $clientAnchor;
             }
         }
         if (!$bIsGroup) {
             // *** Shape ***
             if (isset($shpPrimaryOptions['pib'])) {
                 // isDrawing
                 $drawingPib = $shpPrimaryOptions['pib'];
                 if (isset($this->arrayPictures[$drawingPib - 1])) {
                     $gdImage = imagecreatefromstring($this->arrayPictures[$drawingPib - 1]);
                     $arrayReturn['shape'] = new MemoryDrawing();
                     $arrayReturn['shape']->setImageResource($gdImage);
                 }
             } elseif (isset($shpPrimaryOptions['line']) && $shpPrimaryOptions['line']) {
                 // isLine
                 $arrayReturn['shape'] = new Line(0, 0, 0, 0);
             } elseif ($clientTextbox['length'] > 0) {
                 $arrayReturn['shape'] = new RichText();
                 if (isset($clientTextbox['alignH'])) {
                     $arrayReturn['shape']->getActiveParagraph()->getAlignment()->setHorizontal($clientTextbox['alignH']);
                 }
                 $start = 0;
                 $lastLevel = -1;
                 $lastMarginLeft = 0;
                 for ($inc = 1; $inc <= $clientTextbox['numParts']; $inc++) {
                     if ($clientTextbox['numParts'] == $clientTextbox['numTexts'] && isset($clientTextbox['text' . $inc])) {
                         if (isset($clientTextbox['text' . $inc]['bulletChar'])) {
                             $arrayReturn['shape']->getActiveParagraph()->getBulletStyle()->setBulletType(Bullet::TYPE_BULLET);
                             $arrayReturn['shape']->getActiveParagraph()->getBulletStyle()->setBulletChar($clientTextbox['text' . $inc]['bulletChar']);
                         }
                         // Indent
                         $indent = 0;
                         if (isset($clientTextbox['text' . $inc]['indent'])) {
                             $indent = $clientTextbox['text' . $inc]['indent'];
                         }
                         if (isset($clientTextbox['text' . $inc]['leftMargin'])) {
                             if ($lastMarginLeft > $clientTextbox['text' . $inc]['leftMargin']) {
                                 $lastLevel--;
                             }
                             if ($lastMarginLeft < $clientTextbox['text' . $inc]['leftMargin']) {
                                 $lastLevel++;
                             }
                             $arrayReturn['shape']->getActiveParagraph()->getAlignment()->setLevel($lastLevel);
                             $lastMarginLeft = $clientTextbox['text' . $inc]['leftMargin'];
                             $arrayReturn['shape']->getActiveParagraph()->getAlignment()->setMarginLeft($clientTextbox['text' . $inc]['leftMargin']);
                             $arrayReturn['shape']->getActiveParagraph()->getAlignment()->setIndent($indent - $clientTextbox['text' . $inc]['leftMargin']);
                         }
                     }
                     // Texte
                     $sText = substr(isset($clientTextbox['text']) ? $clientTextbox['text'] : '', $start, $clientTextbox['part' . $inc]['partLength']);
                     $sHyperlinkURL = '';
                     if (empty($sText)) {
                         // Is there a hyperlink ?
                         if (isset($clientTextbox['hyperlink']) && is_array($clientTextbox['hyperlink']) && !empty($clientTextbox['hyperlink'])) {
                             foreach ($clientTextbox['hyperlink'] as $itmHyperlink) {
                                 if ($itmHyperlink['start'] == $start && $itmHyperlink['end'] - $itmHyperlink['start'] == $clientTextbox['part' . $inc]['partLength']) {
                                     $sText = $this->arrayHyperlinks[$itmHyperlink['id']]['text'];
                                     $sHyperlinkURL = $this->arrayHyperlinks[$itmHyperlink['id']]['url'];
                                     break;
                                 }
                             }
                         }
                     }
                     // New paragraph
                     $bCreateParagraph = false;
                     if (strpos($sText, "\r") !== false) {
                         $bCreateParagraph = true;
                         $sText = str_replace("\r", '', $sText);
                     }
                     // TextRun
                     $txtRun = $arrayReturn['shape']->createTextRun($sText);
                     if (isset($clientTextbox['part' . $inc]['bold'])) {
                         $txtRun->getFont()->setBold($clientTextbox['part' . $inc]['bold']);
                     }
                     if (isset($clientTextbox['part' . $inc]['italic'])) {
                         $txtRun->getFont()->setItalic($clientTextbox['part' . $inc]['italic']);
                     }
                     if (isset($clientTextbox['part' . $inc]['underline'])) {
                         $txtRun->getFont()->setUnderline($clientTextbox['part' . $inc]['underline']);
                     }
                     if (isset($clientTextbox['part' . $inc]['fontName'])) {
                         $txtRun->getFont()->setName($clientTextbox['part' . $inc]['fontName']);
                     }
                     if (isset($clientTextbox['part' . $inc]['fontSize'])) {
                         $txtRun->getFont()->setSize($clientTextbox['part' . $inc]['fontSize']);
                     }
                     if (isset($clientTextbox['part' . $inc]['color'])) {
                         $txtRun->getFont()->setColor($clientTextbox['part' . $inc]['color']);
                     }
                     // Hyperlink
                     if (!empty($sHyperlinkURL)) {
                         $txtRun->setHyperlink(new Hyperlink($sHyperlinkURL));
                     }
                     $start += $clientTextbox['part' . $inc]['partLength'];
                     if ($bCreateParagraph) {
                         $arrayReturn['shape']->createParagraph();
                     }
                 }
             }
             // *** Properties ***
             // Dimensions
             if ($arrayReturn['shape'] instanceof AbstractShape) {
                 if (!empty($arrayDimensions)) {
                     $arrayReturn['shape']->setOffsetX($arrayDimensions['left']);
                     $arrayReturn['shape']->setOffsetY($arrayDimensions['top']);
                     $arrayReturn['shape']->setHeight($arrayDimensions['height']);
                     $arrayReturn['shape']->setWidth($arrayDimensions['width']);
                 }
                 // Rotation
                 if (isset($shpPrimaryOptions['rotation'])) {
                     $rotation = $shpPrimaryOptions['rotation'];
                     $arrayReturn['shape']->setRotation($rotation);
                 }
                 // Shadow
                 if (isset($shpPrimaryOptions['shadowOffsetX']) && isset($shpPrimaryOptions['shadowOffsetY'])) {
                     $shadowOffsetX = $shpPrimaryOptions['shadowOffsetX'];
                     $shadowOffsetY = $shpPrimaryOptions['shadowOffsetY'];
                     if ($shadowOffsetX != 0 && $shadowOffsetX != 0) {
                         $arrayReturn['shape']->getShadow()->setVisible(true);
                         if ($shadowOffsetX > 0 && $shadowOffsetX == $shadowOffsetY) {
                             $arrayReturn['shape']->getShadow()->setDistance($shadowOffsetX)->setDirection(45);
                         }
                     }
                 }
                 // Specific Line
                 if ($arrayReturn['shape'] instanceof Line) {
                     if (isset($shpPrimaryOptions['lineColor'])) {
                         $arrayReturn['shape']->getBorder()->getColor()->setARGB('FF' . $shpPrimaryOptions['lineColor']);
                     }
                     if (isset($shpPrimaryOptions['lineWidth'])) {
                         $arrayReturn['shape']->setHeight($shpPrimaryOptions['lineWidth']);
                     }
                 }
                 // Specific RichText
                 if ($arrayReturn['shape'] instanceof RichText) {
                     if (isset($shpPrimaryOptions['insetBottom'])) {
                         $arrayReturn['shape']->setInsetBottom($shpPrimaryOptions['insetBottom']);
                     }
                     if (isset($shpPrimaryOptions['insetLeft'])) {
                         $arrayReturn['shape']->setInsetLeft($shpPrimaryOptions['insetLeft']);
                     }
                     if (isset($shpPrimaryOptions['insetRight'])) {
                         $arrayReturn['shape']->setInsetRight($shpPrimaryOptions['insetRight']);
                     }
                     if (isset($shpPrimaryOptions['insetTop'])) {
                         $arrayReturn['shape']->setInsetTop($shpPrimaryOptions['insetTop']);
                     }
                 }
             }
         } else {
             // Rotation
             if (isset($shpPrimaryOptions['rotation'])) {
                 $rotation = $shpPrimaryOptions['rotation'];
                 $this->oCurrentGroup->setRotation($rotation);
             }
         }
     }
     return $arrayReturn;
 }