_document; } /** * Getter. Document * * @access public */ public function setDocument($document) { $this->_document = $document; } /** * Getter. DocProps * * @access public */ public function getDocProps() { return $this->_docProps; } /** * Getter. DocProps * * @access public */ public function setDocProps($props) { $this->_docProps = $props; } /** * Getter. File * * @access public */ public function getstrFile() { return $this->strFile; } /** * Getter. XHTML * * @access public */ public function getStrXHTML() { return $this->_xhtml; } /** * Getter. Output file * * @access public */ public function getStrOutputFile() { return $this->strOutputFile; } /** * Setter. File * * @access public */ public function setstrFile($file) { $this->strFile = $file; } /** * Setter. XHTML * * @access public */ public function setStrXHTML($strXHTML) { $this->_xhtml = $strXHTML; } /** * * @param string $outputFile */ public function setStrOutputFile($outputFile) { $this->strOutputFile = $outputFile; } /** * Return zip path * * @access public * @return string */ public function absoluteZipPath($path) { $path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path); $parts = array_filter( explode(DIRECTORY_SEPARATOR, $path), 'strlen' ); $arrAbsolutes = array(); foreach ($parts as $datParts) { if ('.' == $datParts) continue; if ('..' == $datParts) { array_pop($arrAbsolutes); } else { $arrAbsolutes[] = $datParts; } } return implode('/', $arrAbsolutes); } /** * Clean HTML * * @access public */ public function cleanXHTML() { $sectionOne = explode('', $this->_xhtml); $sectionTwo = explode('', $this->_xhtml); $sectionTwo = str_replace( 'src="?image="', 'src="imagen_not_found.jpg"', $sectionTwo ); if (!isset($sectionTwo[1])) { $sectionTwo[1] = $this->_xhtml; $sectionOne[0] = ''; } $this->_xhtml = $sectionOne[0] . '' . $sectionTwo[1]; } /** * Return file name * * @access public */ public function getFileName() { try { $partsFile = explode('/', $this->strFile); $divideFile = explode('.', array_pop($partsFile)); $fileName = array_shift($divideFile); } catch (Exception $e) { $fileName = 'file'; } return $fileName; } /** * Convert DOCX to XHTML * * @access public */ public function generateXHTML() { $package = new ZipArchive(); if (!$package->open($this->strFile)) { echo 'Unable to find the DOCX file'; exit(); } $relations = simplexml_load_string( $package->getFromName('_rels/.rels') ); foreach ($relations->Relationship as $rel) { if ($rel["Type"] == TransformDoc::SCHEMA_OFFICEDOCUMENT) { $xml = $package->getFromName( $this->absoluteZipPath( dirname($rel['Target']) . '/' . basename($rel['Target']) ) ); $this->setDocument($xml); $xmlDOM = new DOMDocument(); $xml = str_replace('', '', $xml); $xml = preg_replace( '/()/', '', $xml ); @$xmlDOM->loadXML($xml); $xsl = new DOMDocument(); $xsl->load(dirname(__FILE__) . '/../xsl/docx2html.xsl'); $xsltProc = new XSLTProcessor(); $xsltProc->importStylesheet($xsl); $this->_xhtml = $xsltProc->transformToXML($xmlDOM); } } $pattern = "'src\s*=\s*([\"\'])?(?(1) (.*?)\\1 | ([^\s\>]+))'isx"; preg_match_all($pattern, $this->_xhtml, $domImgs); $idImgs = array(); foreach ($domImgs[0] as $dats) { $datsFiltered = explode('"', $dats); if (preg_match('/^\?image=rId/', $datsFiltered[1])) { $datFiltered = explode('?image=', $dats); $idImgs[] = substr($datFiltered[1], 0, -1); } } $relationsImgs = simplexml_load_string( $package->getFromName('word/_rels/document.xml.rels') ); $pathImgs = array(); foreach ($relationsImgs->Relationship as $relImg) { if ($relImg["Type"] == TransformDoc::SCHEMA_IMAGEDOCUMENT) { $pathImgs[(string) $relImg["Id"]] = (string) $relImg["Target"]; $pathZip[] = 'word/' . (string) $relImg["Target"]; } } foreach ($idImgs as $datsIdImgs) { $this->_xhtml = str_replace( "src=\"?image=$datsIdImgs\"", "src=\"files/files_" . "$this->strFile/media/word/$pathImgs[$datsIdImgs]\"", $this->_xhtml ); } if (!empty($pathZip)) { $package->extractTo( "files/files_$this->strFile/media", $pathZip ); $package->close(); } } /** * Convert DOCX to PDF, using dompdf. DOCX->XHTML->PDF * * @access public */ public function generatePDF($path = '') { $this->generateXHTML(); $this->cleanXHTML(); $this->_extractProps(); try { $domPDF = new DOMPDF(); $domPDF->load_html($this->_xhtml); $docProps = $this->getDocProps(); $domPDF->set_paper($docProps['size'], $docProps['orientation']); $domPDF->render(); $fileName = $this->getFileName() . '.pdf'; if($path == ''){ $domPDF->stream($fileName); }else{ file_put_contents($path, $domPDF->output()); } } catch (Exception $err) { echo 'Unable to generate PDF file. '; echo $err; } } /** * Validate HTML using tidy * * @access public */ public function validatorXHTML() { ob_start(); echo $this->_xhtml; $html = ob_get_clean(); $config = array( 'indent' => true, 'output-xhtml' => true, 'wrap' => 200); $tidy = new tidy(); $tidy->parseString($html, $config, 'utf8'); $tidy->cleanRepair(); $this->_xhtml = $tidy; } /** * Get the document properties * * @return array */ private function _extractProps() { $xmlDOM = new DOMDocument(); $xmlDOM->loadXML($this->getDocument()); //Get the page size and orientation $node = $xmlDOM->getElementsByTagName('pgSz'); $docProps = array(); $width = number_format( $node->item(0)->getAttribute('w:w') / 20, 2, '.', ''); $height = number_format( $node->item(0)->getAttribute('w:h') / 20, 2, '.', ''); $orient = $node->item(0)->getAttribute('w:orient'); if (empty($orient) || $orient == 'portrait') { $docProps['orientation'] = 'portrait'; $docProps['size'] = array(0, 0, $width, $height); } else { $docProps['orientation'] = 'landscape'; $docProps['size'] = array(0, 0, $height, $width); } //Get the page margins $node = $xmlDOM->getElementsByTagName('pgMar'); $margin = 'margin: ' . floor($node->item(0)->getAttribute('w:top') / 15) . 'px ' . floor($node->item(0)->getAttribute('w:right') / 15) . 'px ' . floor($node->item(0)->getAttribute('w:bottom') / 15) . 'px ' . floor($node->item(0)->getAttribute('w:left') / 15) . 'px;'; $xml = str_replace('$MARGIN$', $margin, $this->getStrXHTML()); $this->setStrXHTML($xml); $this->setDocProps($docProps); } }