/** * 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; }