From b527d066086c7ed72ff07fd8fdae704b4dfdd946 Mon Sep 17 00:00:00 2001 From: Progi1984 Date: Sat, 21 Jun 2014 09:18:57 +0200 Subject: [PATCH 1/6] #23 : Implement Word97 aka MsDoc Reader --- samples/Sample_11_ReadWord97.php | 19 + samples/resources/Sample_11_ReadWord97.doc | Bin 0 -> 49664 bytes src/PhpWord/IOFactory.php | 2 +- src/PhpWord/Reader/MsDoc.php | 1419 ++++++++++++++++++++ src/PhpWord/Shared/OLERead.php | 310 +++++ 5 files changed, 1749 insertions(+), 1 deletion(-) create mode 100644 samples/Sample_11_ReadWord97.php create mode 100644 samples/resources/Sample_11_ReadWord97.doc create mode 100644 src/PhpWord/Reader/MsDoc.php create mode 100644 src/PhpWord/Shared/OLERead.php diff --git a/samples/Sample_11_ReadWord97.php b/samples/Sample_11_ReadWord97.php new file mode 100644 index 00000000..f0df59bf --- /dev/null +++ b/samples/Sample_11_ReadWord97.php @@ -0,0 +1,19 @@ + 'docx', 'ODText' => 'odt', 'RTF' => 'rtf'); +foreach ($writers as $writer => $extension) { + echo date('H:i:s'), " Write to {$writer} format", EOL; + $xmlWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, $writer); + $xmlWriter->save("{$name}.{$extension}"); + rename("{$name}.{$extension}", "results/{$name}.{$extension}"); +}*/ + +include_once 'Sample_Footer.php'; diff --git a/samples/resources/Sample_11_ReadWord97.doc b/samples/resources/Sample_11_ReadWord97.doc new file mode 100644 index 0000000000000000000000000000000000000000..a5ce295d8aa8c35e681eb66e26857259659f5955 GIT binary patch literal 49664 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 P>HePb{}m?uU)KL$=${T1 literal 0 HcmV?d00001 diff --git a/src/PhpWord/IOFactory.php b/src/PhpWord/IOFactory.php index ade4398e..0a156aca 100644 --- a/src/PhpWord/IOFactory.php +++ b/src/PhpWord/IOFactory.php @@ -45,7 +45,7 @@ abstract class IOFactory */ public static function createReader($name = 'Word2007') { - if ($name !== 'ReaderInterface' && $name !== 'Word2007') { + if ($name !== 'ReaderInterface' && !in_array($name, array('Word2007', 'MsDoc'))) { throw new Exception("\"{$name}\" is not a valid reader."); } diff --git a/src/PhpWord/Reader/MsDoc.php b/src/PhpWord/Reader/MsDoc.php new file mode 100644 index 00000000..13fde479 --- /dev/null +++ b/src/PhpWord/Reader/MsDoc.php @@ -0,0 +1,1419 @@ +phpWord = new PhpWord(); + + $this->loadOLE($filename); + + $this->readFib($this->dataWorkDocument); + $this->readFibContent(); + /*$this->read1Table($this->data1Table); + $this->readData($this->dataData); + $this->readObjectPool($this->dataObjectPool);*/ + + return $this->phpWord; + } + + /** + * Load an OLE Document + * @param string $filename + */ + private function loadOLE($filename) + { + // OLE reader + $ole = new OLERead(); + $ole->read($filename); + + // Get WorkDocument stream + $this->dataWorkDocument = $ole->getStream($ole->wrkdocument); + // Get 1Table stream + $this->data1Table = $ole->getStream($ole->wrk1Table); + // Get Data stream + $this->dataData = $ole->getStream($ole->wrkData); + // Get Data stream + $this->dataObjectPool = $ole->getStream($ole->wrkObjectPool); + // Get Summary Information data + $this->_summaryInformation = $ole->getStream($ole->summaryInformation); + // Get Document Summary Information data + $this->_documentSummaryInformation = $ole->getStream($ole->documentSummaryInformation); + } + + /** + * + * @link http://msdn.microsoft.com/en-us/library/dd949344%28v=office.12%29.aspx + * @link https://igor.io/2012/09/24/binary-parsing.html + */ + private function readFib($data) + { + $length = 0; + print_r('============ readFib'.PHP_EOL); + print_r('============ length : '.strlen($data).PHP_EOL); + print_r('======================== FibBase'.PHP_EOL); + //----- FibBase + // wIdent + $wIdent = self::_GetInt2d($data, $length); + $length += 2; + print_r('$wIdent : '.$wIdent.'#'.dechex($wIdent).PHP_EOL); + // nFib + $nFib = self::_GetInt2d($data, $length); + print_r('$nFib : '.$nFib.'#'.dechex($nFib).PHP_EOL); + $length += 2; + // unused + $length += 2; + // lid : Language Identifier + $lid = self::_GetInt2d($data, $length); + $length += 2; + // pnNext + $pnNext = self::_GetInt2d($data, $length); + $length += 2; + + $mem = self::_GetInt2d($data, $length); + $fDot = ($mem >> 15) & 1; + $fGlsy = ($mem >> 14) & 1; + $fComplex = ($mem >> 13) & 1; + $fHasPic = ($mem >> 12) & 1; + $cQuickSaves = ($mem >> 8) & bindec('1111'); + $fEncrypted = ($mem >> 7) & 1; + $fWhichTblStm = ($mem >> 6) & 1; + print_r('$fWhichTblStm : '.$fWhichTblStm.'#'.dechex($fWhichTblStm).PHP_EOL); + $fReadOnlyRecommended = ($mem >> 5) & 1; + $fWriteReservation = ($mem >> 4) & 1; + $fExtChar = ($mem >> 3) & 1; + $fLoadOverride = ($mem >> 2) & 1; + $fFarEast = ($mem >> 1) & 1; + $fObfuscated = ($mem >> 0) & 1; + $length += 2; + // nFibBack + $nFibBack = self::_GetInt2d($data, $length); + $length += 2; + // lKey + $lKey = self::_GetInt4d($data, $length); + $length += 4; + // envr + $envr = self::_GetInt1d($data, $length); + $length += 1; + + $mem = self::_GetInt1d($data, $length); + $fMac = ($mem >> 7) & 1; + $fEmptySpecial = ($mem >> 6) & 1; + $fLoadOverridePage = ($mem >> 5) & 1; + $reserved1 = ($mem >> 4) & 1; + $reserved2 = ($mem >> 3) & 1; + $fSpare0 = ($mem >> 0) & bindec('111'); + $length += 1; + + $reserved3 = self::_GetInt2d($data, $length); + $length += 2; + $reserved4 = self::_GetInt2d($data, $length); + $length += 2; + $reserved5 = self::_GetInt4d($data, $length); + $length += 4; + $reserved6 = self::_GetInt4d($data, $length); + $length += 4; + + //----- csw + print_r('======================== csw'.PHP_EOL); + $csw = self::_GetInt2d($data, $length); + $length += 2; + print_r('$csw : '.$csw.'#'.dechex($csw).PHP_EOL); + + //----- fibRgW + print_r('======================== fibRgW'.PHP_EOL); + $fibRgW_reserved1 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_reserved2 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_reserved3 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_reserved4 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_reserved5 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_reserved6 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_reserved7 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_reserved8 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_reserved9 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_reserved10 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_reserved11 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_reserved12 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_reserved13 = self::_GetInt2d($data, $length); + $length += 2; + $fibRgW_lidFE = self::_GetInt2d($data, $length); + $length += 2; + + //----- cslw + print_r('======================== cslw'.PHP_EOL); + $cslw = self::_GetInt2d($data, $length); + $length += 2; + print_r('$cslw : '.$cslw.'#'.dechex($cslw).PHP_EOL); + + //----- fibRgLw + print_r('======================== fibRgLw'.PHP_EOL); + $fibRgLw_cbMac = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved1 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved2 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_ccpText = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_ccpFtn = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_ccpHdd = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved3 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_ccpAtn = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_ccpEdn = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_ccpTxbx = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_ccpHdrTxbx = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved4 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved5 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved6 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved7 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved8 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved9 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved10 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved11 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved12 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved13 = self::_GetInt4d($data, $length); + $length += 4; + $fibRgLw_reserved14 = self::_GetInt4d($data, $length); + $length += 4; + + //----- cbRgFcLcb + print_r('======================== cbRgFcLcb'.PHP_EOL); + $cbRgFcLcb = self::_GetInt2d($data, $length); + print_r('$cbRgFcLcb : '.$cbRgFcLcb.'#'.dechex($cbRgFcLcb).PHP_EOL); + $length += 2; + //----- fibRgFcLcbBlob + print_r('======================== fibRgFcLcbBlob'.PHP_EOL); + switch ($cbRgFcLcb) { + case 0x005D: + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_97); + break; + case 0x006C: + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_97); + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2000); + break; + case 0x0088: + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_97); + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2000); + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2002); + break; + case 0x00A4 : + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_97); + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2000); + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2002); + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2003); + break; + case 0x00B7: + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_97); + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2000); + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2002); + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2003); + $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2007); + break; + } + //print_r($this->arrayFib); + //----- cswNew + print_r('======================== cswNew'.PHP_EOL); + $cswNew = self::_GetInt2d($data, $length); + $length += 2; + print_r('$cswNew : '.$cswNew.'#'.dechex($cswNew).PHP_EOL); + + if($cswNew != 0){ + // fibRgCswNew + print_r('======================== fibRgCswNew'.PHP_EOL); + } + + print_r('======================== length : '.$length.'#'.dechex($length).PHP_EOL); + return $length; + } + + const VERSION_97 = '97'; + const VERSION_2000 = '2000'; + const VERSION_2002 = '2002'; + const VERSION_2003 = '2003'; + const VERSION_2007 = '2007'; + + /** + * @var array + */ + private $arrayFib = array(); + + private function readBlockFibRgFcLcb($data, $length, $version) + { + if($version == self::VERSION_97){ + $this->arrayFib['fcStshfOrig'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbStshfOrig'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcStshf'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbStshf'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcffndRef'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcffndRef'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcffndTxt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcffndTxt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfandRef'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfandRef'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfandTxt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfandTxt '] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfSed'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfSed'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcPad'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcPad'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfPhe'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfPhe'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfGlsy'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfGlsy'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfGlsy'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfGlsy'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfHdd'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfHdd'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBteChpx'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBteChpx'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBtePapx'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBtePapx'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfSea'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfSea'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfFfn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfFfn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfFldMom'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfFldMom'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfFldHdr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfFldHdr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfFldFtn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfFldFtn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfFldAtn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfFldAtn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfFldMcr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfFldMcr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfBkmk'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfBkmk'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBkf'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBkf'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBkl'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBkl'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcCmds'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbCmds'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUnused1'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused1'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfMcr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfMcr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPrDrvr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPrDrvr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPrEnvPort'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPrEnvPort'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPrEnvLand'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPrEnvLand'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcWss'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbWss'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcDop'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbDop'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfAssoc'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfAssoc'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcClx'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbClx'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfPgdFtn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfPgdFtn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcAutosaveSource'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbAutosaveSource'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcGrpXstAtnOwners'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbGrpXstAtnOwners'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfAtnBkmk'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfAtnBkmk'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUnused2'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused2'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUnused3'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused3'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcSpaMom'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcSpaMom'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcSpaHdr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcSpaHdr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfAtnBkf'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfAtnBkf'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfAtnBkl'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfAtnBkl'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPms'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPms'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcFormFldSttbs'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbFormFldSttbs'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfendRef'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfendRef'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfendTxt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfendTxt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfFldEdn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfFldEdn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUnused4'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused4'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcDggInfo'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbDggInfo'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfRMark'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfRMark'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfCaption'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfCaption'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfAutoCaption'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfAutoCaption'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfWkb'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfWkb'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfSpl'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfSpl'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcftxbxTxt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcftxbxTxt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfFldTxbx'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfFldTxbx'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfHdrtxbxTxt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfHdrtxbxTxt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcffldHdrTxbx'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcffldHdrTxbx'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcStwUser'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbStwUser'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbTtmbd'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbTtmbd'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcCookieData'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbCookieData'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPgdMotherOldOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPgdMotherOldOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcBkdMotherOldOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbBkdMotherOldOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPgdFtnOldOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPgdFtnOldOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcBkdFtnOldOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbBkdFtnOldOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPgdEdnOldOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPgdEdnOldOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcBkdEdnOldOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbBkdEdnOldOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfIntlFld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfIntlFld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcRouteSlip'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbRouteSlip'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbSavedBy'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbSavedBy'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbFnm'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbFnm'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlfLst'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlfLst'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlfLfo'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlfLfo'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfTxbxBkd'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfTxbxBkd'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfTxbxHdrBkd'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfTxbxHdrBkd'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcDocUndoWord9'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbDocUndoWord9'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcRgbUse'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbRgbUse'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUsp'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUsp'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUskf'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUskf'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcupcRgbUse'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcupcRgbUse'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcupcUsp'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcupcUsp'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbGlsyStyle'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbGlsyStyle'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlgosl'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlgosl'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcocx'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcocx'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBteLvc'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBteLvc'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['dwLowDateTime'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['dwHighDateTime'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfLvcPre10'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfLvcPre10'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfAsumy'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfAsumy'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfGram'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfGram'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbListNames'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbListNames'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfUssr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfUssr'] = self::_GetInt4d($data, $length); + $length += 4; + } + if($version == self::VERSION_2000){ + $this->arrayFib['fcPlcfTch'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfTch'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcRmdThreading'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbRmdThreading'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcMid'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbMid'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbRgtplc'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbRgtplc'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcMsoEnvelope'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbMsoEnvelope'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfLad'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfLad'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcRgDofr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbRgDofr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcosl'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcosl'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfCookieOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfCookieOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPgdMotherOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPgdMotherOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcBkdMotherOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbBkdMotherOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPgdFtnOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPgdFtnOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcBkdFtnOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbBkdFtnOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPgdEdnOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPgdEdnOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcBkdEdnOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbBkdEdnOld'] = self::_GetInt4d($data, $length); + $length += 4; + } + if($version == self::VERSION_2002){ + $this->arrayFib['fcUnused1'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused1'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfPgp'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfPgp'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfuim'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfuim'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlfguidUim'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlfguidUim'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcAtrdExtra'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbAtrdExtra'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlrsid'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlrsid'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfBkmkFactoid'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfBkmkFactoid'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBkfFactoid'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBkfFactoid'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfcookie'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfcookie'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBklFactoid'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBklFactoid'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcFactoidData'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbFactoidData'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcDocUndo'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbDocUndo'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfBkmkFcc'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfBkmkFcc'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBkfFcc'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBkfFcc'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBklFcc'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBklFcc'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfbkmkBPRepairs'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfbkmkBPRepairs'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfbkfBPRepairs'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfbkfBPRepairs'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfbklBPRepairs'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfbklBPRepairs'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPmsNew'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPmsNew'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcODSO'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbODSO'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfpmiOldXP'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfpmiOldXP'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfpmiNewXP'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfpmiNewXP'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfpmiMixedXP'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfpmiMixedXP'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUnused2'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused2'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcffactoid'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcffactoid'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcflvcOldXP'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcflvcOldXP'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcflvcNewXP'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcflvcNewXP'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcflvcMixedXP'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcflvcMixedXP'] = self::_GetInt4d($data, $length); + $length += 4; + } + if($version == self::VERSION_2003){ + $this->arrayFib['fcHplxsdr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbHplxsdr'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfBkmkSdt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfBkmkSdt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBkfSdt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBkfSdt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBklSdt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBklSdt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcCustomXForm'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbCustomXForm'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfBkmkProt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfBkmkProt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBkfProt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBkfProt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBklProt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBklProt'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbProtUser'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbProtUser'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUnused'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfpmiOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfpmiOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfpmiOldInline'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfpmiOldInline'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfpmiNew'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfpmiNew'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfpmiNewInline'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfpmiNewInline'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcflvcOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcflvcOld'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcflvcOldInline'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcflvcOldInline'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcflvcNew'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcflvcNew'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcflvcNewInline'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcflvcNewInline'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPgdMother'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPgdMother'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcBkdMother'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbBkdMother'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcAfdMother'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbAfdMother'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPgdFtn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPgdFtn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcBkdFtn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbBkdFtn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcAfdFtn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbAfdFtn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPgdEdn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPgdEdn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcBkdEdn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbBkdEdn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcAfdEdn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbAfdEdn'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcAfd'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbAfd'] = self::_GetInt4d($data, $length); + $length += 4; + } + if($version == self::VERSION_2007){ + $this->arrayFib['fcPlcfmthd'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfmthd'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfBkmkMoveFrom'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfBkmkMoveFrom'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBkfMoveFrom'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBkfMoveFrom'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBklMoveFrom'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBklMoveFrom'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfBkmkMoveTo'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfBkmkMoveTo'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBkfMoveTo'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBkfMoveTo'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBklMoveTo'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBklMoveTo'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUnused1'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused1'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUnused2'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused2'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUnused3'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused3'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcSttbfBkmkArto'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbSttbfBkmkArto'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBkfArto'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBkfArto'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcPlcfBklArto'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbPlcfBklArto'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcArtoData'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbArtoData'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUnused4'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused4'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUnused5'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused5'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcUnused6'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbUnused6'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcOssTheme'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbOssTheme'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['fcColorSchemeMapping'] = self::_GetInt4d($data, $length); + $length += 4; + $this->arrayFib['lcbColorSchemeMapping'] = self::_GetInt4d($data, $length); + $length += 4; + } + return $length; + } + + private function readFibContent() + { + #$this->readRecordSTSH(); + $this->readRecordPlcfSed(); + } + private function readRecordSTSH() + { + print_r('============ readRecordSTSH'.PHP_EOL); + // Table Stream + // fcStshf (4 bytes): An unsigned integer that specifies an offset in the Table Stream. An STSH that specifies the style sheet for this document begins at this offset. + // lcbStshf (4 bytes): An unsigned integer that specifies the size, in bytes, of the STSH that begins at offset fcStshf in the Table Stream. This MUST be a nonzero value. + /*[fcStshf] => 0 + [lcbStshf] => 1060*/ + + $posMem = $this->arrayFib['fcStshf']; + + // RECORD "STSH" + + // lpstshi (variable): An LPStshi that specifies information about the stylesheet. + // - LPStshi + // - LPStshi : cbStshi + $cbStshi = self::_GetInt2d($this->data1Table, $posMem); + $posMem += 2; + print_r('$cbStshi :'.$cbStshi.PHP_EOL); + + // - LPStshi : stshi + // - LPStshi : stshi : stshif (18o) + // - LPStshi : stshi : stshif : cstd + $cstd = self::_GetInt2d($this->data1Table, $posMem); + $posMem += 2; + // - LPStshi : stshi : stshif : cbSTDBaseInFile + $cbSTDBaseInFile = self::_GetInt2d($this->data1Table, $posMem); + $posMem += 2; + // - LPStshi : stshi : stshif : fStdStylenamesWritten (1 bit) + // - LPStshi : stshi : stshif : fReserved (15 bits) + $fStdStylenamesWritten = self::_GetInt1d($this->data1Table, $posMem); + $posMem += 2; + // - LPStshi : stshi : stshif : stiMaxWhenSaved + $stiMaxWhenSaved = self::_GetInt2d($this->data1Table, $posMem); + $posMem += 2; + print_r('$stiMaxWhenSaved :'.$stiMaxWhenSaved.PHP_EOL); + // - LPStshi : stshi : stshif : istdMaxFixedWhenSaved + $istdMaxFixedWhenSaved = self::_GetInt2d($this->data1Table, $posMem); + $posMem += 2; + // - LPStshi : stshi : stshif : nVerBuiltInNamesWhenSaved + $nVerBuiltInNamesWhenSaved = self::_GetInt2d($this->data1Table, $posMem); + $posMem += 2; + // - LPStshi : stshi : stshif : ftcAsci + $ftcAsci = self::_GetInt2d($this->data1Table, $posMem); + $posMem += 2; + // - LPStshi : stshi : stshif : ftcFE + $ftcFE = self::_GetInt2d($this->data1Table, $posMem); + $posMem += 2; + // - LPStshi : stshi : stshif : ftcOther + $ftcOther = self::_GetInt2d($this->data1Table, $posMem); + $posMem += 2; + + // - LPStshi : stshi : ftcBi (2o) + $ftcBi = self::_GetInt2d($this->data1Table, $posMem); + $posMem += 2; + // - LPStshi : stshi : StshiLsd + // - LPStshi : stshi : StshiLsd : cbLSD + $cbLSD = self::_GetInt2d($this->data1Table, $posMem); + $posMem += 2; + print_r('$cbLSD :'.$cbLSD.PHP_EOL); + + + // - LPStshi : stshi : StshiLsd : mpstiilsd + // - LPStshi : stshi : StshiB + + // rglpstd (variable): An array of LPStd that specifies the style definitions. + } + private function readRecordPlcfSed(){ + // fcPlcfSed (4 bytes): An unsigned integer that specifies an offset in the Table Stream. A PlcfSed begins at this offset and specifies the locations of property lists for each section in the Main Document. If lcbPlcfSed is zero, fcPlcfSed is undefined and MUST be ignored. + // lcbPlcfSed (4 bytes): An unsigned integer that specifies the size, in bytes, of the PlcfSed that begins at offset fcPlcfSed in the Table Stream. + print_r('============ readRecordPlcfSed'.PHP_EOL); + + $posMem = $this->arrayFib['fcPlcfSed']; + // PlcfSed + // PlcfSed : aCP + $aCP = array(); + $aCP[0] = self::_GetInt4d($this->data1Table, $posMem); + $posMem += 4; + $aCP[1] = self::_GetInt4d($this->data1Table, $posMem); + $posMem += 4; + + print_r('$aCP :'.PHP_EOL); + print_r($aCP); + + // PlcfSed : aSed + $numSed = ($this->arrayFib['lcbPlcfSed'] - 4) / 12; + + $aSed = array(); + for($iInc = 1 ; $iInc < $numSed ; ++$iInc){ + // ignored + $posMem += 2; + // A signed integer value that specifies the position in the WordDocument Stream at which a Sepx structure is located. + $aSed[$iInc] = self::_GetInt4d($this->data1Table, $posMem); + $posMem += 4; + // ignored + $posMem += 2; + // ignored + $posMem += 4; + } + + // page 541 pour la lecture des informations sur la section + } + + + private function read1Table($data) + { + /* + offset[0] = offsetClx + 1; + int lcb = stream.getInteger(offset); + + int countPcd = (lcb - 4)/12; + int countCp = (lcb - countPcd*8)/4; + int offsetPlcpcd = offsetClx + 5; + + for(int i=0;i> 30; + start = (start << 2) >> 2; + + offset[0] = offsetPlcpcd + i*4; + int cpPre = stream.getInteger(offset); + int cpNext = stream.getInteger(offset); + int length = cpNext - cpPre -1; + if(fc == 0) + { + length *= 2; + } + else + { + start = start/2; + } + + start += 512; + bytesToString(ogiBytes, content, start, length, fc); + + System.out.println(start +", "+ length); + }*/ + + print_r('============ read1Table'.PHP_EOL); + $clxPosition = $this->arrayFib['fcClx']; + + $text = self::_GetInt1d($data, $clxPosition); + print_r('$text : '.$text.PHP_EOL); + $lcb_piece_table = self::_GetInt4d($data, $clxPosition + 1); + $piece_table = $clxPosition + 5; + $piece_count = ($lcb_piece_table - 4) / 12; + print_r('$piece_count : '.$piece_count.PHP_EOL); + + + $countCp = ($lcb_piece_table - $piece_count*8)/4; + print_r('$countCp : '.$countCp.PHP_EOL); + for($i=0 ; $i < $piece_count ; $i++) { + + $piece_start = self::_GetInt4d($data, $piece_table + ($i * 4)); + $piece_end = self::_GetInt4d($data, $piece_table + (($i + 1) * 4)); + $piece_descriptor = $piece_table + (($piece_count + 1) * 4) + ($i * 8); + $fc = self::_GetInt4d ($data, $piece_descriptor + 2); + $is_ansi = ($fc & 0x40000000) == 0x40000000; + if (!$is_ansi) { + $fc = ($fc & 0xBFFFFFFF); + } else { + $fc = ($fc & 0xBFFFFFFF) >> 1; + } + $piece_size = $piece_end - $piece_start; + print_r('$piece_size : '.$piece_size.PHP_EOL); + if (!$is_ansi) { + $piece_size *= 2; + } + print_r('$piece_size : '.$piece_size.PHP_EOL); + if ($piece_size >= 1) { + $fc+=512; + print_r(chr(self::_GetInt2d($data, $fc + 2))); + print_r(chr(self::_GetInt2d($data, $fc + 4))); + print_r(chr(self::_GetInt2d($data, $fc + 6))); + print_r(chr(self::_GetInt2d($data, $fc + 8))); + print_r(chr(self::_GetInt2d($data, $fc + 10))); + print_r(chr(self::_GetInt2d($data, $fc + 12))); + print_r(chr(self::_GetInt2d($data, $fc + 14))); + print_r(chr(self::_GetInt2d($data, $fc + 16))); + print_r(chr(self::_GetInt2d($data, $fc + 18))); + print_r(chr(self::_GetInt2d($data, $fc + 20))); + print_r(chr(self::_GetInt2d($data, $fc + 22))); + print_r(chr(self::_GetInt2d($data, $fc + 24))); + print_r(chr(self::_GetInt2d($data, $fc + 26))); + print_r(chr(self::_GetInt2d($data, $fc + 28))); + print_r(chr(self::_GetInt2d($data, $fc + 30))); + print_r(chr(self::_GetInt2d($data, $fc + 32))); + print_r(chr(self::_GetInt2d($data, $fc + 34))); + print_r(chr(self::_GetInt2d($data, $fc + 36))); + print_r(chr(self::_GetInt2d($data, $fc + 38))); + print_r(PHP_EOL); + } + + $offsetPcd = $piece_table + $countCp*4 + $i*8; + + $start = self::_GetInt4d($data, $offsetPcd+2); + print_r('$start : '.$start.PHP_EOL); + $fc = $start >> 30; + $start = ($start << 2) >> 2; + print_r('$fc : '.$fc.PHP_EOL); + print_r('$start : '.$start.PHP_EOL); + + $offset = $piece_table + $i*4; + print_r('$offset : '.$offset.PHP_EOL); + $cpPre = self::_GetInt4d($data, $offset); + print_r('$cpPre : '.$cpPre.PHP_EOL); + $cpNext = self::_GetInt4d($data, $offset + 4); + print_r('$cpNext : '.$cpNext.PHP_EOL); + $length = $cpNext - $cpPre -1; + if($fc == 0) { + $length *= 2; + } else { + $start = $start/2; + } + + $start += 512; + print_r($start); + print_r(PHP_EOL); + print_r($length); + print_r(PHP_EOL); + print_r(self::_GetInt2d($data, $start + 2)); + print_r(PHP_EOL); + print_r(chr(self::_GetInt2d($data, $start + 2))); + print_r(PHP_EOL); + print_r(chr(self::_GetInt2d($data, $start + 4))); + print_r(chr(self::_GetInt2d($data, $start + 6))); + print_r(chr(self::_GetInt2d($data, $start + 8))); + print_r(chr(self::_GetInt2d($data, $start + 10))); + print_r(chr(self::_GetInt2d($data, $start + 12))); + print_r(chr(self::_GetInt2d($data, $start + 14))); + print_r(chr(self::_GetInt2d($data, $start + 16))); + print_r(chr(self::_GetInt2d($data, $start + 18))); + print_r(chr(self::_GetInt2d($data, $start + 20))); + print_r(chr(self::_GetInt2d($data, $start + 22))); + print_r(chr(self::_GetInt2d($data, $start + 24))); + print_r(chr(self::_GetInt2d($data, $start + 26))); + print_r(chr(self::_GetInt2d($data, $start + 28))); + print_r(chr(self::_GetInt2d($data, $start + 30))); + print_r(chr(self::_GetInt2d($data, $start + 32))); + print_r(chr(self::_GetInt2d($data, $start + 34))); + print_r(chr(self::_GetInt2d($data, $start + 36))); + print_r(chr(self::_GetInt2d($data, $start + 38))); + } +/* + + $start = self::_GetInt4d($data, 1850); + print_r('$start : '.$start.PHP_EOL); + $end = self::_GetInt4d($data, 1854); + print_r('$end : '.$end.PHP_EOL);*/ + + print_r(PHP_EOL); + print_r(PHP_EOL); + print_r(PHP_EOL); + //print_r($data); + print_r(PHP_EOL); + //print_r(dechex($data)); + print_r(PHP_EOL); + } + + private function readData($data) + { + print_r('============ readData'.PHP_EOL); + $text = self::_GetInt1d($data, 0); + print_r(dechex($text)); + + print_r(PHP_EOL); + print_r(PHP_EOL); + print_r(PHP_EOL); + //print_r($data); + print_r(PHP_EOL); + //print_r(dechex($data)); + print_r(PHP_EOL); + } + + private function readObjectPool($data) + { + print_r('============ readObjectPool'.PHP_EOL); + + print_r(PHP_EOL); + print_r(PHP_EOL); + print_r(PHP_EOL); + //print_r($data); + print_r(PHP_EOL); + //print_r(dechex($data)); + print_r(PHP_EOL); + } + + /** + * Read 8-bit unsigned integer + * + * @param string $data + * @param int $pos + * @return int + */ + public static function _GetInt1d($data, $pos) + { + return ord($data[$pos]); + } + + /** + * Read 16-bit unsigned integer + * + * @param string $data + * @param int $pos + * @return int + */ + public static function _GetInt2d($data, $pos) + { + return ord($data[$pos]) | (ord($data[$pos+1]) << 8); + } + + /** + * Read 32-bit signed integer + * + * @param string $data + * @param int $pos + * @return int + */ + public static function _GetInt4d($data, $pos) + { + // FIX: represent numbers correctly on 64-bit system + // http://sourceforge.net/tracker/index.php?func=detail&aid=1487372&group_id=99160&atid=623334 + // Hacked by Andreas Rehm 2006 to ensure correct result of the <<24 block on 32 and 64bit systems + $_or_24 = ord($data[$pos + 3]); + if ($_or_24 >= 128) { + // negative number + $_ord_24 = -abs((256 - $_or_24) << 24); + } else { + $_ord_24 = ($_or_24 & 127) << 24; + } + return ord($data[$pos]) | (ord($data[$pos+1]) << 8) | (ord($data[$pos+2]) << 16) | $_ord_24; + } +} diff --git a/src/PhpWord/Shared/OLERead.php b/src/PhpWord/Shared/OLERead.php new file mode 100644 index 00000000..5235d37e --- /dev/null +++ b/src/PhpWord/Shared/OLERead.php @@ -0,0 +1,310 @@ +data = file_get_contents($sFileName, FALSE, NULL, 0, 8); + + // Check OLE identifier + if ($this->data != self::IDENTIFIER_OLE) { + throw new Exception('The filename ' . $sFileName . ' is not recognised as an OLE file'); + } + + // Get the file data + $this->data = file_get_contents($sFileName); + + // Total number of sectors used for the SAT + $this->numBigBlockDepotBlocks = self::_GetInt4d($this->data, self::NUM_BIG_BLOCK_DEPOT_BLOCKS_POS); + + // SecID of the first sector of the directory stream + $this->rootStartBlock = self::_GetInt4d($this->data, self::ROOT_START_BLOCK_POS); + + // SecID of the first sector of the SSAT (or -2 if not extant) + $this->sbdStartBlock = self::_GetInt4d($this->data, self::SMALL_BLOCK_DEPOT_BLOCK_POS); + + // SecID of the first sector of the MSAT (or -2 if no additional sectors are used) + $this->extensionBlock = self::_GetInt4d($this->data, self::EXTENSION_BLOCK_POS); + + // Total number of sectors used by MSAT + $this->numExtensionBlocks = self::_GetInt4d($this->data, self::NUM_EXTENSION_BLOCK_POS); + + $bigBlockDepotBlocks = array(); + $pos = self::BIG_BLOCK_DEPOT_BLOCKS_POS; + + $bbdBlocks = $this->numBigBlockDepotBlocks; + + if ($this->numExtensionBlocks != 0) { + $bbdBlocks = (self::BIG_BLOCK_SIZE - self::BIG_BLOCK_DEPOT_BLOCKS_POS)/4; + } + + for ($i = 0; $i < $bbdBlocks; ++$i) { + $bigBlockDepotBlocks[$i] = self::_GetInt4d($this->data, $pos); + $pos += 4; + } + + for ($j = 0; $j < $this->numExtensionBlocks; ++$j) { + $pos = ($this->extensionBlock + 1) * self::BIG_BLOCK_SIZE; + $blocksToRead = min($this->numBigBlockDepotBlocks - $bbdBlocks, self::BIG_BLOCK_SIZE / 4 - 1); + + for ($i = $bbdBlocks; $i < $bbdBlocks + $blocksToRead; ++$i) { + $bigBlockDepotBlocks[$i] = self::_GetInt4d($this->data, $pos); + $pos += 4; + } + + $bbdBlocks += $blocksToRead; + if ($bbdBlocks < $this->numBigBlockDepotBlocks) { + $this->extensionBlock = self::_GetInt4d($this->data, $pos); + } + } + + $pos = 0; + $this->bigBlockChain = ''; + $bbs = self::BIG_BLOCK_SIZE / 4; + for ($i = 0; $i < $this->numBigBlockDepotBlocks; ++$i) { + $pos = ($bigBlockDepotBlocks[$i] + 1) * self::BIG_BLOCK_SIZE; + + $this->bigBlockChain .= substr($this->data, $pos, 4*$bbs); + $pos += 4*$bbs; + } + + $pos = 0; + $sbdBlock = $this->sbdStartBlock; + $this->smallBlockChain = ''; + while ($sbdBlock != -2) { + $pos = ($sbdBlock + 1) * self::BIG_BLOCK_SIZE; + + $this->smallBlockChain .= substr($this->data, $pos, 4*$bbs); + $pos += 4*$bbs; + + $sbdBlock = self::_GetInt4d($this->bigBlockChain, $sbdBlock*4); + } + + // read the directory stream + $block = $this->rootStartBlock; + $this->entry = $this->_readData($block); + + $this->_readPropertySets(); + } + + /** + * Extract binary stream data + * + * @return string + */ + public function getStream($stream) + { + if ($stream === NULL) { + return null; + } + + $streamData = ''; + + if ($this->props[$stream]['size'] < self::SMALL_BLOCK_THRESHOLD) { + $rootdata = $this->_readData($this->props[$this->rootentry]['startBlock']); + + $block = $this->props[$stream]['startBlock']; + + while ($block != -2) { + $pos = $block * self::SMALL_BLOCK_SIZE; + $streamData .= substr($rootdata, $pos, self::SMALL_BLOCK_SIZE); + + $block = self::_GetInt4d($this->smallBlockChain, $block*4); + } + + return $streamData; + } else { + $numBlocks = $this->props[$stream]['size'] / self::BIG_BLOCK_SIZE; + if ($this->props[$stream]['size'] % self::BIG_BLOCK_SIZE != 0) { + ++$numBlocks; + } + + if ($numBlocks == 0) return ''; + + $block = $this->props[$stream]['startBlock']; + + while ($block != -2) { + $pos = ($block + 1) * self::BIG_BLOCK_SIZE; + $streamData .= substr($this->data, $pos, self::BIG_BLOCK_SIZE); + $block = self::_GetInt4d($this->bigBlockChain, $block*4); + } + + return $streamData; + } + } + + /** + * Read a standard stream (by joining sectors using information from SAT) + * + * @param int $bl Sector ID where the stream starts + * @return string Data for standard stream + */ + private function _readData($bl) + { + $block = $bl; + $data = ''; + + while ($block != -2) { + $pos = ($block + 1) * self::BIG_BLOCK_SIZE; + $data .= substr($this->data, $pos, self::BIG_BLOCK_SIZE); + $block = self::_GetInt4d($this->bigBlockChain, $block*4); + } + return $data; + } + + /** + * Read entries in the directory stream. + */ + private function _readPropertySets() { + $offset = 0; + + // loop through entires, each entry is 128 bytes + $entryLen = strlen($this->entry); + while ($offset < $entryLen) { + // entry data (128 bytes) + $d = substr($this->entry, $offset, self::PROPERTY_STORAGE_BLOCK_SIZE); + + // size in bytes of name + $nameSize = ord($d[self::SIZE_OF_NAME_POS]) | (ord($d[self::SIZE_OF_NAME_POS+1]) << 8); + + // type of entry + $type = ord($d[self::TYPE_POS]); + + // sectorID of first sector or short sector, if this entry refers to a stream (the case with workbook) + // sectorID of first sector of the short-stream container stream, if this entry is root entry + $startBlock = self::_GetInt4d($d, self::START_BLOCK_POS); + + $size = self::_GetInt4d($d, self::SIZE_POS); + + $name = str_replace("\x00", "", substr($d,0,$nameSize)); + + + $this->props[] = array ( + 'name' => $name, + 'type' => $type, + 'startBlock' => $startBlock, + 'size' => $size); + + // tmp helper to simplify checks + $upName = strtoupper($name); + + // Workbook directory entry (BIFF5 uses Book, BIFF8 uses Workbook) + // print_r($upName.PHP_EOL); + if (($upName === 'WORDDOCUMENT')) { + $this->wrkdocument = count($this->props) - 1; + } elseif (($upName === '1TABLE')) { + $this->wrk1Table = count($this->props) - 1; + } elseif (($upName === 'DATA')) { + $this->wrkData = count($this->props) - 1; + } elseif (($upName === 'OBJECTPOOL')) { + $this->wrkObjectPoolelseif = count($this->props) - 1; + } elseif ( $upName === 'ROOT ENTRY' || $upName === 'R') { + $this->rootentry = count($this->props) - 1; + } + + // Summary information + if ($name == chr(5) . 'SummaryInformation') { + $this->summaryInformation = count($this->props) - 1; + } + + // Additional Document Summary information + if ($name == chr(5) . 'DocumentSummaryInformation') { + $this->documentSummaryInformation = count($this->props) - 1; + } + + $offset += self::PROPERTY_STORAGE_BLOCK_SIZE; + } + + } + + /** + * Read 4 bytes of data at specified position + * + * @param string $data + * @param int $pos + * @return int + */ + private static function _GetInt4d($data, $pos) + { + // FIX: represent numbers correctly on 64-bit system + // http://sourceforge.net/tracker/index.php?func=detail&aid=1487372&group_id=99160&atid=623334 + // Hacked by Andreas Rehm 2006 to ensure correct result of the <<24 block on 32 and 64bit systems + $_or_24 = ord($data[$pos + 3]); + if ($_or_24 >= 128) { + // negative number + $_ord_24 = -abs((256 - $_or_24) << 24); + } else { + $_ord_24 = ($_or_24 & 127) << 24; + } + return ord($data[$pos]) | (ord($data[$pos + 1]) << 8) | (ord($data[$pos + 2]) << 16) | $_ord_24; + } + +} From df8de962a9a48b6e66cb44e6aa539098c37a7c5f Mon Sep 17 00:00:00 2001 From: Progi1984 Date: Sat, 21 Jun 2014 09:21:30 +0200 Subject: [PATCH 2/6] #23 : Implement Word97 aka MsDoc Reader --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 2ea4fd9d..9fbc69f9 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,8 @@ composer.lock composer.phar vendor /report +/samples/resources +/samples/results /.settings /.buildpath /.project \ No newline at end of file From ca69de396200461c7a5fe7bec38fff72cdac96bd Mon Sep 17 00:00:00 2001 From: Progi1984 Date: Fri, 15 Aug 2014 19:26:23 +0200 Subject: [PATCH 3/6] #23 : Implement Word97 aka MsDoc Reader --- samples/Sample_11_ReadWord97.php | 6 +- samples/Sample_Header.php | 3 + src/PhpWord/Reader/MsDoc.php | 3289 +++++++++++++++++++----------- src/PhpWord/Shared/Drawing.php | 70 + src/PhpWord/Style/Font.php | 1 - 5 files changed, 2179 insertions(+), 1190 deletions(-) diff --git a/samples/Sample_11_ReadWord97.php b/samples/Sample_11_ReadWord97.php index f0df59bf..68a30d36 100644 --- a/samples/Sample_11_ReadWord97.php +++ b/samples/Sample_11_ReadWord97.php @@ -5,15 +5,15 @@ include_once 'Sample_Header.php'; $name = basename(__FILE__, '.php'); $source = "resources/{$name}.doc"; echo date('H:i:s'), " Reading contents from `{$source}`", EOL; -$phpWord = \PhpOffice\PhpWord\IOFactory::load($source, 'Word97'); +$phpWord = \PhpOffice\PhpWord\IOFactory::load($source, 'MsDoc'); // (Re)write contents -/*$writers = array('Word2007' => 'docx', 'ODText' => 'odt', 'RTF' => 'rtf'); +$writers = array('Word2007' => 'docx', 'ODText' => 'odt', 'RTF' => 'rtf'); foreach ($writers as $writer => $extension) { echo date('H:i:s'), " Write to {$writer} format", EOL; $xmlWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, $writer); $xmlWriter->save("{$name}.{$extension}"); rename("{$name}.{$extension}", "results/{$name}.{$extension}"); -}*/ +} include_once 'Sample_Footer.php'; diff --git a/samples/Sample_Header.php b/samples/Sample_Header.php index c6431c03..a7721559 100644 --- a/samples/Sample_Header.php +++ b/samples/Sample_Header.php @@ -1,4 +1,7 @@ readFib($this->dataWorkDocument); $this->readFibContent(); - /*$this->read1Table($this->data1Table); - $this->readData($this->dataData); - $this->readObjectPool($this->dataObjectPool);*/ return $this->phpWord; } @@ -99,9 +139,22 @@ class MsDoc extends AbstractReader implements ReaderInterface // Get Data stream $this->dataObjectPool = $ole->getStream($ole->wrkObjectPool); // Get Summary Information data - $this->_summaryInformation = $ole->getStream($ole->summaryInformation); + $this->_SummaryInformation = $ole->getStream($ole->summaryInformation); // Get Document Summary Information data - $this->_documentSummaryInformation = $ole->getStream($ole->documentSummaryInformation); + $this->_DocumentSummaryInformation = $ole->getStream($ole->documentSummaryInformation); + } + + private function getNumInLcb($lcb, $iSize){ + return ($lcb - 4) / (4 + $iSize); + } + + private function getArrayCP($data, $posMem, $iNum){ + $arrayCP = array(); + for($inc = 0 ; $inc < $iNum ; $inc++){ + $arrayCP[$inc] = self::getInt4d($data, $posMem); + $posMem += 4; + } + return $arrayCP; } /** @@ -111,1264 +164,2116 @@ class MsDoc extends AbstractReader implements ReaderInterface */ private function readFib($data) { - $length = 0; - print_r('============ readFib'.PHP_EOL); - print_r('============ length : '.strlen($data).PHP_EOL); - print_r('======================== FibBase'.PHP_EOL); + $pos = 0; //----- FibBase // wIdent - $wIdent = self::_GetInt2d($data, $length); - $length += 2; - print_r('$wIdent : '.$wIdent.'#'.dechex($wIdent).PHP_EOL); + $pos += 2; // nFib - $nFib = self::_GetInt2d($data, $length); - print_r('$nFib : '.$nFib.'#'.dechex($nFib).PHP_EOL); - $length += 2; + $pos += 2; // unused - $length += 2; + $pos += 2; // lid : Language Identifier - $lid = self::_GetInt2d($data, $length); - $length += 2; + $pos += 2; // pnNext - $pnNext = self::_GetInt2d($data, $length); - $length += 2; + $pos += 2; - $mem = self::_GetInt2d($data, $length); - $fDot = ($mem >> 15) & 1; - $fGlsy = ($mem >> 14) & 1; - $fComplex = ($mem >> 13) & 1; - $fHasPic = ($mem >> 12) & 1; - $cQuickSaves = ($mem >> 8) & bindec('1111'); - $fEncrypted = ($mem >> 7) & 1; - $fWhichTblStm = ($mem >> 6) & 1; - print_r('$fWhichTblStm : '.$fWhichTblStm.'#'.dechex($fWhichTblStm).PHP_EOL); - $fReadOnlyRecommended = ($mem >> 5) & 1; - $fWriteReservation = ($mem >> 4) & 1; - $fExtChar = ($mem >> 3) & 1; - $fLoadOverride = ($mem >> 2) & 1; - $fFarEast = ($mem >> 1) & 1; - $fObfuscated = ($mem >> 0) & 1; - $length += 2; + // $mem = self::getInt2d($data, $pos); + // $fDot = ($mem >> 15) & 1; + // $fGlsy = ($mem >> 14) & 1; + // $fComplex = ($mem >> 13) & 1; + // $fHasPic = ($mem >> 12) & 1; + // $cQuickSaves = ($mem >> 8) & bindec('1111'); + // $fEncrypted = ($mem >> 7) & 1; + // $fWhichTblStm = ($mem >> 6) & 1; + // $fReadOnlyRecommended = ($mem >> 5) & 1; + // $fWriteReservation = ($mem >> 4) & 1; + // $fExtChar = ($mem >> 3) & 1; + // $fLoadOverride = ($mem >> 2) & 1; + // $fFarEast = ($mem >> 1) & 1; + // $fObfuscated = ($mem >> 0) & 1; + $pos += 2; // nFibBack - $nFibBack = self::_GetInt2d($data, $length); - $length += 2; + $pos += 2; // lKey - $lKey = self::_GetInt4d($data, $length); - $length += 4; + $pos += 4; // envr - $envr = self::_GetInt1d($data, $length); - $length += 1; + $pos += 1; - $mem = self::_GetInt1d($data, $length); - $fMac = ($mem >> 7) & 1; - $fEmptySpecial = ($mem >> 6) & 1; - $fLoadOverridePage = ($mem >> 5) & 1; - $reserved1 = ($mem >> 4) & 1; - $reserved2 = ($mem >> 3) & 1; - $fSpare0 = ($mem >> 0) & bindec('111'); - $length += 1; + // $mem = self::getInt1d($data, $pos); + // $fMac = ($mem >> 7) & 1; + // $fEmptySpecial = ($mem >> 6) & 1; + // $fLoadOverridePage = ($mem >> 5) & 1; + // $reserved1 = ($mem >> 4) & 1; + // $reserved2 = ($mem >> 3) & 1; + // $fSpare0 = ($mem >> 0) & bindec('111'); + $pos += 1; - $reserved3 = self::_GetInt2d($data, $length); - $length += 2; - $reserved4 = self::_GetInt2d($data, $length); - $length += 2; - $reserved5 = self::_GetInt4d($data, $length); - $length += 4; - $reserved6 = self::_GetInt4d($data, $length); - $length += 4; + // reserved3 + $pos += 2; + // reserved4 + $pos += 2; + // reserved5 + $pos += 4; + // reserved6 + $pos += 4; //----- csw - print_r('======================== csw'.PHP_EOL); - $csw = self::_GetInt2d($data, $length); - $length += 2; - print_r('$csw : '.$csw.'#'.dechex($csw).PHP_EOL); + $pos += 2; //----- fibRgW - print_r('======================== fibRgW'.PHP_EOL); - $fibRgW_reserved1 = self::_GetInt2d($data, $length); - $length += 2; - $fibRgW_reserved2 = self::_GetInt2d($data, $length); - $length += 2; - $fibRgW_reserved3 = self::_GetInt2d($data, $length); - $length += 2; - $fibRgW_reserved4 = self::_GetInt2d($data, $length); - $length += 2; - $fibRgW_reserved5 = self::_GetInt2d($data, $length); - $length += 2; - $fibRgW_reserved6 = self::_GetInt2d($data, $length); - $length += 2; - $fibRgW_reserved7 = self::_GetInt2d($data, $length); - $length += 2; - $fibRgW_reserved8 = self::_GetInt2d($data, $length); - $length += 2; - $fibRgW_reserved9 = self::_GetInt2d($data, $length); - $length += 2; - $fibRgW_reserved10 = self::_GetInt2d($data, $length); - $length += 2; - $fibRgW_reserved11 = self::_GetInt2d($data, $length); - $length += 2; - $fibRgW_reserved12 = self::_GetInt2d($data, $length); - $length += 2; - $fibRgW_reserved13 = self::_GetInt2d($data, $length); - $length += 2; - $fibRgW_lidFE = self::_GetInt2d($data, $length); - $length += 2; + // reserved1 + $pos += 2; + // reserved2 + $pos += 2; + // reserved3 + $pos += 2; + // reserved4 + $pos += 2; + // reserved5 + $pos += 2; + // reserved6 + $pos += 2; + // reserved7 + $pos += 2; + // reserved8 + $pos += 2; + // reserved9 + $pos += 2; + // reserved10 + $pos += 2; + // reserved11 + $pos += 2; + // reserved12 + $pos += 2; + // reserved13 + $pos += 2; + // lidFE + $pos += 2; //----- cslw - print_r('======================== cslw'.PHP_EOL); - $cslw = self::_GetInt2d($data, $length); - $length += 2; - print_r('$cslw : '.$cslw.'#'.dechex($cslw).PHP_EOL); + $pos += 2; //----- fibRgLw - print_r('======================== fibRgLw'.PHP_EOL); - $fibRgLw_cbMac = self::_GetInt4d($data, $length); - $length += 4; - $fibRgLw_reserved1 = self::_GetInt4d($data, $length); - $length += 4; - $fibRgLw_reserved2 = self::_GetInt4d($data, $length); - $length += 4; - $fibRgLw_ccpText = self::_GetInt4d($data, $length); - $length += 4; - $fibRgLw_ccpFtn = self::_GetInt4d($data, $length); - $length += 4; - $fibRgLw_ccpHdd = self::_GetInt4d($data, $length); - $length += 4; - $fibRgLw_reserved3 = self::_GetInt4d($data, $length); - $length += 4; - $fibRgLw_ccpAtn = self::_GetInt4d($data, $length); - $length += 4; - $fibRgLw_ccpEdn = self::_GetInt4d($data, $length); - $length += 4; - $fibRgLw_ccpTxbx = self::_GetInt4d($data, $length); - $length += 4; - $fibRgLw_ccpHdrTxbx = self::_GetInt4d($data, $length); - $length += 4; - $fibRgLw_reserved4 = self::_GetInt4d($data, $length); - $length += 4; - $fibRgLw_reserved5 = self::_GetInt4d($data, $length); - $length += 4; - $fibRgLw_reserved6 = self::_GetInt4d($data, $length); - $length += 4; - $fibRgLw_reserved7 = self::_GetInt4d($data, $length); - $length += 4; - $fibRgLw_reserved8 = self::_GetInt4d($data, $length); - $length += 4; - $fibRgLw_reserved9 = self::_GetInt4d($data, $length); - $length += 4; - $fibRgLw_reserved10 = self::_GetInt4d($data, $length); - $length += 4; - $fibRgLw_reserved11 = self::_GetInt4d($data, $length); - $length += 4; - $fibRgLw_reserved12 = self::_GetInt4d($data, $length); - $length += 4; - $fibRgLw_reserved13 = self::_GetInt4d($data, $length); - $length += 4; - $fibRgLw_reserved14 = self::_GetInt4d($data, $length); - $length += 4; + // cbMac + $pos += 4; + // reserved1 + $pos += 4; + // reserved2 + $pos += 4; + $this->arrayFib['ccpText'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['ccpFtn'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['ccpHdd'] = self::getInt4d($data, $pos); + $pos += 4; + // reserved3 + $pos += 4; + // ccpAtn + $pos += 4; + // ccpEdn + $pos += 4; + // ccpTxbx + $pos += 4; + // ccpHdrTxbx + $pos += 4; + // reserved4 + $pos += 4; + // reserved5 + $pos += 4; + // reserved6 + $pos += 4; + // reserved7 + $pos += 4; + // reserved8 + $pos += 4; + // reserved9 + $pos += 4; + // reserved10 + $pos += 4; + // reserved11 + $pos += 4; + // reserved12 + $pos += 4; + // reserved13 + $pos += 4; + // reserved14 + $pos += 4; //----- cbRgFcLcb - print_r('======================== cbRgFcLcb'.PHP_EOL); - $cbRgFcLcb = self::_GetInt2d($data, $length); - print_r('$cbRgFcLcb : '.$cbRgFcLcb.'#'.dechex($cbRgFcLcb).PHP_EOL); - $length += 2; + $cbRgFcLcb = self::getInt2d($data, $pos); + $pos += 2; //----- fibRgFcLcbBlob - print_r('======================== fibRgFcLcbBlob'.PHP_EOL); switch ($cbRgFcLcb) { case 0x005D: - $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_97); + $pos = $this->readBlockFibRgFcLcb($data, $pos, self::VERSION_97); break; case 0x006C: - $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_97); - $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2000); + $pos = $this->readBlockFibRgFcLcb($data, $pos, self::VERSION_97); + $pos = $this->readBlockFibRgFcLcb($data, $pos, self::VERSION_2000); break; case 0x0088: - $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_97); - $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2000); - $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2002); + $pos = $this->readBlockFibRgFcLcb($data, $pos, self::VERSION_97); + $pos = $this->readBlockFibRgFcLcb($data, $pos, self::VERSION_2000); + $pos = $this->readBlockFibRgFcLcb($data, $pos, self::VERSION_2002); break; case 0x00A4 : - $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_97); - $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2000); - $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2002); - $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2003); + $pos = $this->readBlockFibRgFcLcb($data, $pos, self::VERSION_97); + $pos = $this->readBlockFibRgFcLcb($data, $pos, self::VERSION_2000); + $pos = $this->readBlockFibRgFcLcb($data, $pos, self::VERSION_2002); + $pos = $this->readBlockFibRgFcLcb($data, $pos, self::VERSION_2003); break; case 0x00B7: - $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_97); - $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2000); - $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2002); - $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2003); - $length = $this->readBlockFibRgFcLcb($data, $length, self::VERSION_2007); + $pos = $this->readBlockFibRgFcLcb($data, $pos, self::VERSION_97); + $pos = $this->readBlockFibRgFcLcb($data, $pos, self::VERSION_2000); + $pos = $this->readBlockFibRgFcLcb($data, $pos, self::VERSION_2002); + $pos = $this->readBlockFibRgFcLcb($data, $pos, self::VERSION_2003); + $pos = $this->readBlockFibRgFcLcb($data, $pos, self::VERSION_2007); break; } - //print_r($this->arrayFib); //----- cswNew - print_r('======================== cswNew'.PHP_EOL); - $cswNew = self::_GetInt2d($data, $length); - $length += 2; - print_r('$cswNew : '.$cswNew.'#'.dechex($cswNew).PHP_EOL); + $this->arrayFib['cswNew'] = self::getInt2d($data, $pos); + $pos += 2; - if($cswNew != 0){ - // fibRgCswNew - print_r('======================== fibRgCswNew'.PHP_EOL); + if($this->arrayFib['cswNew'] != 0){ + //@todo : fibRgCswNew } - print_r('======================== length : '.$length.'#'.dechex($length).PHP_EOL); - return $length; + return $pos; } - const VERSION_97 = '97'; - const VERSION_2000 = '2000'; - const VERSION_2002 = '2002'; - const VERSION_2003 = '2003'; - const VERSION_2007 = '2007'; - - /** - * @var array - */ - private $arrayFib = array(); - - private function readBlockFibRgFcLcb($data, $length, $version) + private function readBlockFibRgFcLcb($data, $pos, $version) { if($version == self::VERSION_97){ - $this->arrayFib['fcStshfOrig'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbStshfOrig'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcStshf'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbStshf'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcffndRef'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcffndRef'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcffndTxt'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcffndTxt'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfandRef'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfandRef'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfandTxt'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfandTxt '] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfSed'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfSed'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcPad'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcPad'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfPhe'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfPhe'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbfGlsy'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbfGlsy'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfGlsy'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfGlsy'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfHdd'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfHdd'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfBteChpx'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfBteChpx'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfBtePapx'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfBtePapx'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfSea'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfSea'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbfFfn'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbfFfn'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfFldMom'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfFldMom'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfFldHdr'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfFldHdr'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfFldFtn'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfFldFtn'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfFldAtn'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfFldAtn'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfFldMcr'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfFldMcr'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbfBkmk'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbfBkmk'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfBkf'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfBkf'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfBkl'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfBkl'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcCmds'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbCmds'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcUnused1'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbUnused1'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbfMcr'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbfMcr'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPrDrvr'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPrDrvr'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPrEnvPort'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPrEnvPort'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPrEnvLand'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPrEnvLand'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcWss'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbWss'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcDop'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbDop'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbfAssoc'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbfAssoc'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcClx'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbClx'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfPgdFtn'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfPgdFtn'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcAutosaveSource'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbAutosaveSource'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcGrpXstAtnOwners'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbGrpXstAtnOwners'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbfAtnBkmk'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbfAtnBkmk'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcUnused2'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbUnused2'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcUnused3'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbUnused3'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcSpaMom'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcSpaMom'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcSpaHdr'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcSpaHdr'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfAtnBkf'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfAtnBkf'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfAtnBkl'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfAtnBkl'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPms'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPms'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcFormFldSttbs'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbFormFldSttbs'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfendRef'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfendRef'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfendTxt'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfendTxt'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfFldEdn'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfFldEdn'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcUnused4'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbUnused4'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcDggInfo'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbDggInfo'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbfRMark'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbfRMark'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbfCaption'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbfCaption'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbfAutoCaption'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbfAutoCaption'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfWkb'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfWkb'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfSpl'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfSpl'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcftxbxTxt'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcftxbxTxt'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfFldTxbx'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfFldTxbx'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfHdrtxbxTxt'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfHdrtxbxTxt'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcffldHdrTxbx'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcffldHdrTxbx'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcStwUser'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbStwUser'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbTtmbd'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbTtmbd'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcCookieData'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbCookieData'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPgdMotherOldOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPgdMotherOldOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcBkdMotherOldOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbBkdMotherOldOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPgdFtnOldOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPgdFtnOldOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcBkdFtnOldOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbBkdFtnOldOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPgdEdnOldOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPgdEdnOldOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcBkdEdnOldOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbBkdEdnOldOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbfIntlFld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbfIntlFld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcRouteSlip'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbRouteSlip'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbSavedBy'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbSavedBy'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbFnm'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbFnm'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlfLst'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlfLst'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlfLfo'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlfLfo'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfTxbxBkd'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfTxbxBkd'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfTxbxHdrBkd'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfTxbxHdrBkd'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcDocUndoWord9'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbDocUndoWord9'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcRgbUse'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbRgbUse'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcUsp'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbUsp'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcUskf'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbUskf'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcupcRgbUse'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcupcRgbUse'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcupcUsp'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcupcUsp'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbGlsyStyle'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbGlsyStyle'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlgosl'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlgosl'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcocx'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcocx'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfBteLvc'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfBteLvc'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['dwLowDateTime'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['dwHighDateTime'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfLvcPre10'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfLvcPre10'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfAsumy'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfAsumy'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfGram'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfGram'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbListNames'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbListNames'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbfUssr'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbfUssr'] = self::_GetInt4d($data, $length); - $length += 4; + $this->arrayFib['fcStshfOrig'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbStshfOrig'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcStshf'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbStshf'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcffndRef'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcffndRef'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcffndTxt'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcffndTxt'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfandRef'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfandRef'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfandTxt'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfandTxt '] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfSed'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfSed'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcPad'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcPad'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfPhe'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfPhe'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbfGlsy'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbfGlsy'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfGlsy'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfGlsy'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfHdd'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfHdd'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfBteChpx'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfBteChpx'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfBtePapx'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfBtePapx'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfSea'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfSea'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbfFfn'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbfFfn'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfFldMom'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfFldMom'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfFldHdr'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfFldHdr'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfFldFtn'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfFldFtn'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfFldAtn'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfFldAtn'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfFldMcr'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfFldMcr'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbfBkmk'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbfBkmk'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfBkf'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfBkf'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfBkl'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfBkl'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcCmds'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbCmds'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcUnused1'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbUnused1'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbfMcr'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbfMcr'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPrDrvr'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPrDrvr'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPrEnvPort'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPrEnvPort'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPrEnvLand'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPrEnvLand'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcWss'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbWss'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcDop'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbDop'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbfAssoc'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbfAssoc'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcClx'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbClx'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfPgdFtn'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfPgdFtn'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcAutosaveSource'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbAutosaveSource'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcGrpXstAtnOwners'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbGrpXstAtnOwners'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbfAtnBkmk'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbfAtnBkmk'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcUnused2'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbUnused2'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcUnused3'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbUnused3'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcSpaMom'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcSpaMom'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcSpaHdr'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcSpaHdr'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfAtnBkf'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfAtnBkf'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfAtnBkl'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfAtnBkl'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPms'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPms'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcFormFldSttbs'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbFormFldSttbs'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfendRef'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfendRef'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfendTxt'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfendTxt'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfFldEdn'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfFldEdn'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcUnused4'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbUnused4'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcDggInfo'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbDggInfo'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbfRMark'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbfRMark'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbfCaption'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbfCaption'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbfAutoCaption'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbfAutoCaption'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfWkb'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfWkb'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfSpl'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfSpl'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcftxbxTxt'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcftxbxTxt'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfFldTxbx'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfFldTxbx'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfHdrtxbxTxt'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfHdrtxbxTxt'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcffldHdrTxbx'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcffldHdrTxbx'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcStwUser'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbStwUser'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbTtmbd'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbTtmbd'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcCookieData'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbCookieData'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPgdMotherOldOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPgdMotherOldOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcBkdMotherOldOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbBkdMotherOldOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPgdFtnOldOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPgdFtnOldOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcBkdFtnOldOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbBkdFtnOldOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPgdEdnOldOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPgdEdnOldOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcBkdEdnOldOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbBkdEdnOldOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbfIntlFld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbfIntlFld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcRouteSlip'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbRouteSlip'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbSavedBy'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbSavedBy'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbFnm'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbFnm'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlfLst'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlfLst'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlfLfo'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlfLfo'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfTxbxBkd'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfTxbxBkd'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfTxbxHdrBkd'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfTxbxHdrBkd'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcDocUndoWord9'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbDocUndoWord9'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcRgbUse'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbRgbUse'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcUsp'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbUsp'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcUskf'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbUskf'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcupcRgbUse'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcupcRgbUse'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcupcUsp'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcupcUsp'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbGlsyStyle'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbGlsyStyle'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlgosl'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlgosl'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcocx'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcocx'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfBteLvc'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfBteLvc'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['dwLowDateTime'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['dwHighDateTime'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfLvcPre10'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfLvcPre10'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfAsumy'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfAsumy'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfGram'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfGram'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbListNames'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbListNames'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbfUssr'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbfUssr'] = self::getInt4d($data, $pos); + $pos += 4; } if($version == self::VERSION_2000){ - $this->arrayFib['fcPlcfTch'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfTch'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcRmdThreading'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbRmdThreading'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcMid'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbMid'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbRgtplc'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbRgtplc'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcMsoEnvelope'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbMsoEnvelope'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfLad'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfLad'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcRgDofr'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbRgDofr'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcosl'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcosl'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfCookieOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfCookieOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPgdMotherOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPgdMotherOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcBkdMotherOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbBkdMotherOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPgdFtnOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPgdFtnOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcBkdFtnOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbBkdFtnOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPgdEdnOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPgdEdnOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcBkdEdnOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbBkdEdnOld'] = self::_GetInt4d($data, $length); - $length += 4; + $this->arrayFib['fcPlcfTch'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfTch'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcRmdThreading'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbRmdThreading'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcMid'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbMid'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbRgtplc'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbRgtplc'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcMsoEnvelope'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbMsoEnvelope'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfLad'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfLad'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcRgDofr'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbRgDofr'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcosl'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcosl'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfCookieOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfCookieOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPgdMotherOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPgdMotherOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcBkdMotherOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbBkdMotherOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPgdFtnOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPgdFtnOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcBkdFtnOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbBkdFtnOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPgdEdnOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPgdEdnOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcBkdEdnOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbBkdEdnOld'] = self::getInt4d($data, $pos); + $pos += 4; } if($version == self::VERSION_2002){ - $this->arrayFib['fcUnused1'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbUnused1'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfPgp'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfPgp'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfuim'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfuim'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlfguidUim'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlfguidUim'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcAtrdExtra'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbAtrdExtra'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlrsid'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlrsid'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbfBkmkFactoid'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbfBkmkFactoid'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfBkfFactoid'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfBkfFactoid'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfcookie'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfcookie'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfBklFactoid'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfBklFactoid'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcFactoidData'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbFactoidData'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcDocUndo'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbDocUndo'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbfBkmkFcc'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbfBkmkFcc'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfBkfFcc'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfBkfFcc'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfBklFcc'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfBklFcc'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbfbkmkBPRepairs'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbfbkmkBPRepairs'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfbkfBPRepairs'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfbkfBPRepairs'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfbklBPRepairs'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfbklBPRepairs'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPmsNew'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPmsNew'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcODSO'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbODSO'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfpmiOldXP'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfpmiOldXP'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfpmiNewXP'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfpmiNewXP'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfpmiMixedXP'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfpmiMixedXP'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcUnused2'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbUnused2'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcffactoid'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcffactoid'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcflvcOldXP'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcflvcOldXP'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcflvcNewXP'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcflvcNewXP'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcflvcMixedXP'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcflvcMixedXP'] = self::_GetInt4d($data, $length); - $length += 4; + $this->arrayFib['fcUnused1'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbUnused1'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfPgp'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfPgp'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfuim'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfuim'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlfguidUim'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlfguidUim'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcAtrdExtra'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbAtrdExtra'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlrsid'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlrsid'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbfBkmkFactoid'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbfBkmkFactoid'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfBkfFactoid'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfBkfFactoid'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfcookie'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfcookie'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfBklFactoid'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfBklFactoid'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcFactoidData'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbFactoidData'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcDocUndo'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbDocUndo'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbfBkmkFcc'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbfBkmkFcc'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfBkfFcc'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfBkfFcc'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfBklFcc'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfBklFcc'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbfbkmkBPRepairs'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbfbkmkBPRepairs'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfbkfBPRepairs'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfbkfBPRepairs'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfbklBPRepairs'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfbklBPRepairs'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPmsNew'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPmsNew'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcODSO'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbODSO'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfpmiOldXP'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfpmiOldXP'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfpmiNewXP'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfpmiNewXP'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfpmiMixedXP'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfpmiMixedXP'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcUnused2'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbUnused2'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcffactoid'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcffactoid'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcflvcOldXP'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcflvcOldXP'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcflvcNewXP'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcflvcNewXP'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcflvcMixedXP'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcflvcMixedXP'] = self::getInt4d($data, $pos); + $pos += 4; } if($version == self::VERSION_2003){ - $this->arrayFib['fcHplxsdr'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbHplxsdr'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbfBkmkSdt'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbfBkmkSdt'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfBkfSdt'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfBkfSdt'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfBklSdt'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfBklSdt'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcCustomXForm'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbCustomXForm'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbfBkmkProt'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbfBkmkProt'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfBkfProt'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfBkfProt'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfBklProt'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfBklProt'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbProtUser'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbProtUser'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcUnused'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbUnused'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfpmiOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfpmiOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfpmiOldInline'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfpmiOldInline'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfpmiNew'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfpmiNew'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfpmiNewInline'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfpmiNewInline'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcflvcOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcflvcOld'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcflvcOldInline'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcflvcOldInline'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcflvcNew'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcflvcNew'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcflvcNewInline'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcflvcNewInline'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPgdMother'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPgdMother'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcBkdMother'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbBkdMother'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcAfdMother'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbAfdMother'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPgdFtn'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPgdFtn'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcBkdFtn'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbBkdFtn'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcAfdFtn'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbAfdFtn'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPgdEdn'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPgdEdn'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcBkdEdn'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbBkdEdn'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcAfdEdn'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbAfdEdn'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcAfd'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbAfd'] = self::_GetInt4d($data, $length); - $length += 4; + $this->arrayFib['fcHplxsdr'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbHplxsdr'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbfBkmkSdt'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbfBkmkSdt'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfBkfSdt'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfBkfSdt'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfBklSdt'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfBklSdt'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcCustomXForm'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbCustomXForm'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbfBkmkProt'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbfBkmkProt'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfBkfProt'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfBkfProt'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfBklProt'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfBklProt'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbProtUser'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbProtUser'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcUnused'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbUnused'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfpmiOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfpmiOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfpmiOldInline'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfpmiOldInline'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfpmiNew'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfpmiNew'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfpmiNewInline'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfpmiNewInline'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcflvcOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcflvcOld'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcflvcOldInline'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcflvcOldInline'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcflvcNew'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcflvcNew'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcflvcNewInline'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcflvcNewInline'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPgdMother'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPgdMother'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcBkdMother'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbBkdMother'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcAfdMother'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbAfdMother'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPgdFtn'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPgdFtn'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcBkdFtn'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbBkdFtn'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcAfdFtn'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbAfdFtn'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPgdEdn'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPgdEdn'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcBkdEdn'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbBkdEdn'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcAfdEdn'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbAfdEdn'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcAfd'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbAfd'] = self::getInt4d($data, $pos); + $pos += 4; } if($version == self::VERSION_2007){ - $this->arrayFib['fcPlcfmthd'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfmthd'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbfBkmkMoveFrom'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbfBkmkMoveFrom'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfBkfMoveFrom'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfBkfMoveFrom'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfBklMoveFrom'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfBklMoveFrom'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbfBkmkMoveTo'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbfBkmkMoveTo'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfBkfMoveTo'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfBkfMoveTo'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfBklMoveTo'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfBklMoveTo'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcUnused1'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbUnused1'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcUnused2'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbUnused2'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcUnused3'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbUnused3'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcSttbfBkmkArto'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbSttbfBkmkArto'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfBkfArto'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfBkfArto'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcPlcfBklArto'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbPlcfBklArto'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcArtoData'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbArtoData'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcUnused4'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbUnused4'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcUnused5'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbUnused5'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcUnused6'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbUnused6'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcOssTheme'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbOssTheme'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['fcColorSchemeMapping'] = self::_GetInt4d($data, $length); - $length += 4; - $this->arrayFib['lcbColorSchemeMapping'] = self::_GetInt4d($data, $length); - $length += 4; + $this->arrayFib['fcPlcfmthd'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfmthd'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbfBkmkMoveFrom'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbfBkmkMoveFrom'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfBkfMoveFrom'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfBkfMoveFrom'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfBklMoveFrom'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfBklMoveFrom'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbfBkmkMoveTo'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbfBkmkMoveTo'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfBkfMoveTo'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfBkfMoveTo'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfBklMoveTo'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfBklMoveTo'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcUnused1'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbUnused1'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcUnused2'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbUnused2'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcUnused3'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbUnused3'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcSttbfBkmkArto'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbSttbfBkmkArto'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfBkfArto'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfBkfArto'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcPlcfBklArto'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbPlcfBklArto'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcArtoData'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbArtoData'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcUnused4'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbUnused4'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcUnused5'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbUnused5'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcUnused6'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbUnused6'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcOssTheme'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbOssTheme'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['fcColorSchemeMapping'] = self::getInt4d($data, $pos); + $pos += 4; + $this->arrayFib['lcbColorSchemeMapping'] = self::getInt4d($data, $pos); + $pos += 4; } - return $length; + return $pos; } private function readFibContent() { - #$this->readRecordSTSH(); + // Informations about Font + $this->readRecordSttbfFfn(); + + // Informations about page $this->readRecordPlcfSed(); + + // reading paragraphs + //@link https://github.com/notmasteryet/CompoundFile/blob/ec118f354efebdee9102e41b5b7084fce81125b0/WordFileReader/WordDocument.cs#L86 + $this->readRecordPlcfBtePapx(); + + // reading character formattings + //@link https://github.com/notmasteryet/CompoundFile/blob/ec118f354efebdee9102e41b5b7084fce81125b0/WordFileReader/WordDocument.cs#L94 + $this->readRecordPlcfBteChpx(); + + $this->generatePhpWord(); } - private function readRecordSTSH() - { - print_r('============ readRecordSTSH'.PHP_EOL); - // Table Stream - // fcStshf (4 bytes): An unsigned integer that specifies an offset in the Table Stream. An STSH that specifies the style sheet for this document begins at this offset. - // lcbStshf (4 bytes): An unsigned integer that specifies the size, in bytes, of the STSH that begins at offset fcStshf in the Table Stream. This MUST be a nonzero value. - /*[fcStshf] => 0 - [lcbStshf] => 1060*/ - $posMem = $this->arrayFib['fcStshf']; - - // RECORD "STSH" - - // lpstshi (variable): An LPStshi that specifies information about the stylesheet. - // - LPStshi - // - LPStshi : cbStshi - $cbStshi = self::_GetInt2d($this->data1Table, $posMem); - $posMem += 2; - print_r('$cbStshi :'.$cbStshi.PHP_EOL); - - // - LPStshi : stshi - // - LPStshi : stshi : stshif (18o) - // - LPStshi : stshi : stshif : cstd - $cstd = self::_GetInt2d($this->data1Table, $posMem); - $posMem += 2; - // - LPStshi : stshi : stshif : cbSTDBaseInFile - $cbSTDBaseInFile = self::_GetInt2d($this->data1Table, $posMem); - $posMem += 2; - // - LPStshi : stshi : stshif : fStdStylenamesWritten (1 bit) - // - LPStshi : stshi : stshif : fReserved (15 bits) - $fStdStylenamesWritten = self::_GetInt1d($this->data1Table, $posMem); - $posMem += 2; - // - LPStshi : stshi : stshif : stiMaxWhenSaved - $stiMaxWhenSaved = self::_GetInt2d($this->data1Table, $posMem); - $posMem += 2; - print_r('$stiMaxWhenSaved :'.$stiMaxWhenSaved.PHP_EOL); - // - LPStshi : stshi : stshif : istdMaxFixedWhenSaved - $istdMaxFixedWhenSaved = self::_GetInt2d($this->data1Table, $posMem); - $posMem += 2; - // - LPStshi : stshi : stshif : nVerBuiltInNamesWhenSaved - $nVerBuiltInNamesWhenSaved = self::_GetInt2d($this->data1Table, $posMem); - $posMem += 2; - // - LPStshi : stshi : stshif : ftcAsci - $ftcAsci = self::_GetInt2d($this->data1Table, $posMem); - $posMem += 2; - // - LPStshi : stshi : stshif : ftcFE - $ftcFE = self::_GetInt2d($this->data1Table, $posMem); - $posMem += 2; - // - LPStshi : stshi : stshif : ftcOther - $ftcOther = self::_GetInt2d($this->data1Table, $posMem); - $posMem += 2; - - // - LPStshi : stshi : ftcBi (2o) - $ftcBi = self::_GetInt2d($this->data1Table, $posMem); - $posMem += 2; - // - LPStshi : stshi : StshiLsd - // - LPStshi : stshi : StshiLsd : cbLSD - $cbLSD = self::_GetInt2d($this->data1Table, $posMem); - $posMem += 2; - print_r('$cbLSD :'.$cbLSD.PHP_EOL); - - - // - LPStshi : stshi : StshiLsd : mpstiilsd - // - LPStshi : stshi : StshiB - - // rglpstd (variable): An array of LPStd that specifies the style definitions. - } + /** + * Section and information about them + * @link : http://msdn.microsoft.com/en-us/library/dd924458%28v=office.12%29.aspx + */ private function readRecordPlcfSed(){ - // fcPlcfSed (4 bytes): An unsigned integer that specifies an offset in the Table Stream. A PlcfSed begins at this offset and specifies the locations of property lists for each section in the Main Document. If lcbPlcfSed is zero, fcPlcfSed is undefined and MUST be ignored. - // lcbPlcfSed (4 bytes): An unsigned integer that specifies the size, in bytes, of the PlcfSed that begins at offset fcPlcfSed in the Table Stream. - print_r('============ readRecordPlcfSed'.PHP_EOL); - $posMem = $this->arrayFib['fcPlcfSed']; // PlcfSed // PlcfSed : aCP $aCP = array(); - $aCP[0] = self::_GetInt4d($this->data1Table, $posMem); + $aCP[0] = self::getInt4d($this->data1Table, $posMem); $posMem += 4; - $aCP[1] = self::_GetInt4d($this->data1Table, $posMem); + $aCP[1] = self::getInt4d($this->data1Table, $posMem); $posMem += 4; - print_r('$aCP :'.PHP_EOL); - print_r($aCP); - // PlcfSed : aSed - $numSed = ($this->arrayFib['lcbPlcfSed'] - 4) / 12; + //@link : http://msdn.microsoft.com/en-us/library/dd950194%28v=office.12%29.aspx + $numSed = $this->getNumInLcb($this->arrayFib['lcbPlcfSed'], 12); $aSed = array(); - for($iInc = 1 ; $iInc < $numSed ; ++$iInc){ - // ignored + for($iInc = 0 ; $iInc < $numSed ; ++$iInc){ + // Sed : http://msdn.microsoft.com/en-us/library/dd950982%28v=office.12%29.aspx + // fn $posMem += 2; - // A signed integer value that specifies the position in the WordDocument Stream at which a Sepx structure is located. - $aSed[$iInc] = self::_GetInt4d($this->data1Table, $posMem); + // fnMpr + $aSed[$iInc] = self::getInt4d($this->data1Table, $posMem); $posMem += 4; - // ignored + // fnMpr $posMem += 2; - // ignored + // fcMpr $posMem += 4; } - // page 541 pour la lecture des informations sur la section - } + foreach($aSed as $keySed => $offsetSed){ + // Sepx : http://msdn.microsoft.com/en-us/library/dd921348%28v=office.12%29.aspx + $cb = self::getInt2d($this->dataWorkDocument, $offsetSed); + $offsetSed += 2; + $oStylePrl = $this->readPrl($this->dataWorkDocument, $offsetSed, $cb); + $offsetSed += $oStylePrl->length; - private function read1Table($data) - { - /* - offset[0] = offsetClx + 1; - int lcb = stream.getInteger(offset); - - int countPcd = (lcb - 4)/12; - int countCp = (lcb - countPcd*8)/4; - int offsetPlcpcd = offsetClx + 5; - - for(int i=0;i> 30; - start = (start << 2) >> 2; - - offset[0] = offsetPlcpcd + i*4; - int cpPre = stream.getInteger(offset); - int cpNext = stream.getInteger(offset); - int length = cpNext - cpPre -1; - if(fc == 0) - { - length *= 2; - } - else - { - start = start/2; - } - - start += 512; - bytesToString(ogiBytes, content, start, length, fc); - - System.out.println(start +", "+ length); - }*/ - - print_r('============ read1Table'.PHP_EOL); - $clxPosition = $this->arrayFib['fcClx']; - - $text = self::_GetInt1d($data, $clxPosition); - print_r('$text : '.$text.PHP_EOL); - $lcb_piece_table = self::_GetInt4d($data, $clxPosition + 1); - $piece_table = $clxPosition + 5; - $piece_count = ($lcb_piece_table - 4) / 12; - print_r('$piece_count : '.$piece_count.PHP_EOL); - - - $countCp = ($lcb_piece_table - $piece_count*8)/4; - print_r('$countCp : '.$countCp.PHP_EOL); - for($i=0 ; $i < $piece_count ; $i++) { - - $piece_start = self::_GetInt4d($data, $piece_table + ($i * 4)); - $piece_end = self::_GetInt4d($data, $piece_table + (($i + 1) * 4)); - $piece_descriptor = $piece_table + (($piece_count + 1) * 4) + ($i * 8); - $fc = self::_GetInt4d ($data, $piece_descriptor + 2); - $is_ansi = ($fc & 0x40000000) == 0x40000000; - if (!$is_ansi) { - $fc = ($fc & 0xBFFFFFFF); - } else { - $fc = ($fc & 0xBFFFFFFF) >> 1; - } - $piece_size = $piece_end - $piece_start; - print_r('$piece_size : '.$piece_size.PHP_EOL); - if (!$is_ansi) { - $piece_size *= 2; - } - print_r('$piece_size : '.$piece_size.PHP_EOL); - if ($piece_size >= 1) { - $fc+=512; - print_r(chr(self::_GetInt2d($data, $fc + 2))); - print_r(chr(self::_GetInt2d($data, $fc + 4))); - print_r(chr(self::_GetInt2d($data, $fc + 6))); - print_r(chr(self::_GetInt2d($data, $fc + 8))); - print_r(chr(self::_GetInt2d($data, $fc + 10))); - print_r(chr(self::_GetInt2d($data, $fc + 12))); - print_r(chr(self::_GetInt2d($data, $fc + 14))); - print_r(chr(self::_GetInt2d($data, $fc + 16))); - print_r(chr(self::_GetInt2d($data, $fc + 18))); - print_r(chr(self::_GetInt2d($data, $fc + 20))); - print_r(chr(self::_GetInt2d($data, $fc + 22))); - print_r(chr(self::_GetInt2d($data, $fc + 24))); - print_r(chr(self::_GetInt2d($data, $fc + 26))); - print_r(chr(self::_GetInt2d($data, $fc + 28))); - print_r(chr(self::_GetInt2d($data, $fc + 30))); - print_r(chr(self::_GetInt2d($data, $fc + 32))); - print_r(chr(self::_GetInt2d($data, $fc + 34))); - print_r(chr(self::_GetInt2d($data, $fc + 36))); - print_r(chr(self::_GetInt2d($data, $fc + 38))); - print_r(PHP_EOL); - } - - $offsetPcd = $piece_table + $countCp*4 + $i*8; - - $start = self::_GetInt4d($data, $offsetPcd+2); - print_r('$start : '.$start.PHP_EOL); - $fc = $start >> 30; - $start = ($start << 2) >> 2; - print_r('$fc : '.$fc.PHP_EOL); - print_r('$start : '.$start.PHP_EOL); - - $offset = $piece_table + $i*4; - print_r('$offset : '.$offset.PHP_EOL); - $cpPre = self::_GetInt4d($data, $offset); - print_r('$cpPre : '.$cpPre.PHP_EOL); - $cpNext = self::_GetInt4d($data, $offset + 4); - print_r('$cpNext : '.$cpNext.PHP_EOL); - $length = $cpNext - $cpPre -1; - if($fc == 0) { - $length *= 2; - } else { - $start = $start/2; - } - - $start += 512; - print_r($start); - print_r(PHP_EOL); - print_r($length); - print_r(PHP_EOL); - print_r(self::_GetInt2d($data, $start + 2)); - print_r(PHP_EOL); - print_r(chr(self::_GetInt2d($data, $start + 2))); - print_r(PHP_EOL); - print_r(chr(self::_GetInt2d($data, $start + 4))); - print_r(chr(self::_GetInt2d($data, $start + 6))); - print_r(chr(self::_GetInt2d($data, $start + 8))); - print_r(chr(self::_GetInt2d($data, $start + 10))); - print_r(chr(self::_GetInt2d($data, $start + 12))); - print_r(chr(self::_GetInt2d($data, $start + 14))); - print_r(chr(self::_GetInt2d($data, $start + 16))); - print_r(chr(self::_GetInt2d($data, $start + 18))); - print_r(chr(self::_GetInt2d($data, $start + 20))); - print_r(chr(self::_GetInt2d($data, $start + 22))); - print_r(chr(self::_GetInt2d($data, $start + 24))); - print_r(chr(self::_GetInt2d($data, $start + 26))); - print_r(chr(self::_GetInt2d($data, $start + 28))); - print_r(chr(self::_GetInt2d($data, $start + 30))); - print_r(chr(self::_GetInt2d($data, $start + 32))); - print_r(chr(self::_GetInt2d($data, $start + 34))); - print_r(chr(self::_GetInt2d($data, $start + 36))); - print_r(chr(self::_GetInt2d($data, $start + 38))); + $this->arraySections[] = $oStylePrl; } -/* - - $start = self::_GetInt4d($data, 1850); - print_r('$start : '.$start.PHP_EOL); - $end = self::_GetInt4d($data, 1854); - print_r('$end : '.$end.PHP_EOL);*/ - - print_r(PHP_EOL); - print_r(PHP_EOL); - print_r(PHP_EOL); - //print_r($data); - print_r(PHP_EOL); - //print_r(dechex($data)); - print_r(PHP_EOL); } - private function readData($data) + /** + * Specifies the fonts that are used in the document + * @link : http://msdn.microsoft.com/en-us/library/dd943880%28v=office.12%29.aspx + */ + private function readRecordSttbfFfn() { - print_r('============ readData'.PHP_EOL); - $text = self::_GetInt1d($data, 0); - print_r(dechex($text)); + $posMem = $this->arrayFib['fcSttbfFfn']; - print_r(PHP_EOL); - print_r(PHP_EOL); - print_r(PHP_EOL); - //print_r($data); - print_r(PHP_EOL); - //print_r(dechex($data)); - print_r(PHP_EOL); + $cData = self::getInt2d($this->data1Table, $posMem); + $posMem += 2; + $cbExtra = self::getInt2d($this->data1Table, $posMem); + $posMem += 2; + + if ($cData < 0x7FF0 && $cbExtra == 0) { + for ($inc = 0; $inc < $cData; $inc++) { + // len + $posMem += 1; + // ffid + $posMem += 1; + // wWeight (400 : Normal - 700 bold) + $posMem += 2; + // chs + $posMem += 1; + // ixchSzAlt + $ixchSzAlt = self::getInt1d($this->data1Table, $posMem); + $posMem += 1; + // panose + $posMem += 10; + // fs + $posMem += 24; + // xszFfn + $xszFfn = ''; + do { + $char = self::getInt2d($this->data1Table, $posMem); + $posMem += 2; + if($char > 0) { + $xszFfn .= chr($char); + } + } while ($char != 0); + // xszAlt + $xszAlt = ''; + if($ixchSzAlt > 0) { + do { + $char = self::getInt2d($this->data1Table, $posMem); + $posMem += 2; + if($char == 0) { + break; + } + $xszAlt .= chr($char); + } while ($char != 0); + } + $this->arrayFonts[] = array( + 'main' => $xszFfn, + 'alt' => $xszAlt, + ); + } + } } - private function readObjectPool($data) - { - print_r('============ readObjectPool'.PHP_EOL); + /** + * Paragraph and information about them + * @link http://msdn.microsoft.com/en-us/library/dd908569%28v=office.12%29.aspx + */ + private function readRecordPlcfBtePapx(){ + $posMem = $this->arrayFib['fcPlcfBtePapx']; + $num = $this->getNumInLcb($this->arrayFib['lcbPlcfBtePapx'], 4); + $posMem += 4 * ($num + 1); + $plcfBtePapx_aPnBtePapx = $this->getArrayCP($this->data1Table, $posMem, $num); + $posMem += 4 * $num; - print_r(PHP_EOL); - print_r(PHP_EOL); - print_r(PHP_EOL); - //print_r($data); - print_r(PHP_EOL); - //print_r(dechex($data)); - print_r(PHP_EOL); + foreach($plcfBtePapx_aPnBtePapx as $aPnBtePapx){ + $offsetBase = $aPnBtePapx * 512; + $offset = $offsetBase; + + $string = ''; + + $numRun = self::getInt1d($this->dataWorkDocument, $offset + 511); + $arrayRGFC = array(); + for($inc = 0 ; $inc <= $numRun ; $inc++){ + $arrayRGFC[$inc] = self::getInt4d($this->dataWorkDocument, $offset); + $offset += 4; + } + $arrayRGB = array(); + for($inc = 1 ; $inc <= $numRun ; $inc++){ + // @link http://msdn.microsoft.com/en-us/library/dd925804(v=office.12).aspx + $arrayRGB[$inc] = self::getInt1d($this->dataWorkDocument, $offset); + $offset += 1; + // reserved + $offset += 12; + } + + foreach ($arrayRGFC as $key => $rgFc) { + if(!isset($arrayRGFC[$key + 1])){ + break; + } + $strLen = $arrayRGFC[$key + 1] - $arrayRGFC[$key] - 1; + for ($inc = 0; $inc < $strLen; $inc++) { + $byte = self::getInt1d($this->dataWorkDocument, $arrayRGFC[$key] + $inc); + if($byte > 0) { + $string .= chr($byte); + } + } + } + $this->arrayParagraphs[] = $string; + + //@todo readPrl for paragraphs + /*// use $this->readPrl() + foreach ($arrayRGB as $key => $rgb) { + $offset = $offsetBase + ($rgb * 2); + + $cb = self::getInt1d($this->dataWorkDocument, $offset); + $offset += 1; + print_r('$cb : '.$cb.PHP_EOL); + if($cb == 0){ + $cb = self::getInt1d($this->dataWorkDocument, $offset); + $cb = $cb * 2; + $offset += 1; + print_r('$cb0 : '.$cb.PHP_EOL); + } else { + $cb = $cb * 2 - 1; + print_r('$cbD : '.$cb.PHP_EOL); + } + $istd = self::getInt2d($this->dataWorkDocument, $offset); + $offset += 2; + $cb -= 2; + print_r('$istd : '.$istd.($istd == 0 ? ' (Normal)' : '').PHP_EOL); + if($cb > 0){ + do{ + $sprm = self::getInt2d($this->dataWorkDocument, $offset); + $offset += 2; + $cb -= 2; + $sprm_IsPmd = $sprm & 0x01FF; + $sprm_F = ($sprm/512) & 0x0001; + $sprm_Sgc = ($sprm/1024) & 0x0007; + $sprm_Spra = ($sprm/8192); + + print_r('$sprm : 0x'.dechex($sprm).PHP_EOL); + print_r('$sprm.ispmd : 0x'.dechex($sprm_IsPmd).PHP_EOL); + print_r('$sprm.f : 0x'.dechex($sprm_F).PHP_EOL); + print_r('$sprm.sgc : 0x'.dechex($sprm_Sgc)); + switch(dechex($sprm_Sgc)){ + case 0x01: + print_r(' (Paragraph property)'); + break; + case 0x02: + print_r(' (Character property)'); + break; + case 0x03: + print_r(' (Picture property)'); + break; + case 0x04: + print_r(' (Section property)'); + break; + case 0x05: + print_r(' (Table property)'); + break; + } + print_r(PHP_EOL); + print_r('$sprm.spra : 0x'.dechex($sprm_Spra).PHP_EOL); + switch(dechex($sprm_Spra)){ + case 0x0: + $operand = self::getInt1d($this->dataWorkDocument, $offset); + $offset += 1; + $cb -= 1; + switch(dechex($operand)){ + case 0x00: + $operand = 'OFF'; + break; + case 0x01: + $operand = 'ON'; + break; + case 0x80: + $operand = 'CURRENT VALUE'; + print_r(''.PHP_EOL.PHP_EOL); + break; + case 0x81: + $operand = 'OPPOSITE OF THE CURRENT VALUE'; + break; + } + break; + case 0x1: + $operand = self::getInt1d($this->dataWorkDocument, $offset); + $offset += 1; + $cb -= 1; + print_r('$operand : 0x'.dechex($operand).PHP_EOL); + break; + case 0x2: + case 0x4: + case 0x5: + $operand = self::getInt2d($this->dataWorkDocument, $offset); + $offset += 2; + $cb -= 2; + print_r('$operand : 0x'.dechex($operand).PHP_EOL); + break; + case 0x3: + if($sprm_IsPmd != 0x70){ + $operand = self::getInt4d($this->dataWorkDocument, $offset); + $offset += 4; + $cb -= 4; + print_r('$operand : 0x'.dechex($operand).PHP_EOL); + } + break; + case 0x7: + $operand = self::_GetInt3d($this->dataWorkDocument, $offset); + $offset += 3; + $cb -= 3; + print_r('$operand : 0x'.dechex($operand).PHP_EOL); + break; + default: + print_r('YO YO YO : '.PHP_EOL); + } + + // + switch(dechex($sprm_Sgc)){ + case 0x01: // Sprm is modifying a paragraph property. + switch($sprm_IsPmd){ + case 0x0A: // sprmPIlvl + print_r('sprmPIlvl : '.$operand.PHP_EOL.PHP_EOL); + break; + case 0x0B: // sprmPIlfo + print_r('sprmPIlfo : '.$operand.PHP_EOL.PHP_EOL); + break; + default: + print_r('$sprm_IsPmd(1) : '.$sprm_IsPmd.PHP_EOL.PHP_EOL); + break; + } + break; + case 0x02: // Sprm is modifying a character property. + switch($sprm_IsPmd){ + default: + print_r('$sprm_IsPmd(2) : '.$sprm_IsPmd.PHP_EOL.PHP_EOL); + break; + } + break; + case 0x03: // Sprm is modifying a picture property. + switch($sprm_IsPmd){ + default: + print_r('$sprm_IsPmd(3) : '.$sprm_IsPmd.PHP_EOL.PHP_EOL); + break; + } + break; + case 0x04: // Sprm is modifying a section property. + switch($sprm_IsPmd){ + default: + print_r('$sprm_IsPmd(4) : '.$sprm_IsPmd.PHP_EOL.PHP_EOL); + break; + } + break; + case 0x05: // Sprm is modifying a table property. + switch($sprm_IsPmd){ + default: + print_r('$sprm_IsPmd(4) : '.$sprm_IsPmd.PHP_EOL.PHP_EOL); + break; + } + break; + default: + print_r('$sprm_Sgc : '.dechex($sprm_Sgc).PHP_EOL.PHP_EOL); + break; + } + } while($cb > 0); + } else { + if($istd > 0){ + // @todo : Determining Properties of a Paragraph Style + # @link http://msdn.microsoft.com/en-us/library/dd948631%28v=office.12%29.aspx + } + } + }*/ + } + } + + /** + * Character formatting properties to text in a document + * @link http://msdn.microsoft.com/en-us/library/dd907108%28v=office.12%29.aspx + */ + private function readRecordPlcfBteChpx(){ + $posMem = $this->arrayFib['fcPlcfBteChpx']; + $num = $this->getNumInLcb($this->arrayFib['lcbPlcfBteChpx'], 4); + $PlcBteChpx_aPnBteChpx = array(); + for($inc = 0 ; $inc <= $num ; $inc++){ + $PlcBteChpx_aPnBteChpx[$inc] = self::getInt4d($this->data1Table, $posMem); + $posMem += 4; + } + $PnFkpChpx = self::getInt4d($this->data1Table, $posMem); + $posMem += 4; + + $offsetBase = $PnFkpChpx * 512; + $offset = $offsetBase; + + // ChpxFkp + // @link : http://msdn.microsoft.com/en-us/library/dd910989%28v=office.12%29.aspx + $numRGFC = self::getInt1d($this->dataWorkDocument, $offset + 511); + $arrayRGFC = array(); + for($inc = 0 ; $inc <= $numRGFC ; $inc++){ + $arrayRGFC[$inc] = self::getInt4d($this->dataWorkDocument, $offset); + $offset += 4; + } + + $arrayRGB = array(); + for($inc = 1 ; $inc <= $numRGFC ; $inc++){ + $arrayRGB[$inc] = self::getInt1d($this->dataWorkDocument, $offset); + $offset += 1; + } + + $start = 0; + foreach ($arrayRGB as $keyRGB => $rgb) { + $oStyle = new \stdClass(); + $oStyle->pos_start = $start; + $oStyle->pos_len = (int)ceil((($arrayRGFC[$keyRGB] -1) - $arrayRGFC[$keyRGB -1]) / 2); + $start += $oStyle->pos_len; + + if($rgb > 0){ + // Chp Structure + // @link : http://msdn.microsoft.com/en-us/library/dd772849%28v=office.12%29.aspx + $posRGB = $offsetBase + $rgb * 2; + + $cb = self::getInt1d($this->dataWorkDocument, $posRGB); + $posRGB += 1; + + $oStyle->style = $this->readPrl($this->dataWorkDocument, $posRGB, $cb); + $posRGB += $oStyle->style->length; + } + $this->arrayCharacters[] = $oStyle; + } + } + + /** + * @param $sprm + * @return \stdClass + */ + private function readSprm($sprm) + { + $oSprm = new \stdClass(); + $oSprm->isPmd = $sprm & 0x01FF; + $oSprm->f = ($sprm / 512) & 0x0001; + $oSprm->sgc = ($sprm / 1024) & 0x0007; + $oSprm->spra = ($sprm / 8192); + return $oSprm; + } + + /** + * @param string $data + * @param integer $pos + * @param \stdClass $oSprm + * @return array + */ + private function readSprmSpra($data, $pos, $oSprm) + { + $length = 0; + $operand = null; + + switch(dechex($oSprm->spra)){ + case 0x0: + $operand = self::getInt1d($data, $pos); + $length = 1; + switch(dechex($operand)){ + case 0x00: + $operand = false; + break; + case 0x01: + $operand = true; + break; + case 0x80: + $operand = self::SPRA_VALUE; + break; + case 0x81: + $operand = self::SPRA_VALUE_OPPOSITE; + break; + } + break; + case 0x1: + $operand = self::getInt1d($data, $pos); + $length = 1; + break; + case 0x2: + case 0x4: + case 0x5: + $operand = self::getInt2d($data, $pos); + $length = 2; + break; + case 0x3: + if($oSprm->isPmd != 0x70){ + $operand = self::getInt4d($data, $pos); + $length = 4; + } + break; + case 0x7: + $operand = self::_GetInt3d($data, $pos); + $length = 3; + break; + default: + // print_r('YO YO YO : '.PHP_EOL); + } + + return array( + 'length' => $length, + 'operand' => $operand, + ); + } + + /** + * @param $data integer + * @param $pos integer + * @return \stdClass + * @link http://msdn.microsoft.com/en-us/library/dd772849%28v=office.12%29.aspx + */ + private function readPrl($data, $pos, $cb) + { + $posStart = $pos; + $oStylePrl = new \stdClass(); + + // Variables + $sprmCPicLocation = null; + $sprmCFData = null; + $sprmCFSpec = null; + + do { + // Variables + $operand = null; + + $sprm = self::getInt2d($data, $pos); + $oSprm = $this->readSprm($sprm); + $pos += 2; + $cb -= 2; + + $arrayReturn = $this->readSprmSpra($data, $pos, $oSprm); + $pos += $arrayReturn['length']; + $cb -= $arrayReturn['length']; + $operand = $arrayReturn['operand']; + + switch(dechex($oSprm->sgc)){ + // Paragraph property + case 0x01: + break; + // Character property + case 0x02: + if(!isset($oStylePrl->styleFont)) { + $oStylePrl->styleFont = array(); + } + switch($oSprm->isPmd){ + // sprmCFRMarkIns + case 0x01: + break; + // sprmCFFldVanish + case 0x02: + break; + // sprmCPicLocation + case 0x03: + $sprmCPicLocation = $operand; + break; + // sprmCFData + case 0x06: + $sprmCFData = dechex($operand) == 0x00 ? false : true; + break; + // sprmCFItalic + case 0x36: + // By default, text is not italicized. + switch($operand) { + case false: + case true: + $oStylePrl->styleFont['italic'] = $operand; + break; + case self::SPRA_VALUE: + $oStylePrl->styleFont['italic'] = false; + break; + case self::SPRA_VALUE_OPPOSITE: + $oStylePrl->styleFont['italic'] = true; + break; + } + break; + // sprmCIstd + case 0x30: + //print_r('sprmCIstd : '.dechex($operand).PHP_EOL.PHP_EOL); + break; + // sprmCFBold + case 0x35: + // By default, text is not bold. + switch($operand) { + case false: + case true: + $oStylePrl->styleFont['bold'] = $operand; + break; + case self::SPRA_VALUE: + $oStylePrl->styleFont['bold'] = false; + break; + case self::SPRA_VALUE_OPPOSITE: + $oStylePrl->styleFont['bold'] = true; + break; + } + break; + // sprmCFStrike + case 0x37: + // By default, text is not struck through. + switch($operand) { + case false: + case true: + $oStylePrl->styleFont['strikethrough'] = $operand; + break; + case self::SPRA_VALUE: + $oStylePrl->styleFont['strikethrough'] = false; + break; + case self::SPRA_VALUE_OPPOSITE: + $oStylePrl->styleFont['strikethrough'] = true; + break; + } + break; + // sprmCKul + case 0x3E: + switch(dechex($operand)){ + case 0x00: + $oStylePrl->styleFont['underline'] = Style\Font::UNDERLINE_NONE; + break; + case 0x01: + $oStylePrl->styleFont['underline'] = Style\Font::UNDERLINE_SINGLE; + break; + case 0x02: + $oStylePrl->styleFont['underline'] = Style\Font::UNDERLINE_WORDS; + break; + case 0x03: + $oStylePrl->styleFont['underline'] = Style\Font::UNDERLINE_DOUBLE; + break; + case 0x04: + $oStylePrl->styleFont['underline'] = Style\Font::UNDERLINE_DOTTED; + break; + case 0x06: + $oStylePrl->styleFont['underline'] = Style\Font::UNDERLINE_HEAVY; + break; + case 0x07: + $oStylePrl->styleFont['underline'] = Style\Font::UNDERLINE_DASH; + break; + case 0x09: + $oStylePrl->styleFont['underline'] = Style\Font::UNDERLINE_DOTHASH; + break; + case 0x0A: + $oStylePrl->styleFont['underline'] = Style\Font::UNDERLINE_DOTDOTDASH; + break; + case 0x0B: + $oStylePrl->styleFont['underline'] = Style\Font::UNDERLINE_WAVY; + break; + case 0x14: + $oStylePrl->styleFont['underline'] = Style\Font::UNDERLINE_DOTTEDHEAVY; + break; + case 0x17: + $oStylePrl->styleFont['underline'] = Style\Font::UNDERLINE_DASHHEAVY; + break; + case 0x19: + $oStylePrl->styleFont['underline'] = Style\Font::UNDERLINE_DOTHASHHEAVY; + break; + case 0x1A: + $oStylePrl->styleFont['underline'] = Style\Font::UNDERLINE_DOTDOTDASHHEAVY; + break; + case 0x1B: + $oStylePrl->styleFont['underline'] = Style\Font::UNDERLINE_WAVYHEAVY; + break; + case 0x27: + $oStylePrl->styleFont['underline'] = Style\Font::UNDERLINE_DASHLONG; + break; + case 0x2B: + $oStylePrl->styleFont['underline'] = Style\Font::UNDERLINE_WAVYDOUBLE; + break; + case 0x37: + $oStylePrl->styleFont['underline'] = Style\Font::UNDERLINE_DASHLONGHEAVY; + break; + default: + $oStylePrl->styleFont['underline'] = Style\Font::UNDERLINE_NONE; + break; + } + break; + // sprmCIco + //@link http://msdn.microsoft.com/en-us/library/dd773060%28v=office.12%29.aspx + case 0x42: + switch(dechex($operand)){ + case 0x00: + case 0x01: + $oStylePrl->styleFont['color'] = '000000'; + break; + case 0x02: + $oStylePrl->styleFont['color'] = '0000FF'; + break; + case 0x03: + $oStylePrl->styleFont['color'] = '00FFFF'; + break; + case 0x04: + $oStylePrl->styleFont['color'] = '00FF00'; + break; + case 0x05: + $oStylePrl->styleFont['color'] = 'FF00FF'; + break; + case 0x06: + $oStylePrl->styleFont['color'] = 'FF0000'; + break; + case 0x07: + $oStylePrl->styleFont['color'] = 'FFFF00'; + break; + case 0x08: + $oStylePrl->styleFont['color'] = 'FFFFFF'; + break; + case 0x09: + $oStylePrl->styleFont['color'] = '000080'; + break; + case 0x0A: + $oStylePrl->styleFont['color'] = '008080'; + break; + case 0x0B: + $oStylePrl->styleFont['color'] = '008000'; + break; + case 0x0C: + $oStylePrl->styleFont['color'] = '800080'; + break; + case 0x0D: + $oStylePrl->styleFont['color'] = '800080'; + break; + case 0x0E: + $oStylePrl->styleFont['color'] = '808000'; + break; + case 0x0F: + $oStylePrl->styleFont['color'] = '808080'; + break; + case 0x10: + $oStylePrl->styleFont['color'] = 'C0C0C0'; + } + break; + // sprmCHps + case 0x43: + $oStylePrl->styleFont['size'] = dechex($operand/2); + break; + // sprmCIss + case 0x48: + if (!isset($oStylePrl->styleFont['superScript'])) { + $oStylePrl->styleFont['superScript'] = false; + } + if (!isset($oStylePrl->styleFont['subScript'])) { + $oStylePrl->styleFont['subScript'] = false; + } + switch (dechex($operand)) { + case 0x00: + // Normal text + break; + case 0x01: + $oStylePrl->styleFont['superScript'] = true; + break; + case 0x02: + $oStylePrl->styleFont['subScript'] = true; + break; + } + break; + // sprmCRgFtc0 + case 0x4F: + $oStylePrl->styleFont['name'] = ''; + if(isset($this->arrayFonts[$operand])) { + $oStylePrl->styleFont['name'] = $this->arrayFonts[$operand]['main']; + } + break; + // sprmCRgFtc1 + case 0x50: + // if the language for the text is an East Asian language + break; + // sprmCRgFtc2 + case 0x51: + // if the character falls outside the Unicode character range + break; + // sprmCFSpec + case 0x55: + $sprmCFSpec = $operand; + break; + // sprmCFtcBi + case 0x5E: + break; + // sprmCFItalicBi + case 0x5D: + break; + // sprmCHpsBi + case 0x61: + break; + // sprmCShd80 + //@link http://msdn.microsoft.com/en-us/library/dd923447%28v=office.12%29.aspx + case 0x66: + // $operand = self::getInt2d($data, $pos); + $pos += 2; + $cb -= 2; + // $ipat = ($operand >> 0) && bindec('111111'); + // $icoBack = ($operand >> 6) && bindec('11111'); + // $icoFore = ($operand >> 11) && bindec('11111'); + break; + // sprmCCv + //@link : http://msdn.microsoft.com/en-us/library/dd952824%28v=office.12%29.aspx + case 0x70: + $red = str_pad(dechex(self::getInt1d($this->dataWorkDocument, $pos)), 2, '0', STR_PAD_LEFT); + $pos += 1; + $green = str_pad(dechex(self::getInt1d($this->dataWorkDocument, $pos)), 2, '0', STR_PAD_LEFT); + $pos += 1; + $blue = str_pad(dechex(self::getInt1d($this->dataWorkDocument, $pos)), 2, '0', STR_PAD_LEFT); + $pos += 1; + $pos += 1; + $oStylePrl->styleFont['color'] = $red.$green.$blue; + $cb -= 4; + break; + default: + // print_r('@todo Character : 0x'.dechex($oSprm->isPmd)); + // print_r(PHP_EOL); + } + break; + // Picture property + case 0x03: + break; + // Section property + case 0x04: + if(!isset($oStylePrl->styleSection)) { + $oStylePrl->styleSection = array(); + } + switch($oSprm->isPmd){ + // sprmSNfcPgn + case 0x0E: + // numbering format used for page numbers + break; + // sprmSXaPage + case 0x1F: + $oStylePrl->styleSection['pageSizeW'] = $operand; + break; + // sprmSYaPage + case 0x20: + $oStylePrl->styleSection['pageSizeH'] = $operand; + break; + // sprmSDxaLeft + case 0x21: + $oStylePrl->styleSection['marginLeft'] = $operand; + break; + // sprmSDxaRight + case 0x22: + $oStylePrl->styleSection['marginRight'] = $operand; + break; + // sprmSDyaTop + case 0x23: + $oStylePrl->styleSection['marginTop'] = $operand; + break; + // sprmSDyaBottom + case 0x24: + $oStylePrl->styleSection['marginBottom'] = $operand; + break; + // sprmSFBiDi + case 0x28: + // RTL layout + break; + // sprmSDxtCharSpace + case 0x30: + // characpter pitch + break; + // sprmSDyaLinePitch + case 0x31: + // line height + break; + // sprmSClm + case 0x32: + // document grid mode + break; + // sprmSTextFlow + case 0x33: + // text flow + break; + default: + // print_r('@todo Section : 0x'.dechex($oSprm->isPmd)); + // print_r(PHP_EOL); + + } + break; + // Table property + case 0x05: + break; + } + } while($cb > 0); + + if (!is_null($sprmCPicLocation)) { + if (!is_null($sprmCFData) && $sprmCFData == 0x01) { + // NilPICFAndBinData + //@todo Read Hyperlink structure + /*$lcb = self::getInt4d($this->dataData, $sprmCPicLocation); + $sprmCPicLocation += 4; + $cbHeader = self::getInt2d($this->dataData, $sprmCPicLocation); + $sprmCPicLocation += 2; + // ignored + $sprmCPicLocation += 62; + // depending of the element + // Hyperlink => HFD + // HFD > bits + $sprmCPicLocation += 1; + // HFD > clsid + $sprmCPicLocation += 16; + // HFD > hyperlink + //@link : http://msdn.microsoft.com/en-us/library/dd909835%28v=office.12%29.aspx + $streamVersion = self::getInt4d($this->dataData, $sprmCPicLocation); + $sprmCPicLocation += 4; + $data = self::getInt4d($this->dataData, $sprmCPicLocation); + $sprmCPicLocation += 4; + $hlstmfAbsFromGetdataRel = ($data >> 9) & bindec('1'); + $hlstmfMonikerSavedAsStr = ($data >> 8) & bindec('1'); + $hlstmfHasFrameName = ($data >> 7) & bindec('1'); + $hlstmfHasCreationTime = ($data >> 6) & bindec('1'); + $hlstmfHasGUID = ($data >> 5) & bindec('1'); + $hlstmfHasDisplayName = ($data >> 4) & bindec('1'); + $hlstmfHasLocationStr = ($data >> 3) & bindec('1'); + $hlstmfSiteGaveDisplayName = ($data >> 2) & bindec('1'); + $hlstmfIsAbsolute = ($data >> 1) & bindec('1'); + $hlstmfHasMoniker = ($data >> 0) & bindec('1'); + for($inc = 0 ; $inc <= 32 ; $inc++){ + echo ($data >> $inc) & bindec('1'); + } + + print_r('$hlstmfHasMoniker > '.$hlstmfHasMoniker.PHP_EOL); + print_r('$hlstmfIsAbsolute > '.$hlstmfIsAbsolute.PHP_EOL); + print_r('$hlstmfSiteGaveDisplayName > '.$hlstmfSiteGaveDisplayName.PHP_EOL); + print_r('$hlstmfHasLocationStr > '.$hlstmfHasLocationStr.PHP_EOL); + print_r('$hlstmfHasDisplayName > '.$hlstmfHasDisplayName.PHP_EOL); + print_r('$hlstmfHasGUID > '.$hlstmfHasGUID.PHP_EOL); + print_r('$hlstmfHasCreationTime > '.$hlstmfHasCreationTime.PHP_EOL); + print_r('$hlstmfHasFrameName > '.$hlstmfHasFrameName.PHP_EOL); + print_r('$hlstmfMonikerSavedAsStr > '.$hlstmfMonikerSavedAsStr.PHP_EOL); + print_r('$hlstmfAbsFromGetdataRel > '.$hlstmfAbsFromGetdataRel.PHP_EOL); + if($streamVersion == 2){ + $AAA = self::getInt4d($this->dataData, $sprmCPicLocation); + echo 'AAAA : '.$AAA.PHP_EOL; + if($hlstmfHasDisplayName == 1){ + echo 'displayName'.PHP_EOL; + } + if($hlstmfHasFrameName == 1){ + echo 'targetFrameName'.PHP_EOL; + } + if($hlstmfHasMoniker == 1 || $hlstmfMonikerSavedAsStr == 1){ + $sprmCPicLocation += 16; + $length = self::getInt4d($this->dataData, $sprmCPicLocation); + $sprmCPicLocation += 4; + for($inc = 0 ; $inc < ($length / 2) ; $inc++) { + $chr = self::getInt2d($this->dataData, $sprmCPicLocation); + $sprmCPicLocation += 2; + print_r(chr($chr)); + } + echo PHP_EOL; + echo 'moniker : '.$length.PHP_EOL; + } + if($hlstmfHasMoniker == 1 || $hlstmfMonikerSavedAsStr == 1){ + echo 'oleMoniker'.PHP_EOL; + } + if($hlstmfHasLocationStr == 1){ + echo 'location'.PHP_EOL; + } + if($hlstmfHasGUID == 1) { + echo 'guid'.PHP_EOL; + $sprmCPicLocation += 16; + } + if($hlstmfHasCreationTime == 1) { + echo 'fileTime'.PHP_EOL; + $sprmCPicLocation += 4; + } + echo 'HYPERLINK'.PHP_EOL; + }*/ + } else { + // Pictures + //@link : http://msdn.microsoft.com/en-us/library/dd925458%28v=office.12%29.aspx + //@link : http://msdn.microsoft.com/en-us/library/dd926136%28v=office.12%29.aspx + // PICF : lcb + $sprmCPicLocation += 4; + // PICF : cbHeader + $sprmCPicLocation += 2; + // PICF : mfpf : mm + $mfpf_mm = self::getInt2d($this->dataData, $sprmCPicLocation); + $sprmCPicLocation += 2; + // PICF : mfpf : xExt + $sprmCPicLocation += 2; + // PICF : mfpf : yExt + $sprmCPicLocation += 2; + // PICF : mfpf : swHMF + $sprmCPicLocation += 2; + // PICF : innerHeader : grf + $sprmCPicLocation += 4; + // PICF : innerHeader : padding1 + $sprmCPicLocation += 4; + // PICF : innerHeader : mmPM + $sprmCPicLocation += 2; + // PICF : innerHeader : padding2 + $sprmCPicLocation += 4; + // PICF : picmid : dxaGoal + $picmid_dxaGoal = self::getInt2d($this->dataData, $sprmCPicLocation); + $sprmCPicLocation += 2; + // PICF : picmid : dyaGoal + $picmid_dyaGoal = self::getInt2d($this->dataData, $sprmCPicLocation); + $sprmCPicLocation += 2; + // PICF : picmid : mx + $picmid_mx = self::getInt2d($this->dataData, $sprmCPicLocation); + $sprmCPicLocation += 2; + // PICF : picmid : my + $picmid_my = self::getInt2d($this->dataData, $sprmCPicLocation); + $sprmCPicLocation += 2; + // PICF : picmid : dxaReserved1 + $picmid_dxaCropLeft = self::getInt2d($this->dataData, $sprmCPicLocation); + $sprmCPicLocation += 2; + // PICF : picmid : dyaReserved1 + $picmid_dxaCropTop = self::getInt2d($this->dataData, $sprmCPicLocation); + $sprmCPicLocation += 2; + // PICF : picmid : dxaReserved2 + $picmid_dxaCropRight = self::getInt2d($this->dataData, $sprmCPicLocation); + $sprmCPicLocation += 2; + // PICF : picmid : dyaReserved2 + $picmid_dxaCropBottom = self::getInt2d($this->dataData, $sprmCPicLocation); + $sprmCPicLocation += 2; + // PICF : picmid : fReserved + $sprmCPicLocation += 1; + // PICF : picmid : bpp + $sprmCPicLocation += 1; + // PICF : picmid : brcTop80 + $sprmCPicLocation += 4; + // PICF : picmid : brcLeft80 + $sprmCPicLocation += 4; + // PICF : picmid : brcBottom80 + $sprmCPicLocation += 4; + // PICF : picmid : brcRight80 + $sprmCPicLocation += 4; + // PICF : picmid : dxaReserved3 + $sprmCPicLocation += 2; + // PICF : picmid : dyaReserved3 + $sprmCPicLocation += 2; + // PICF : cProps + $sprmCPicLocation += 2; + + if ($mfpf_mm == 0x0066) { + // cchPicName + $cchPicName = self::getInt1d($this->dataData, $sprmCPicLocation); + $sprmCPicLocation += 1; + + // stPicName + $stPicName = ''; + for($inc = 0; $inc <= $cchPicName; $inc++){ + $chr = self::getInt1d($this->dataData, $sprmCPicLocation); + $sprmCPicLocation += 1; + $stPicName .= chr($chr); + } + } + + // picture (OfficeArtInlineSpContainer) + // picture : shape + $shapeRH = $this->loadRecordHeader($this->dataData, $sprmCPicLocation); + $sprmCPicLocation += 8; + if($shapeRH['recVer'] == 0xF && $shapeRH['recInstance'] == 0x000 && $shapeRH['recType'] == 0xF004){ + $sprmCPicLocation += $shapeRH['recLen']; + } + // picture : rgfb + //@link : http://msdn.microsoft.com/en-us/library/dd950560%28v=office.12%29.aspx + $fileBlockRH = $this->loadRecordHeader($this->dataData, $sprmCPicLocation); + while ($fileBlockRH['recType'] == 0xF007 || ($fileBlockRH['recType'] >= 0xF018 && $fileBlockRH['recType'] <= 0xF117)){ + $sprmCPicLocation += 8; + switch ($fileBlockRH['recType']) { + // OfficeArtFBSE + //@link : http://msdn.microsoft.com/en-us/library/dd944923%28v=office.12%29.aspx + case 0xF007: + // btWin32 + $sprmCPicLocation += 1; + // btMacOS + $sprmCPicLocation += 1; + // rgbUid + $sprmCPicLocation += 16; + // tag + $sprmCPicLocation += 2; + // size + $sprmCPicLocation += 4; + // cRef + $sprmCPicLocation += 4; + // foDelay + $sprmCPicLocation += 4; + // unused1 + $sprmCPicLocation += 1; + // cbName + $cbName = self::getInt1d($this->dataData, $sprmCPicLocation); + $sprmCPicLocation += 1; + // unused2 + $sprmCPicLocation += 1; + // unused3 + $sprmCPicLocation += 1; + // nameData + if ($cbName > 0) { + $nameData = ''; + for($inc = 0; $inc <= ($cbName / 2); $inc++){ + $chr = self::getInt2d($this->dataData, $sprmCPicLocation); + $sprmCPicLocation += 2; + $nameData .= chr($chr); + } + } + // embeddedBlip + //@link : http://msdn.microsoft.com/en-us/library/dd910081%28v=office.12%29.aspx + $embeddedBlipRH = $this->loadRecordHeader($this->dataData, $sprmCPicLocation); + switch ($embeddedBlipRH['recType']) { + case self::OFFICEARTBLIPJPG: + case self::OFFICEARTBLIPJPEG: + if(!isset($oStylePrl->image)){ + $oStylePrl->image = array(); + } + $sprmCPicLocation += 8; + // embeddedBlip : rgbUid1 + $sprmCPicLocation += 16; + if ($embeddedBlipRH['recInstance'] == 0x6E1) { + // rgbUid2 + $sprmCPicLocation += 16; + } + // embeddedBlip : tag + $sprmCPicLocation += 1; + // embeddedBlip : BLIPFileData + $oStylePrl->image['data'] = substr($this->dataData, $sprmCPicLocation, $embeddedBlipRH['recLen']); + $oStylePrl->image['format'] = 'jpg'; + // Image Size + $iCropWidth = $picmid_dxaGoal - ($picmid_dxaCropLeft + $picmid_dxaCropRight); + $iCropHeight = $picmid_dyaGoal - ($picmid_dxaCropTop + $picmid_dxaCropBottom); + if (!$iCropWidth){ + $iCropWidth = 1; + } + if (!$iCropHeight){ + $iCropHeight = 1; + } + $oStylePrl->image['width'] = Drawing::twipsToPixels($iCropWidth * $picmid_mx / 1000); + $oStylePrl->image['height'] = Drawing::twipsToPixels($iCropHeight * $picmid_my / 1000); + + $sprmCPicLocation += $embeddedBlipRH['recLen']; + break; + default: + // print_r(dechex($embeddedBlipRH['recType'])); + } + break; + } + $fileBlockRH = $this->loadRecordHeader($this->dataData, $sprmCPicLocation); + } + } + } + + $oStylePrl->length = $pos - $posStart; + return $oStylePrl; + } + + /** + * Read a record header + * @param string $stream + * @param integer $pos + * @return array + */ + private function loadRecordHeader($stream, $pos) + { + $rec = self::getInt2d($stream, $pos); + $recType = self::getInt2d($stream, $pos + 2); + $recLen = self::getInt4d($stream, $pos + 4); + return array( + 'recVer' => ($rec >> 0) & bindec('1111'), + 'recInstance' => ($rec >> 4) & bindec('111111111111'), + 'recType' => $recType, + 'recLen' => $recLen, + ); + } + + private function generatePhpWord() + { + foreach ($this->arraySections as $itmSection) { + $oSection = $this->phpWord->addSection(); + $oSection->setSettings($itmSection->styleSection); + + $sHYPERLINK = ''; + foreach ($this->arrayParagraphs as $itmParagraph) { + $textPara = $itmParagraph; + foreach ($this->arrayCharacters as $keyCharacters => $oCharacters) { + $subText = substr($textPara, $oCharacters->pos_start, $oCharacters->pos_len); + $subText = str_replace(chr(13), PHP_EOL, $subText); + $arrayText = explode(PHP_EOL, $subText); + if (end($arrayText) == '') { + array_pop($arrayText); + } + if (reset($arrayText) == '') { + array_shift($arrayText); + } + + // Style Character + $styleFont = array(); + if(isset($oCharacters->style)){ + if(isset($oCharacters->style->styleFont)){ + $styleFont = $oCharacters->style->styleFont; + } + } + + foreach ($arrayText as $sText) { + // HyperLink + if(empty($sText) && !empty($sHYPERLINK)) { + $arrHYPERLINK = explode('"', $sHYPERLINK); + $oSection->addLink($arrHYPERLINK[1], null); + // print_r('>addHyperLink<'.$sHYPERLINK.'>'.ord($sHYPERLINK[0]).EOL); + $sHYPERLINK = ''; + } + + // TextBreak + if(empty($sText)) { + $oSection->addTextBreak(); + $sHYPERLINK = ''; + // print_r('>addTextBreak<' . EOL); + } + + if(!empty($sText)){ + if(!empty($sHYPERLINK) && ord($sText[0]) > 20){ + $sHYPERLINK .= $sText; + } + if(empty($sHYPERLINK)) { + if(ord($sText[0]) > 20){ + if(strpos(trim($sText), 'HYPERLINK "') === 0){ + $sHYPERLINK = $sText; + } else { + $oSection->addText($sText, $styleFont); + // print_r('>addText<'.$sText.'>'.ord($sText[0]).EOL); + } + } + if(ord($sText[0]) == 1) { + if(isset($oCharacters->style->image)){ + $fileImage = tempnam(sys_get_temp_dir(), 'PHPWord_MsDoc').'.'.$oCharacters->style->image['format']; + file_put_contents($fileImage, $oCharacters->style->image['data']); + $oSection->addImage($fileImage, array('width' => $oCharacters->style->image['width'], 'height' => $oCharacters->style->image['height'])); + // print_r('>addImage<'.$fileImage.'>'.EOL); + } + } + } + } + } + } + } + + } } /** @@ -1378,7 +2283,7 @@ class MsDoc extends AbstractReader implements ReaderInterface * @param int $pos * @return int */ - public static function _GetInt1d($data, $pos) + public static function getInt1d($data, $pos) { return ord($data[$pos]); } @@ -1390,11 +2295,23 @@ class MsDoc extends AbstractReader implements ReaderInterface * @param int $pos * @return int */ - public static function _GetInt2d($data, $pos) + public static function getInt2d($data, $pos) { return ord($data[$pos]) | (ord($data[$pos+1]) << 8); } + /** + * Read 24-bit signed integer + * + * @param string $data + * @param int $pos + * @return int + */ + public static function _GetInt3d($data, $pos) + { + return ord($data[$pos]) | (ord($data[$pos+1]) << 8) | (ord($data[$pos+2]) << 16); + } + /** * Read 32-bit signed integer * @@ -1402,7 +2319,7 @@ class MsDoc extends AbstractReader implements ReaderInterface * @param int $pos * @return int */ - public static function _GetInt4d($data, $pos) + public static function getInt4d($data, $pos) { // FIX: represent numbers correctly on 64-bit system // http://sourceforge.net/tracker/index.php?func=detail&aid=1487372&group_id=99160&atid=623334 diff --git a/src/PhpWord/Shared/Drawing.php b/src/PhpWord/Shared/Drawing.php index 58a6ee1a..85ce595f 100644 --- a/src/PhpWord/Shared/Drawing.php +++ b/src/PhpWord/Shared/Drawing.php @@ -118,6 +118,76 @@ class Drawing } } + /** + * Convert centimeters width to twips + * + * @param integer $pValue + */ + public static function centimetersToTwips($pValue = 0) + { + if ($pValue != 0) { + return $pValue * 566.928; + } else { + return 0; + } + } + + /** + * Convert twips width to centimeters + * + * @param integer $pValue + */ + public static function twipsToCentimeters($pValue = 0) + { + if ($pValue != 0) { + return $pValue / 566.928; + } else { + return 0; + } + } + + /** + * Convert inches width to twips + * + * @param integer $pValue + */ + public static function inchesToTwips($pValue = 0) + { + if ($pValue != 0) { + return $pValue * 1440; + } else { + return 0; + } + } + + /** + * Convert twips width to inches + * + * @param integer $pValue + */ + public static function twipsToInches($pValue = 0) + { + if ($pValue != 0) { + return $pValue / 1440; + } else { + return 0; + } + } + + /** + * Convert twips width to pixels + * + * @param integer $pValue + */ + public static function twipsToPixels($pValue = 0) + { + if ($pValue != 0) { + return round($pValue / 15.873984); + } else { + return 0; + } + } + /** * Convert HTML hexadecimal to RGB * diff --git a/src/PhpWord/Style/Font.php b/src/PhpWord/Style/Font.php index dd8ff02a..149f7c54 100644 --- a/src/PhpWord/Style/Font.php +++ b/src/PhpWord/Style/Font.php @@ -225,7 +225,6 @@ class Font extends AbstractStyle return $this; } - /** * Get font size * From 4ade9c3c6e56bef45addd73d741a1125fe66ce3e Mon Sep 17 00:00:00 2001 From: Progi1984 Date: Sat, 16 Aug 2014 12:33:37 +0200 Subject: [PATCH 4/6] #23 : Implement Word97 aka MsDoc Reader (PHPCS-PHPMD Fixes) --- samples/Sample_Footer.php | 3 + src/PhpWord/IOFactory.php | 34 ++++- src/PhpWord/Reader/MsDoc.php | 229 +++++++++++++++++---------------- src/PhpWord/Shared/Drawing.php | 14 +- src/PhpWord/Shared/OLERead.php | 129 ++++++++++--------- 5 files changed, 223 insertions(+), 186 deletions(-) diff --git a/samples/Sample_Footer.php b/samples/Sample_Footer.php index f7e2305f..95ac693f 100644 --- a/samples/Sample_Footer.php +++ b/samples/Sample_Footer.php @@ -2,6 +2,9 @@ /** * Footer file */ +if (CLI) { + return; +} ?> diff --git a/src/PhpWord/IOFactory.php b/src/PhpWord/IOFactory.php index 599153c2..f3808f72 100644 --- a/src/PhpWord/IOFactory.php +++ b/src/PhpWord/IOFactory.php @@ -48,20 +48,46 @@ abstract class IOFactory return self::createObject('Reader', $name); } - $fqName = "PhpOffice\\PhpWord\\Reader\\{$name}"; - return new $fqName(); + /** + * Create new object + * + * @param string $type + * @param string $name + * @param \PhpOffice\PhpWord\PhpWord $phpWord + * @return \PhpOffice\PhpWord\Writer\WriterInterface|\PhpOffice\PhpWord\Reader\ReaderInterface + * @throws \PhpOffice\PhpWord\Exception\Exception + */ + private static function createObject($type, $name, $phpWord = null) + { + $class = "PhpOffice\\PhpWord\\{$type}\\{$name}"; + if (class_exists($class) && self::isConcreteClass($class)) { + return new $class($phpWord); + } else { + throw new Exception("\"{$name}\" is not a valid {$type}."); + } } - /** * Loads PhpWord from file * * @param string $filename The name of the file * @param string $readerName - * @return PhpWord + * @return \PhpOffice\PhpWord\PhpWord $phpWord */ public static function load($filename, $readerName = 'Word2007') { + /** @var \PhpOffice\PhpWord\Reader\ReaderInterface $reader */ $reader = self::createReader($readerName); return $reader->load($filename); } + /** + * Check if it's a concrete class (not abstract nor interface) + * + * @param string $class + * @return bool + */ + private static function isConcreteClass($class) + { + $reflection = new \ReflectionClass($class); + return !$reflection->isAbstract() && !$reflection->isInterface(); + } } diff --git a/src/PhpWord/Reader/MsDoc.php b/src/PhpWord/Reader/MsDoc.php index 5c362621..d3f5a44b 100644 --- a/src/PhpWord/Reader/MsDoc.php +++ b/src/PhpWord/Reader/MsDoc.php @@ -144,13 +144,15 @@ class MsDoc extends AbstractReader implements ReaderInterface $this->_DocumentSummaryInformation = $ole->getStream($ole->documentSummaryInformation); } - private function getNumInLcb($lcb, $iSize){ + private function getNumInLcb($lcb, $iSize) + { return ($lcb - 4) / (4 + $iSize); } - private function getArrayCP($data, $posMem, $iNum){ + private function getArrayCP($data, $posMem, $iNum) + { $arrayCP = array(); - for($inc = 0 ; $inc < $iNum ; $inc++){ + for ($inc = 0; $inc < $iNum; $inc++) { $arrayCP[$inc] = self::getInt4d($data, $posMem); $posMem += 4; } @@ -334,7 +336,7 @@ class MsDoc extends AbstractReader implements ReaderInterface $this->arrayFib['cswNew'] = self::getInt2d($data, $pos); $pos += 2; - if($this->arrayFib['cswNew'] != 0){ + if ($this->arrayFib['cswNew'] != 0) { //@todo : fibRgCswNew } @@ -343,7 +345,7 @@ class MsDoc extends AbstractReader implements ReaderInterface private function readBlockFibRgFcLcb($data, $pos, $version) { - if($version == self::VERSION_97){ + if ($version == self::VERSION_97) { $this->arrayFib['fcStshfOrig'] = self::getInt4d($data, $pos); $pos += 4; $this->arrayFib['lcbStshfOrig'] = self::getInt4d($data, $pos); @@ -717,7 +719,7 @@ class MsDoc extends AbstractReader implements ReaderInterface $this->arrayFib['lcbSttbfUssr'] = self::getInt4d($data, $pos); $pos += 4; } - if($version == self::VERSION_2000){ + if ($version == self::VERSION_2000) { $this->arrayFib['fcPlcfTch'] = self::getInt4d($data, $pos); $pos += 4; $this->arrayFib['lcbPlcfTch'] = self::getInt4d($data, $pos); @@ -779,7 +781,7 @@ class MsDoc extends AbstractReader implements ReaderInterface $this->arrayFib['lcbBkdEdnOld'] = self::getInt4d($data, $pos); $pos += 4; } - if($version == self::VERSION_2002){ + if ($version == self::VERSION_2002) { $this->arrayFib['fcUnused1'] = self::getInt4d($data, $pos); $pos += 4; $this->arrayFib['lcbUnused1'] = self::getInt4d($data, $pos); @@ -893,7 +895,7 @@ class MsDoc extends AbstractReader implements ReaderInterface $this->arrayFib['lcbPlcflvcMixedXP'] = self::getInt4d($data, $pos); $pos += 4; } - if($version == self::VERSION_2003){ + if ($version == self::VERSION_2003) { $this->arrayFib['fcHplxsdr'] = self::getInt4d($data, $pos); $pos += 4; $this->arrayFib['lcbHplxsdr'] = self::getInt4d($data, $pos); @@ -1007,7 +1009,7 @@ class MsDoc extends AbstractReader implements ReaderInterface $this->arrayFib['lcbAfd'] = self::getInt4d($data, $pos); $pos += 4; } - if($version == self::VERSION_2007){ + if ($version == self::VERSION_2007) { $this->arrayFib['fcPlcfmthd'] = self::getInt4d($data, $pos); $pos += 4; $this->arrayFib['lcbPlcfmthd'] = self::getInt4d($data, $pos); @@ -1111,7 +1113,8 @@ class MsDoc extends AbstractReader implements ReaderInterface * Section and information about them * @link : http://msdn.microsoft.com/en-us/library/dd924458%28v=office.12%29.aspx */ - private function readRecordPlcfSed(){ + private function readRecordPlcfSed() + { $posMem = $this->arrayFib['fcPlcfSed']; // PlcfSed // PlcfSed : aCP @@ -1126,7 +1129,7 @@ class MsDoc extends AbstractReader implements ReaderInterface $numSed = $this->getNumInLcb($this->arrayFib['lcbPlcfSed'], 12); $aSed = array(); - for($iInc = 0 ; $iInc < $numSed ; ++$iInc){ + for ($iInc = 0; $iInc < $numSed; ++$iInc) { // Sed : http://msdn.microsoft.com/en-us/library/dd950982%28v=office.12%29.aspx // fn $posMem += 2; @@ -1139,7 +1142,7 @@ class MsDoc extends AbstractReader implements ReaderInterface $posMem += 4; } - foreach($aSed as $keySed => $offsetSed){ + foreach ($aSed as $offsetSed) { // Sepx : http://msdn.microsoft.com/en-us/library/dd921348%28v=office.12%29.aspx $cb = self::getInt2d($this->dataWorkDocument, $offsetSed); $offsetSed += 2; @@ -1186,17 +1189,17 @@ class MsDoc extends AbstractReader implements ReaderInterface do { $char = self::getInt2d($this->data1Table, $posMem); $posMem += 2; - if($char > 0) { + if ($char > 0) { $xszFfn .= chr($char); } } while ($char != 0); // xszAlt $xszAlt = ''; - if($ixchSzAlt > 0) { + if ($ixchSzAlt > 0) { do { $char = self::getInt2d($this->data1Table, $posMem); $posMem += 2; - if($char == 0) { + if ($char == 0) { break; } $xszAlt .= chr($char); @@ -1214,14 +1217,15 @@ class MsDoc extends AbstractReader implements ReaderInterface * Paragraph and information about them * @link http://msdn.microsoft.com/en-us/library/dd908569%28v=office.12%29.aspx */ - private function readRecordPlcfBtePapx(){ + private function readRecordPlcfBtePapx() + { $posMem = $this->arrayFib['fcPlcfBtePapx']; $num = $this->getNumInLcb($this->arrayFib['lcbPlcfBtePapx'], 4); $posMem += 4 * ($num + 1); - $plcfBtePapx_aPnBtePapx = $this->getArrayCP($this->data1Table, $posMem, $num); + $arrAPnBtePapx = $this->getArrayCP($this->data1Table, $posMem, $num); $posMem += 4 * $num; - foreach($plcfBtePapx_aPnBtePapx as $aPnBtePapx){ + foreach ($arrAPnBtePapx as $aPnBtePapx) { $offsetBase = $aPnBtePapx * 512; $offset = $offsetBase; @@ -1229,12 +1233,12 @@ class MsDoc extends AbstractReader implements ReaderInterface $numRun = self::getInt1d($this->dataWorkDocument, $offset + 511); $arrayRGFC = array(); - for($inc = 0 ; $inc <= $numRun ; $inc++){ + for ($inc = 0; $inc <= $numRun; $inc++) { $arrayRGFC[$inc] = self::getInt4d($this->dataWorkDocument, $offset); $offset += 4; } $arrayRGB = array(); - for($inc = 1 ; $inc <= $numRun ; $inc++){ + for ($inc = 1; $inc <= $numRun; $inc++) { // @link http://msdn.microsoft.com/en-us/library/dd925804(v=office.12).aspx $arrayRGB[$inc] = self::getInt1d($this->dataWorkDocument, $offset); $offset += 1; @@ -1242,14 +1246,14 @@ class MsDoc extends AbstractReader implements ReaderInterface $offset += 12; } - foreach ($arrayRGFC as $key => $rgFc) { - if(!isset($arrayRGFC[$key + 1])){ + foreach (array_keys($arrayRGFC) as $key) { + if (!isset($arrayRGFC[$key + 1])) { break; } $strLen = $arrayRGFC[$key + 1] - $arrayRGFC[$key] - 1; for ($inc = 0; $inc < $strLen; $inc++) { $byte = self::getInt1d($this->dataWorkDocument, $arrayRGFC[$key] + $inc); - if($byte > 0) { + if ($byte > 0) { $string .= chr($byte); } } @@ -1264,7 +1268,7 @@ class MsDoc extends AbstractReader implements ReaderInterface $cb = self::getInt1d($this->dataWorkDocument, $offset); $offset += 1; print_r('$cb : '.$cb.PHP_EOL); - if($cb == 0){ + if ($cb == 0) { $cb = self::getInt1d($this->dataWorkDocument, $offset); $cb = $cb * 2; $offset += 1; @@ -1277,7 +1281,7 @@ class MsDoc extends AbstractReader implements ReaderInterface $offset += 2; $cb -= 2; print_r('$istd : '.$istd.($istd == 0 ? ' (Normal)' : '').PHP_EOL); - if($cb > 0){ + if ($cb > 0) { do{ $sprm = self::getInt2d($this->dataWorkDocument, $offset); $offset += 2; @@ -1291,7 +1295,7 @@ class MsDoc extends AbstractReader implements ReaderInterface print_r('$sprm.ispmd : 0x'.dechex($sprm_IsPmd).PHP_EOL); print_r('$sprm.f : 0x'.dechex($sprm_F).PHP_EOL); print_r('$sprm.sgc : 0x'.dechex($sprm_Sgc)); - switch(dechex($sprm_Sgc)){ + switch(dechex($sprm_Sgc)) { case 0x01: print_r(' (Paragraph property)'); break; @@ -1310,12 +1314,12 @@ class MsDoc extends AbstractReader implements ReaderInterface } print_r(PHP_EOL); print_r('$sprm.spra : 0x'.dechex($sprm_Spra).PHP_EOL); - switch(dechex($sprm_Spra)){ + switch(dechex($sprm_Spra)) { case 0x0: $operand = self::getInt1d($this->dataWorkDocument, $offset); $offset += 1; $cb -= 1; - switch(dechex($operand)){ + switch(dechex($operand)) { case 0x00: $operand = 'OFF'; break; @@ -1346,7 +1350,7 @@ class MsDoc extends AbstractReader implements ReaderInterface print_r('$operand : 0x'.dechex($operand).PHP_EOL); break; case 0x3: - if($sprm_IsPmd != 0x70){ + if ($sprm_IsPmd != 0x70) { $operand = self::getInt4d($this->dataWorkDocument, $offset); $offset += 4; $cb -= 4; @@ -1354,7 +1358,7 @@ class MsDoc extends AbstractReader implements ReaderInterface } break; case 0x7: - $operand = self::_GetInt3d($this->dataWorkDocument, $offset); + $operand = self::getInt3d($this->dataWorkDocument, $offset); $offset += 3; $cb -= 3; print_r('$operand : 0x'.dechex($operand).PHP_EOL); @@ -1364,9 +1368,9 @@ class MsDoc extends AbstractReader implements ReaderInterface } // - switch(dechex($sprm_Sgc)){ + switch(dechex($sprm_Sgc)) { case 0x01: // Sprm is modifying a paragraph property. - switch($sprm_IsPmd){ + switch($sprm_IsPmd) { case 0x0A: // sprmPIlvl print_r('sprmPIlvl : '.$operand.PHP_EOL.PHP_EOL); break; @@ -1379,28 +1383,28 @@ class MsDoc extends AbstractReader implements ReaderInterface } break; case 0x02: // Sprm is modifying a character property. - switch($sprm_IsPmd){ + switch($sprm_IsPmd) { default: print_r('$sprm_IsPmd(2) : '.$sprm_IsPmd.PHP_EOL.PHP_EOL); break; } break; case 0x03: // Sprm is modifying a picture property. - switch($sprm_IsPmd){ + switch($sprm_IsPmd) { default: print_r('$sprm_IsPmd(3) : '.$sprm_IsPmd.PHP_EOL.PHP_EOL); break; } break; case 0x04: // Sprm is modifying a section property. - switch($sprm_IsPmd){ + switch($sprm_IsPmd) { default: print_r('$sprm_IsPmd(4) : '.$sprm_IsPmd.PHP_EOL.PHP_EOL); break; } break; case 0x05: // Sprm is modifying a table property. - switch($sprm_IsPmd){ + switch($sprm_IsPmd) { default: print_r('$sprm_IsPmd(4) : '.$sprm_IsPmd.PHP_EOL.PHP_EOL); break; @@ -1410,9 +1414,9 @@ class MsDoc extends AbstractReader implements ReaderInterface print_r('$sprm_Sgc : '.dechex($sprm_Sgc).PHP_EOL.PHP_EOL); break; } - } while($cb > 0); + } while ($cb > 0); } else { - if($istd > 0){ + if ($istd > 0) { // @todo : Determining Properties of a Paragraph Style # @link http://msdn.microsoft.com/en-us/library/dd948631%28v=office.12%29.aspx } @@ -1425,12 +1429,13 @@ class MsDoc extends AbstractReader implements ReaderInterface * Character formatting properties to text in a document * @link http://msdn.microsoft.com/en-us/library/dd907108%28v=office.12%29.aspx */ - private function readRecordPlcfBteChpx(){ + private function readRecordPlcfBteChpx() + { $posMem = $this->arrayFib['fcPlcfBteChpx']; $num = $this->getNumInLcb($this->arrayFib['lcbPlcfBteChpx'], 4); - $PlcBteChpx_aPnBteChpx = array(); - for($inc = 0 ; $inc <= $num ; $inc++){ - $PlcBteChpx_aPnBteChpx[$inc] = self::getInt4d($this->data1Table, $posMem); + $aPnBteChpx = array(); + for ($inc = 0; $inc <= $num; $inc++) { + $aPnBteChpx[$inc] = self::getInt4d($this->data1Table, $posMem); $posMem += 4; } $PnFkpChpx = self::getInt4d($this->data1Table, $posMem); @@ -1443,13 +1448,13 @@ class MsDoc extends AbstractReader implements ReaderInterface // @link : http://msdn.microsoft.com/en-us/library/dd910989%28v=office.12%29.aspx $numRGFC = self::getInt1d($this->dataWorkDocument, $offset + 511); $arrayRGFC = array(); - for($inc = 0 ; $inc <= $numRGFC ; $inc++){ + for ($inc = 0; $inc <= $numRGFC; $inc++) { $arrayRGFC[$inc] = self::getInt4d($this->dataWorkDocument, $offset); $offset += 4; } $arrayRGB = array(); - for($inc = 1 ; $inc <= $numRGFC ; $inc++){ + for ($inc = 1; $inc <= $numRGFC; $inc++) { $arrayRGB[$inc] = self::getInt1d($this->dataWorkDocument, $offset); $offset += 1; } @@ -1461,7 +1466,7 @@ class MsDoc extends AbstractReader implements ReaderInterface $oStyle->pos_len = (int)ceil((($arrayRGFC[$keyRGB] -1) - $arrayRGFC[$keyRGB -1]) / 2); $start += $oStyle->pos_len; - if($rgb > 0){ + if ($rgb > 0) { // Chp Structure // @link : http://msdn.microsoft.com/en-us/library/dd772849%28v=office.12%29.aspx $posRGB = $offsetBase + $rgb * 2; @@ -1501,11 +1506,11 @@ class MsDoc extends AbstractReader implements ReaderInterface $length = 0; $operand = null; - switch(dechex($oSprm->spra)){ + switch(dechex($oSprm->spra)) { case 0x0: $operand = self::getInt1d($data, $pos); $length = 1; - switch(dechex($operand)){ + switch(dechex($operand)) { case 0x00: $operand = false; break; @@ -1531,13 +1536,13 @@ class MsDoc extends AbstractReader implements ReaderInterface $length = 2; break; case 0x3: - if($oSprm->isPmd != 0x70){ + if ($oSprm->isPmd != 0x70) { $operand = self::getInt4d($data, $pos); $length = 4; } break; case 0x7: - $operand = self::_GetInt3d($data, $pos); + $operand = self::getInt3d($data, $pos); $length = 3; break; default: @@ -1556,7 +1561,7 @@ class MsDoc extends AbstractReader implements ReaderInterface * @return \stdClass * @link http://msdn.microsoft.com/en-us/library/dd772849%28v=office.12%29.aspx */ - private function readPrl($data, $pos, $cb) + private function readPrl($data, $pos, $cbNum) { $posStart = $pos; $oStylePrl = new \stdClass(); @@ -1573,23 +1578,23 @@ class MsDoc extends AbstractReader implements ReaderInterface $sprm = self::getInt2d($data, $pos); $oSprm = $this->readSprm($sprm); $pos += 2; - $cb -= 2; + $cbNum -= 2; $arrayReturn = $this->readSprmSpra($data, $pos, $oSprm); $pos += $arrayReturn['length']; - $cb -= $arrayReturn['length']; + $cbNum -= $arrayReturn['length']; $operand = $arrayReturn['operand']; - switch(dechex($oSprm->sgc)){ + switch(dechex($oSprm->sgc)) { // Paragraph property case 0x01: break; // Character property case 0x02: - if(!isset($oStylePrl->styleFont)) { + if (!isset($oStylePrl->styleFont)) { $oStylePrl->styleFont = array(); } - switch($oSprm->isPmd){ + switch($oSprm->isPmd) { // sprmCFRMarkIns case 0x01: break; @@ -1658,7 +1663,7 @@ class MsDoc extends AbstractReader implements ReaderInterface break; // sprmCKul case 0x3E: - switch(dechex($operand)){ + switch(dechex($operand)) { case 0x00: $oStylePrl->styleFont['underline'] = Style\Font::UNDERLINE_NONE; break; @@ -1721,7 +1726,7 @@ class MsDoc extends AbstractReader implements ReaderInterface // sprmCIco //@link http://msdn.microsoft.com/en-us/library/dd773060%28v=office.12%29.aspx case 0x42: - switch(dechex($operand)){ + switch(dechex($operand)) { case 0x00: case 0x01: $oStylePrl->styleFont['color'] = '000000'; @@ -1799,7 +1804,7 @@ class MsDoc extends AbstractReader implements ReaderInterface // sprmCRgFtc0 case 0x4F: $oStylePrl->styleFont['name'] = ''; - if(isset($this->arrayFonts[$operand])) { + if (isset($this->arrayFonts[$operand])) { $oStylePrl->styleFont['name'] = $this->arrayFonts[$operand]['main']; } break; @@ -1829,7 +1834,7 @@ class MsDoc extends AbstractReader implements ReaderInterface case 0x66: // $operand = self::getInt2d($data, $pos); $pos += 2; - $cb -= 2; + $cbNum -= 2; // $ipat = ($operand >> 0) && bindec('111111'); // $icoBack = ($operand >> 6) && bindec('11111'); // $icoFore = ($operand >> 11) && bindec('11111'); @@ -1845,7 +1850,7 @@ class MsDoc extends AbstractReader implements ReaderInterface $pos += 1; $pos += 1; $oStylePrl->styleFont['color'] = $red.$green.$blue; - $cb -= 4; + $cbNum -= 4; break; default: // print_r('@todo Character : 0x'.dechex($oSprm->isPmd)); @@ -1857,10 +1862,10 @@ class MsDoc extends AbstractReader implements ReaderInterface break; // Section property case 0x04: - if(!isset($oStylePrl->styleSection)) { + if (!isset($oStylePrl->styleSection)) { $oStylePrl->styleSection = array(); } - switch($oSprm->isPmd){ + switch($oSprm->isPmd) { // sprmSNfcPgn case 0x0E: // numbering format used for page numbers @@ -1919,7 +1924,7 @@ class MsDoc extends AbstractReader implements ReaderInterface case 0x05: break; } - } while($cb > 0); + } while ($cbNum > 0); if (!is_null($sprmCPicLocation)) { if (!is_null($sprmCFData) && $sprmCFData == 0x01) { @@ -1953,7 +1958,7 @@ class MsDoc extends AbstractReader implements ReaderInterface $hlstmfSiteGaveDisplayName = ($data >> 2) & bindec('1'); $hlstmfIsAbsolute = ($data >> 1) & bindec('1'); $hlstmfHasMoniker = ($data >> 0) & bindec('1'); - for($inc = 0 ; $inc <= 32 ; $inc++){ + for ($inc = 0; $inc <= 32; $inc++) { echo ($data >> $inc) & bindec('1'); } @@ -1967,20 +1972,20 @@ class MsDoc extends AbstractReader implements ReaderInterface print_r('$hlstmfHasFrameName > '.$hlstmfHasFrameName.PHP_EOL); print_r('$hlstmfMonikerSavedAsStr > '.$hlstmfMonikerSavedAsStr.PHP_EOL); print_r('$hlstmfAbsFromGetdataRel > '.$hlstmfAbsFromGetdataRel.PHP_EOL); - if($streamVersion == 2){ + if ($streamVersion == 2) { $AAA = self::getInt4d($this->dataData, $sprmCPicLocation); echo 'AAAA : '.$AAA.PHP_EOL; - if($hlstmfHasDisplayName == 1){ + if ($hlstmfHasDisplayName == 1) { echo 'displayName'.PHP_EOL; } - if($hlstmfHasFrameName == 1){ + if ($hlstmfHasFrameName == 1) { echo 'targetFrameName'.PHP_EOL; } - if($hlstmfHasMoniker == 1 || $hlstmfMonikerSavedAsStr == 1){ + if ($hlstmfHasMoniker == 1 || $hlstmfMonikerSavedAsStr == 1) { $sprmCPicLocation += 16; $length = self::getInt4d($this->dataData, $sprmCPicLocation); $sprmCPicLocation += 4; - for($inc = 0 ; $inc < ($length / 2) ; $inc++) { + for ($inc = 0; $inc < ($length / 2); $inc++) { $chr = self::getInt2d($this->dataData, $sprmCPicLocation); $sprmCPicLocation += 2; print_r(chr($chr)); @@ -1988,17 +1993,17 @@ class MsDoc extends AbstractReader implements ReaderInterface echo PHP_EOL; echo 'moniker : '.$length.PHP_EOL; } - if($hlstmfHasMoniker == 1 || $hlstmfMonikerSavedAsStr == 1){ + if ($hlstmfHasMoniker == 1 || $hlstmfMonikerSavedAsStr == 1) { echo 'oleMoniker'.PHP_EOL; } - if($hlstmfHasLocationStr == 1){ + if ($hlstmfHasLocationStr == 1) { echo 'location'.PHP_EOL; } - if($hlstmfHasGUID == 1) { + if ($hlstmfHasGUID == 1) { echo 'guid'.PHP_EOL; $sprmCPicLocation += 16; } - if($hlstmfHasCreationTime == 1) { + if ($hlstmfHasCreationTime == 1) { echo 'fileTime'.PHP_EOL; $sprmCPicLocation += 4; } @@ -2013,7 +2018,7 @@ class MsDoc extends AbstractReader implements ReaderInterface // PICF : cbHeader $sprmCPicLocation += 2; // PICF : mfpf : mm - $mfpf_mm = self::getInt2d($this->dataData, $sprmCPicLocation); + $mfpfMm = self::getInt2d($this->dataData, $sprmCPicLocation); $sprmCPicLocation += 2; // PICF : mfpf : xExt $sprmCPicLocation += 2; @@ -2030,28 +2035,28 @@ class MsDoc extends AbstractReader implements ReaderInterface // PICF : innerHeader : padding2 $sprmCPicLocation += 4; // PICF : picmid : dxaGoal - $picmid_dxaGoal = self::getInt2d($this->dataData, $sprmCPicLocation); + $picmidDxaGoal = self::getInt2d($this->dataData, $sprmCPicLocation); $sprmCPicLocation += 2; // PICF : picmid : dyaGoal - $picmid_dyaGoal = self::getInt2d($this->dataData, $sprmCPicLocation); + $picmidDyaGoal = self::getInt2d($this->dataData, $sprmCPicLocation); $sprmCPicLocation += 2; // PICF : picmid : mx - $picmid_mx = self::getInt2d($this->dataData, $sprmCPicLocation); + $picmidMx = self::getInt2d($this->dataData, $sprmCPicLocation); $sprmCPicLocation += 2; // PICF : picmid : my - $picmid_my = self::getInt2d($this->dataData, $sprmCPicLocation); + $picmidMy = self::getInt2d($this->dataData, $sprmCPicLocation); $sprmCPicLocation += 2; // PICF : picmid : dxaReserved1 - $picmid_dxaCropLeft = self::getInt2d($this->dataData, $sprmCPicLocation); + $picmidDxaCropLeft = self::getInt2d($this->dataData, $sprmCPicLocation); $sprmCPicLocation += 2; // PICF : picmid : dyaReserved1 - $picmid_dxaCropTop = self::getInt2d($this->dataData, $sprmCPicLocation); + $picmidDxaCropTop = self::getInt2d($this->dataData, $sprmCPicLocation); $sprmCPicLocation += 2; // PICF : picmid : dxaReserved2 - $picmid_dxaCropRight = self::getInt2d($this->dataData, $sprmCPicLocation); + $picmidDxaCropRight = self::getInt2d($this->dataData, $sprmCPicLocation); $sprmCPicLocation += 2; // PICF : picmid : dyaReserved2 - $picmid_dxaCropBottom = self::getInt2d($this->dataData, $sprmCPicLocation); + $picmidDxaCropBottom = self::getInt2d($this->dataData, $sprmCPicLocation); $sprmCPicLocation += 2; // PICF : picmid : fReserved $sprmCPicLocation += 1; @@ -2072,14 +2077,14 @@ class MsDoc extends AbstractReader implements ReaderInterface // PICF : cProps $sprmCPicLocation += 2; - if ($mfpf_mm == 0x0066) { + if ($mfpfMm == 0x0066) { // cchPicName $cchPicName = self::getInt1d($this->dataData, $sprmCPicLocation); $sprmCPicLocation += 1; // stPicName $stPicName = ''; - for($inc = 0; $inc <= $cchPicName; $inc++){ + for ($inc = 0; $inc <= $cchPicName; $inc++) { $chr = self::getInt1d($this->dataData, $sprmCPicLocation); $sprmCPicLocation += 1; $stPicName .= chr($chr); @@ -2090,13 +2095,13 @@ class MsDoc extends AbstractReader implements ReaderInterface // picture : shape $shapeRH = $this->loadRecordHeader($this->dataData, $sprmCPicLocation); $sprmCPicLocation += 8; - if($shapeRH['recVer'] == 0xF && $shapeRH['recInstance'] == 0x000 && $shapeRH['recType'] == 0xF004){ + if ($shapeRH['recVer'] == 0xF && $shapeRH['recInstance'] == 0x000 && $shapeRH['recType'] == 0xF004) { $sprmCPicLocation += $shapeRH['recLen']; } // picture : rgfb //@link : http://msdn.microsoft.com/en-us/library/dd950560%28v=office.12%29.aspx $fileBlockRH = $this->loadRecordHeader($this->dataData, $sprmCPicLocation); - while ($fileBlockRH['recType'] == 0xF007 || ($fileBlockRH['recType'] >= 0xF018 && $fileBlockRH['recType'] <= 0xF117)){ + while ($fileBlockRH['recType'] == 0xF007 || ($fileBlockRH['recType'] >= 0xF018 && $fileBlockRH['recType'] <= 0xF117)) { $sprmCPicLocation += 8; switch ($fileBlockRH['recType']) { // OfficeArtFBSE @@ -2128,7 +2133,7 @@ class MsDoc extends AbstractReader implements ReaderInterface // nameData if ($cbName > 0) { $nameData = ''; - for($inc = 0; $inc <= ($cbName / 2); $inc++){ + for ($inc = 0; $inc <= ($cbName / 2); $inc++) { $chr = self::getInt2d($this->dataData, $sprmCPicLocation); $sprmCPicLocation += 2; $nameData .= chr($chr); @@ -2140,7 +2145,7 @@ class MsDoc extends AbstractReader implements ReaderInterface switch ($embeddedBlipRH['recType']) { case self::OFFICEARTBLIPJPG: case self::OFFICEARTBLIPJPEG: - if(!isset($oStylePrl->image)){ + if (!isset($oStylePrl->image)) { $oStylePrl->image = array(); } $sprmCPicLocation += 8; @@ -2156,16 +2161,16 @@ class MsDoc extends AbstractReader implements ReaderInterface $oStylePrl->image['data'] = substr($this->dataData, $sprmCPicLocation, $embeddedBlipRH['recLen']); $oStylePrl->image['format'] = 'jpg'; // Image Size - $iCropWidth = $picmid_dxaGoal - ($picmid_dxaCropLeft + $picmid_dxaCropRight); - $iCropHeight = $picmid_dyaGoal - ($picmid_dxaCropTop + $picmid_dxaCropBottom); - if (!$iCropWidth){ + $iCropWidth = $picmidDxaGoal - ($picmidDxaCropLeft + $picmidDxaCropRight); + $iCropHeight = $picmidDyaGoal - ($picmidDxaCropTop + $picmidDxaCropBottom); + if (!$iCropWidth) { $iCropWidth = 1; } - if (!$iCropHeight){ + if (!$iCropHeight) { $iCropHeight = 1; } - $oStylePrl->image['width'] = Drawing::twipsToPixels($iCropWidth * $picmid_mx / 1000); - $oStylePrl->image['height'] = Drawing::twipsToPixels($iCropHeight * $picmid_my / 1000); + $oStylePrl->image['width'] = Drawing::twipsToPixels($iCropWidth * $picmidMx / 1000); + $oStylePrl->image['height'] = Drawing::twipsToPixels($iCropHeight * $picmidMy / 1000); $sprmCPicLocation += $embeddedBlipRH['recLen']; break; @@ -2211,7 +2216,7 @@ class MsDoc extends AbstractReader implements ReaderInterface $sHYPERLINK = ''; foreach ($this->arrayParagraphs as $itmParagraph) { $textPara = $itmParagraph; - foreach ($this->arrayCharacters as $keyCharacters => $oCharacters) { + foreach ($this->arrayCharacters as $oCharacters) { $subText = substr($textPara, $oCharacters->pos_start, $oCharacters->pos_len); $subText = str_replace(chr(13), PHP_EOL, $subText); $arrayText = explode(PHP_EOL, $subText); @@ -2224,15 +2229,15 @@ class MsDoc extends AbstractReader implements ReaderInterface // Style Character $styleFont = array(); - if(isset($oCharacters->style)){ - if(isset($oCharacters->style->styleFont)){ + if (isset($oCharacters->style)) { + if (isset($oCharacters->style->styleFont)) { $styleFont = $oCharacters->style->styleFont; } } foreach ($arrayText as $sText) { // HyperLink - if(empty($sText) && !empty($sHYPERLINK)) { + if (empty($sText) && !empty($sHYPERLINK)) { $arrHYPERLINK = explode('"', $sHYPERLINK); $oSection->addLink($arrHYPERLINK[1], null); // print_r('>addHyperLink<'.$sHYPERLINK.'>'.ord($sHYPERLINK[0]).EOL); @@ -2240,27 +2245,27 @@ class MsDoc extends AbstractReader implements ReaderInterface } // TextBreak - if(empty($sText)) { + if (empty($sText)) { $oSection->addTextBreak(); $sHYPERLINK = ''; // print_r('>addTextBreak<' . EOL); } - if(!empty($sText)){ - if(!empty($sHYPERLINK) && ord($sText[0]) > 20){ + if (!empty($sText)) { + if (!empty($sHYPERLINK) && ord($sText[0]) > 20) { $sHYPERLINK .= $sText; } - if(empty($sHYPERLINK)) { - if(ord($sText[0]) > 20){ - if(strpos(trim($sText), 'HYPERLINK "') === 0){ + if (empty($sHYPERLINK)) { + if (ord($sText[0]) > 20) { + if (strpos(trim($sText), 'HYPERLINK "') === 0) { $sHYPERLINK = $sText; } else { $oSection->addText($sText, $styleFont); // print_r('>addText<'.$sText.'>'.ord($sText[0]).EOL); } } - if(ord($sText[0]) == 1) { - if(isset($oCharacters->style->image)){ + if (ord($sText[0]) == 1) { + if (isset($oCharacters->style->image)) { $fileImage = tempnam(sys_get_temp_dir(), 'PHPWord_MsDoc').'.'.$oCharacters->style->image['format']; file_put_contents($fileImage, $oCharacters->style->image['data']); $oSection->addImage($fileImage, array('width' => $oCharacters->style->image['width'], 'height' => $oCharacters->style->image['height'])); @@ -2307,7 +2312,7 @@ class MsDoc extends AbstractReader implements ReaderInterface * @param int $pos * @return int */ - public static function _GetInt3d($data, $pos) + public static function getInt3d($data, $pos) { return ord($data[$pos]) | (ord($data[$pos+1]) << 8) | (ord($data[$pos+2]) << 16); } @@ -2324,13 +2329,13 @@ class MsDoc extends AbstractReader implements ReaderInterface // FIX: represent numbers correctly on 64-bit system // http://sourceforge.net/tracker/index.php?func=detail&aid=1487372&group_id=99160&atid=623334 // Hacked by Andreas Rehm 2006 to ensure correct result of the <<24 block on 32 and 64bit systems - $_or_24 = ord($data[$pos + 3]); - if ($_or_24 >= 128) { + $or24 = ord($data[$pos + 3]); + if ($or24 >= 128) { // negative number - $_ord_24 = -abs((256 - $_or_24) << 24); + $ord24 = -abs((256 - $or24) << 24); } else { - $_ord_24 = ($_or_24 & 127) << 24; + $ord24 = ($or24 & 127) << 24; } - return ord($data[$pos]) | (ord($data[$pos+1]) << 8) | (ord($data[$pos+2]) << 16) | $_ord_24; + return ord($data[$pos]) | (ord($data[$pos+1]) << 8) | (ord($data[$pos+2]) << 16) | $ord24; } } diff --git a/src/PhpWord/Shared/Drawing.php b/src/PhpWord/Shared/Drawing.php index 85ce595f..e3a33e5b 100644 --- a/src/PhpWord/Shared/Drawing.php +++ b/src/PhpWord/Shared/Drawing.php @@ -31,7 +31,7 @@ class Drawing * @param integer $pValue Value in EMU * @return integer Value in pixels */ - public static function EMUToPixels($pValue = 0) + public static function emuToPixels($pValue = 0) { if ($pValue != 0) { return round($pValue / 9525); @@ -201,17 +201,17 @@ class Drawing } if (strlen($pValue) == 6) { - list($color_R, $color_G, $color_B) = array($pValue[0] . $pValue[1], $pValue[2] . $pValue[3], $pValue[4] . $pValue[5]); + list($colorR, $colorG, $colorB) = array($pValue[0] . $pValue[1], $pValue[2] . $pValue[3], $pValue[4] . $pValue[5]); } elseif (strlen($pValue) == 3) { - list($color_R, $color_G, $color_B) = array($pValue[0] . $pValue[0], $pValue[1] . $pValue[1], $pValue[2] . $pValue[2]); + list($colorR, $colorG, $colorB) = array($pValue[0] . $pValue[0], $pValue[1] . $pValue[1], $pValue[2] . $pValue[2]); } else { return false; } - $color_R = hexdec($color_R); - $color_G = hexdec($color_G); - $color_B = hexdec($color_B); + $colorR = hexdec($colorR); + $colorG = hexdec($colorG); + $colorB = hexdec($colorB); - return array($color_R, $color_G, $color_B); + return array($colorR, $colorG, $colorB); } } diff --git a/src/PhpWord/Shared/OLERead.php b/src/PhpWord/Shared/OLERead.php index 5235d37e..aa1ad48a 100644 --- a/src/PhpWord/Shared/OLERead.php +++ b/src/PhpWord/Shared/OLERead.php @@ -15,46 +15,47 @@ use PhpOffice\PhpWord\Exception\Exception; defined('IDENTIFIER_OLE') || define('IDENTIFIER_OLE', pack('CCCCCCCC', 0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1)); -class OLERead { +class OLERead +{ private $data = ''; // OLE identifier const IDENTIFIER_OLE = IDENTIFIER_OLE; // Size of a sector = 512 bytes - const BIG_BLOCK_SIZE = 0x200; + const BIG_BLOCK_SIZE = 0x200; // Size of a short sector = 64 bytes - const SMALL_BLOCK_SIZE = 0x40; + const SMALL_BLOCK_SIZE = 0x40; // Size of a directory entry always = 128 bytes - const PROPERTY_STORAGE_BLOCK_SIZE = 0x80; + const PROPERTY_STORAGE_BLOCK_SIZE = 0x80; // Minimum size of a standard stream = 4096 bytes, streams smaller than this are stored as short streams - const SMALL_BLOCK_THRESHOLD = 0x1000; + const SMALL_BLOCK_THRESHOLD = 0x1000; // header offsets - const NUM_BIG_BLOCK_DEPOT_BLOCKS_POS = 0x2c; - const ROOT_START_BLOCK_POS = 0x30; - const SMALL_BLOCK_DEPOT_BLOCK_POS = 0x3c; - const EXTENSION_BLOCK_POS = 0x44; - const NUM_EXTENSION_BLOCK_POS = 0x48; - const BIG_BLOCK_DEPOT_BLOCKS_POS = 0x4c; + const NUM_BIG_BLOCK_DEPOT_BLOCKS_POS = 0x2c; + const ROOT_START_BLOCK_POS = 0x30; + const SMALL_BLOCK_DEPOT_BLOCK_POS = 0x3c; + const EXTENSION_BLOCK_POS = 0x44; + const NUM_EXTENSION_BLOCK_POS = 0x48; + const BIG_BLOCK_DEPOT_BLOCKS_POS = 0x4c; // property storage offsets (directory offsets) - const SIZE_OF_NAME_POS = 0x40; - const TYPE_POS = 0x42; - const START_BLOCK_POS = 0x74; - const SIZE_POS = 0x78; + const SIZE_OF_NAME_POS = 0x40; + const TYPE_POS = 0x42; + const START_BLOCK_POS = 0x74; + const SIZE_POS = 0x78; - public $wrkdocument = null; - public $wrk1Table = null; - public $wrkData = null; - public $wrkObjectPool = null; - public $summaryInformation = null; - public $documentSummaryInformation = null; + public $wrkdocument = null; + public $wrk1Table = null; + public $wrkData = null; + public $wrkObjectPool = null; + public $summaryInformation = null; + public $docSummaryInformation = null; /** @@ -66,13 +67,13 @@ class OLERead { public function read($sFileName) { // Check if file exists and is readable - if(!is_readable($sFileName)) { + if (!is_readable($sFileName)) { throw new Exception("Could not open " . $sFileName . " for reading! File does not exist, or it is not readable."); } // Get the file identifier // Don't bother reading the whole file until we know it's a valid OLE file - $this->data = file_get_contents($sFileName, FALSE, NULL, 0, 8); + $this->data = file_get_contents($sFileName, false, null, 0, 8); // Check OLE identifier if ($this->data != self::IDENTIFIER_OLE) { @@ -83,19 +84,19 @@ class OLERead { $this->data = file_get_contents($sFileName); // Total number of sectors used for the SAT - $this->numBigBlockDepotBlocks = self::_GetInt4d($this->data, self::NUM_BIG_BLOCK_DEPOT_BLOCKS_POS); + $this->numBigBlockDepotBlocks = self::getInt4d($this->data, self::NUM_BIG_BLOCK_DEPOT_BLOCKS_POS); // SecID of the first sector of the directory stream - $this->rootStartBlock = self::_GetInt4d($this->data, self::ROOT_START_BLOCK_POS); + $this->rootStartBlock = self::getInt4d($this->data, self::ROOT_START_BLOCK_POS); // SecID of the first sector of the SSAT (or -2 if not extant) - $this->sbdStartBlock = self::_GetInt4d($this->data, self::SMALL_BLOCK_DEPOT_BLOCK_POS); + $this->sbdStartBlock = self::getInt4d($this->data, self::SMALL_BLOCK_DEPOT_BLOCK_POS); // SecID of the first sector of the MSAT (or -2 if no additional sectors are used) - $this->extensionBlock = self::_GetInt4d($this->data, self::EXTENSION_BLOCK_POS); + $this->extensionBlock = self::getInt4d($this->data, self::EXTENSION_BLOCK_POS); // Total number of sectors used by MSAT - $this->numExtensionBlocks = self::_GetInt4d($this->data, self::NUM_EXTENSION_BLOCK_POS); + $this->numExtensionBlocks = self::getInt4d($this->data, self::NUM_EXTENSION_BLOCK_POS); $bigBlockDepotBlocks = array(); $pos = self::BIG_BLOCK_DEPOT_BLOCKS_POS; @@ -107,7 +108,7 @@ class OLERead { } for ($i = 0; $i < $bbdBlocks; ++$i) { - $bigBlockDepotBlocks[$i] = self::_GetInt4d($this->data, $pos); + $bigBlockDepotBlocks[$i] = self::getInt4d($this->data, $pos); $pos += 4; } @@ -116,13 +117,13 @@ class OLERead { $blocksToRead = min($this->numBigBlockDepotBlocks - $bbdBlocks, self::BIG_BLOCK_SIZE / 4 - 1); for ($i = $bbdBlocks; $i < $bbdBlocks + $blocksToRead; ++$i) { - $bigBlockDepotBlocks[$i] = self::_GetInt4d($this->data, $pos); + $bigBlockDepotBlocks[$i] = self::getInt4d($this->data, $pos); $pos += 4; } $bbdBlocks += $blocksToRead; if ($bbdBlocks < $this->numBigBlockDepotBlocks) { - $this->extensionBlock = self::_GetInt4d($this->data, $pos); + $this->extensionBlock = self::getInt4d($this->data, $pos); } } @@ -145,14 +146,14 @@ class OLERead { $this->smallBlockChain .= substr($this->data, $pos, 4*$bbs); $pos += 4*$bbs; - $sbdBlock = self::_GetInt4d($this->bigBlockChain, $sbdBlock*4); + $sbdBlock = self::getInt4d($this->bigBlockChain, $sbdBlock*4); } // read the directory stream $block = $this->rootStartBlock; - $this->entry = $this->_readData($block); + $this->entry = $this->readData($block); - $this->_readPropertySets(); + $this->readPropertySets(); } /** @@ -162,14 +163,14 @@ class OLERead { */ public function getStream($stream) { - if ($stream === NULL) { + if ($stream === null) { return null; } $streamData = ''; if ($this->props[$stream]['size'] < self::SMALL_BLOCK_THRESHOLD) { - $rootdata = $this->_readData($this->props[$this->rootentry]['startBlock']); + $rootdata = $this->readData($this->props[$this->rootentry]['startBlock']); $block = $this->props[$stream]['startBlock']; @@ -177,7 +178,7 @@ class OLERead { $pos = $block * self::SMALL_BLOCK_SIZE; $streamData .= substr($rootdata, $pos, self::SMALL_BLOCK_SIZE); - $block = self::_GetInt4d($this->smallBlockChain, $block*4); + $block = self::getInt4d($this->smallBlockChain, $block*4); } return $streamData; @@ -187,14 +188,16 @@ class OLERead { ++$numBlocks; } - if ($numBlocks == 0) return ''; + if ($numBlocks == 0) { + return ''; + } $block = $this->props[$stream]['startBlock']; while ($block != -2) { $pos = ($block + 1) * self::BIG_BLOCK_SIZE; $streamData .= substr($this->data, $pos, self::BIG_BLOCK_SIZE); - $block = self::_GetInt4d($this->bigBlockChain, $block*4); + $block = self::getInt4d($this->bigBlockChain, $block*4); } return $streamData; @@ -204,18 +207,18 @@ class OLERead { /** * Read a standard stream (by joining sectors using information from SAT) * - * @param int $bl Sector ID where the stream starts + * @param int $blSectorId Sector ID where the stream starts * @return string Data for standard stream */ - private function _readData($bl) + private function readData($blSectorId) { - $block = $bl; + $block = $blSectorId; $data = ''; - while ($block != -2) { + while ($block != -2) { $pos = ($block + 1) * self::BIG_BLOCK_SIZE; $data .= substr($this->data, $pos, self::BIG_BLOCK_SIZE); - $block = self::_GetInt4d($this->bigBlockChain, $block*4); + $block = self::getInt4d($this->bigBlockChain, $block*4); } return $data; } @@ -223,28 +226,29 @@ class OLERead { /** * Read entries in the directory stream. */ - private function _readPropertySets() { + private function readPropertySets() + { $offset = 0; // loop through entires, each entry is 128 bytes $entryLen = strlen($this->entry); while ($offset < $entryLen) { // entry data (128 bytes) - $d = substr($this->entry, $offset, self::PROPERTY_STORAGE_BLOCK_SIZE); + $data = substr($this->entry, $offset, self::PROPERTY_STORAGE_BLOCK_SIZE); // size in bytes of name - $nameSize = ord($d[self::SIZE_OF_NAME_POS]) | (ord($d[self::SIZE_OF_NAME_POS+1]) << 8); + $nameSize = ord($data[self::SIZE_OF_NAME_POS]) | (ord($data[self::SIZE_OF_NAME_POS+1]) << 8); // type of entry - $type = ord($d[self::TYPE_POS]); + $type = ord($data[self::TYPE_POS]); // sectorID of first sector or short sector, if this entry refers to a stream (the case with workbook) // sectorID of first sector of the short-stream container stream, if this entry is root entry - $startBlock = self::_GetInt4d($d, self::START_BLOCK_POS); + $startBlock = self::getInt4d($data, self::START_BLOCK_POS); - $size = self::_GetInt4d($d, self::SIZE_POS); + $size = self::getInt4d($data, self::SIZE_POS); - $name = str_replace("\x00", "", substr($d,0,$nameSize)); + $name = str_replace("\x00", "", substr($data, 0, $nameSize)); $this->props[] = array ( @@ -260,13 +264,13 @@ class OLERead { // print_r($upName.PHP_EOL); if (($upName === 'WORDDOCUMENT')) { $this->wrkdocument = count($this->props) - 1; - } elseif (($upName === '1TABLE')) { + } elseif ($upName === '1TABLE') { $this->wrk1Table = count($this->props) - 1; - } elseif (($upName === 'DATA')) { + } elseif ($upName === 'DATA') { $this->wrkData = count($this->props) - 1; - } elseif (($upName === 'OBJECTPOOL')) { + } elseif ($upName === 'OBJECTPOOL') { $this->wrkObjectPoolelseif = count($this->props) - 1; - } elseif ( $upName === 'ROOT ENTRY' || $upName === 'R') { + } elseif ($upName === 'ROOT ENTRY' || $upName === 'R') { $this->rootentry = count($this->props) - 1; } @@ -277,7 +281,7 @@ class OLERead { // Additional Document Summary information if ($name == chr(5) . 'DocumentSummaryInformation') { - $this->documentSummaryInformation = count($this->props) - 1; + $this->docSummaryInformation = count($this->props) - 1; } $offset += self::PROPERTY_STORAGE_BLOCK_SIZE; @@ -292,19 +296,18 @@ class OLERead { * @param int $pos * @return int */ - private static function _GetInt4d($data, $pos) + private static function getInt4d($data, $pos) { // FIX: represent numbers correctly on 64-bit system // http://sourceforge.net/tracker/index.php?func=detail&aid=1487372&group_id=99160&atid=623334 // Hacked by Andreas Rehm 2006 to ensure correct result of the <<24 block on 32 and 64bit systems - $_or_24 = ord($data[$pos + 3]); - if ($_or_24 >= 128) { + $or24 = ord($data[$pos + 3]); + if ($or24 >= 128) { // negative number - $_ord_24 = -abs((256 - $_or_24) << 24); + $ord24 = -abs((256 - $or24) << 24); } else { - $_ord_24 = ($_or_24 & 127) << 24; + $ord24 = ($or24 & 127) << 24; } - return ord($data[$pos]) | (ord($data[$pos + 1]) << 8) | (ord($data[$pos + 2]) << 16) | $_ord_24; + return ord($data[$pos]) | (ord($data[$pos + 1]) << 8) | (ord($data[$pos + 2]) << 16) | $ord24; } - } From 90d64bd3475c05814d47ba497dba5c392308b7cd Mon Sep 17 00:00:00 2001 From: Progi1984 Date: Sat, 16 Aug 2014 12:44:12 +0200 Subject: [PATCH 5/6] #23 : Implement Word97 aka MsDoc Reader (PHPCS-PHPMD Fixes) --- src/PhpWord/Reader/MsDoc.php | 8 ++++---- src/PhpWord/Shared/OLERead.php | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/PhpWord/Reader/MsDoc.php b/src/PhpWord/Reader/MsDoc.php index d3f5a44b..c63d8d9e 100644 --- a/src/PhpWord/Reader/MsDoc.php +++ b/src/PhpWord/Reader/MsDoc.php @@ -318,7 +318,7 @@ class MsDoc extends AbstractReader implements ReaderInterface $pos = $this->readBlockFibRgFcLcb($data, $pos, self::VERSION_2000); $pos = $this->readBlockFibRgFcLcb($data, $pos, self::VERSION_2002); break; - case 0x00A4 : + case 0x00A4: $pos = $this->readBlockFibRgFcLcb($data, $pos, self::VERSION_97); $pos = $this->readBlockFibRgFcLcb($data, $pos, self::VERSION_2000); $pos = $this->readBlockFibRgFcLcb($data, $pos, self::VERSION_2002); @@ -1438,10 +1438,10 @@ class MsDoc extends AbstractReader implements ReaderInterface $aPnBteChpx[$inc] = self::getInt4d($this->data1Table, $posMem); $posMem += 4; } - $PnFkpChpx = self::getInt4d($this->data1Table, $posMem); + $pnFkpChpx = self::getInt4d($this->data1Table, $posMem); $posMem += 4; - $offsetBase = $PnFkpChpx * 512; + $offsetBase = $pnFkpChpx * 512; $offset = $offsetBase; // ChpxFkp @@ -2258,7 +2258,7 @@ class MsDoc extends AbstractReader implements ReaderInterface if (empty($sHYPERLINK)) { if (ord($sText[0]) > 20) { if (strpos(trim($sText), 'HYPERLINK "') === 0) { - $sHYPERLINK = $sText; + $sHYPERLINK = $sText; } else { $oSection->addText($sText, $styleFont); // print_r('>addText<'.$sText.'>'.ord($sText[0]).EOL); diff --git a/src/PhpWord/Shared/OLERead.php b/src/PhpWord/Shared/OLERead.php index aa1ad48a..82815afc 100644 --- a/src/PhpWord/Shared/OLERead.php +++ b/src/PhpWord/Shared/OLERead.php @@ -55,7 +55,7 @@ class OLERead public $wrkData = null; public $wrkObjectPool = null; public $summaryInformation = null; - public $docSummaryInformation = null; + public $docSummaryInfos = null; /** @@ -281,7 +281,7 @@ class OLERead // Additional Document Summary information if ($name == chr(5) . 'DocumentSummaryInformation') { - $this->docSummaryInformation = count($this->props) - 1; + $this->docSummaryInfos = count($this->props) - 1; } $offset += self::PROPERTY_STORAGE_BLOCK_SIZE; From 1a40f66a714f85e0ecb52fb4d9384cac75c816db Mon Sep 17 00:00:00 2001 From: Progi1984 Date: Sat, 16 Aug 2014 13:10:39 +0200 Subject: [PATCH 6/6] #23 : Implement Word97 aka MsDoc Reader (Changelog) --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6040c46e..ff02b1f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ This is the changelog between releases of PHPWord. Releases are listed in revers ## 0.12.0 - Not yet released -This release added form fields (textinput, checkbox, and dropdown), drawing shapes (arc, curve, line, polyline, rect, oval), and basic 2D chart (pie, doughnut, bar, line, area, scatter, radar) elements along with some new styles. +This release added form fields (textinput, checkbox, and dropdown), drawing shapes (arc, curve, line, polyline, rect, oval), and basic 2D chart (pie, doughnut, bar, line, area, scatter, radar) elements along with some new styles. Basic MsDoc reader is introduced. ### Features @@ -23,6 +23,7 @@ This release added form fields (textinput, checkbox, and dropdown), drawing shap - SDT: Ability to add structured document tag elements (comboBox, dropDownList, date) - @ivanlanin - Paragraph: Support for paragraph with borders - @ivanlanin GH-294 - Word2007 Writer : Support for RTL - @Progi1984 GH-331 +- MsDOC Reader: Basic MsDOC Reader - @Progi1984 GH-23 GH-287 ### Bugfixes