added transform package from github
This commit is contained in:
parent
a01fe8028a
commit
5b412be4f8
395
src/phpdocx/src/Transform/TransformDoc.php
Normal file
395
src/phpdocx/src/Transform/TransformDoc.php
Normal file
@ -0,0 +1,395 @@
|
|||||||
|
<?php
|
||||||
|
namespace Phpdocx\Transform;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform DOCX to PDF or XHTML
|
||||||
|
*
|
||||||
|
* @category Phpdocx
|
||||||
|
* @package transform
|
||||||
|
* @copyright Copyright (c) Narcea Producciones Multimedia S.L.
|
||||||
|
* (http://www.2mdc.com)
|
||||||
|
* @license phpdocx LICENSE
|
||||||
|
* @link http://www.phpdocx.com
|
||||||
|
*/
|
||||||
|
error_reporting(E_ALL & ~E_NOTICE);
|
||||||
|
|
||||||
|
class TransformDoc
|
||||||
|
{
|
||||||
|
const SCHEMA_IMAGEDOCUMENT = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image';
|
||||||
|
const SCHEMA_OFFICEDOCUMENT = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument';
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $_document;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
private $_docProps;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $_xhtml;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destruct
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
public function __destruct()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter. Document
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
public function getDocument()
|
||||||
|
{
|
||||||
|
return $this->_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('<head>', $this->_xhtml);
|
||||||
|
$sectionTwo = explode('</head>', $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] .
|
||||||
|
'<head><meta http-equiv="Content-Type" ' .
|
||||||
|
'content="text/html; charset=utf-8" /></head>' . $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();
|
||||||
|
$openPackage = $package->open($this->strFile);
|
||||||
|
if (!$openPackage) {
|
||||||
|
echo 'Unable to find the DOCX file';
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
$relsData = $package->getFromName('_rels/.rels');
|
||||||
|
$optionEntityLoader = libxml_disable_entity_loader(true);
|
||||||
|
$relations = simplexml_load_string($relsData);
|
||||||
|
libxml_disable_entity_loader($optionEntityLoader);
|
||||||
|
|
||||||
|
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('</w:wordDocument>', '', $xml);
|
||||||
|
$xml = preg_replace(
|
||||||
|
'/(<w:wordDocument)+(.)*(><w:body>)/', '<w:body>', $xml
|
||||||
|
);
|
||||||
|
$optionEntityLoader = libxml_disable_entity_loader(true);
|
||||||
|
@$xmlDOM->loadXML($xml);
|
||||||
|
libxml_disable_entity_loader($optionEntityLoader);
|
||||||
|
$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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$relsDocumentData = $package->getFromName('word/_rels/document.xml.rels');
|
||||||
|
$optionEntityLoader = libxml_disable_entity_loader(true);
|
||||||
|
$relationsImgs = simplexml_load_string($relsDocumentData);
|
||||||
|
libxml_disable_entity_loader($optionEntityLoader);
|
||||||
|
$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();
|
||||||
|
$optionEntityLoader = libxml_disable_entity_loader(true);
|
||||||
|
$xmlDOM->loadXML($this->getDocument());
|
||||||
|
libxml_disable_entity_loader($optionEntityLoader);
|
||||||
|
//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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
77
src/phpdocx/src/Transform/TransformDocAdv.php
Normal file
77
src/phpdocx/src/Transform/TransformDocAdv.php
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
<?php
|
||||||
|
namespace Phpdocx\Transform;
|
||||||
|
use Phpdocx\Clean\CleanTemp;
|
||||||
|
use Phpdocx\Create\CreateDocx;
|
||||||
|
use Phpdocx\Logger\PhpdocxLogger;
|
||||||
|
use Phpdocx\Parse\RepairPDF;
|
||||||
|
use Phpdocx\Utilities\PhpdocxUtilities;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform DOCX to PDF, ODT, SXW, RTF, DOC, TXT, HTML or WIKI
|
||||||
|
*
|
||||||
|
* @category Phpdocx
|
||||||
|
* @package trasform
|
||||||
|
* @copyright Copyright (c) Narcea Producciones Multimedia S.L.
|
||||||
|
* (http://www.2mdc.com)
|
||||||
|
* @license phpdocx LICENSE
|
||||||
|
* @link https://www.phpdocx.com
|
||||||
|
*/
|
||||||
|
abstract class TransformDocAdv
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @access protected
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $phpdocxconfig;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->phpdocxconfig = PhpdocxUtilities::parseConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform document formats
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
*
|
||||||
|
* @abstract
|
||||||
|
* @param $source
|
||||||
|
* @param $target
|
||||||
|
* @param array $options
|
||||||
|
*/
|
||||||
|
abstract public function transformDocument($source, $target, $options = array());
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the extension if supproted
|
||||||
|
*
|
||||||
|
* @param string $fileExtension
|
||||||
|
* @param array $supportedExtensions
|
||||||
|
* @return array files extensions
|
||||||
|
*/
|
||||||
|
protected function checkSupportedExtension($source, $target, $supportedExtensionsSource, $supportedExtensionsTarget) {
|
||||||
|
// get the source file info
|
||||||
|
$sourceFileInfo = pathinfo($source);
|
||||||
|
$sourceExtension = strtolower($sourceFileInfo['extension']);
|
||||||
|
|
||||||
|
if (!in_array($sourceExtension, $supportedExtensionsSource)) {
|
||||||
|
PhpdocxLogger::logger('The chosen extension \'' . $sourceExtension . '\' is not supported as source format.', 'fatal');
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the target file info
|
||||||
|
$targetFileInfo = explode('.', $target);
|
||||||
|
$targetExtension = strtolower(array_pop($targetFileInfo));
|
||||||
|
|
||||||
|
if (!in_array($targetExtension, $supportedExtensionsTarget)) {
|
||||||
|
PhpdocxLogger::logger('The chosen extension \'' . $targetExtension . '\' is not supported as target format.', 'fatal');
|
||||||
|
}
|
||||||
|
|
||||||
|
return array('sourceExtension' => $sourceExtension, 'targetExtension' => $targetExtension);
|
||||||
|
}
|
||||||
|
}
|
3076
src/phpdocx/src/Transform/TransformDocAdvDOMPDF.php
Normal file
3076
src/phpdocx/src/Transform/TransformDocAdvDOMPDF.php
Normal file
File diff suppressed because it is too large
Load Diff
3337
src/phpdocx/src/Transform/TransformDocAdvHTML.php
Normal file
3337
src/phpdocx/src/Transform/TransformDocAdvHTML.php
Normal file
File diff suppressed because it is too large
Load Diff
168
src/phpdocx/src/Transform/TransformDocAdvHTMLDOMPDFPlugin.php
Normal file
168
src/phpdocx/src/Transform/TransformDocAdvHTMLDOMPDFPlugin.php
Normal file
@ -0,0 +1,168 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Phpdocx\Transform;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform DOCX to PDF using native PHP classes and DOMPDF. DOMPDF plugin
|
||||||
|
*
|
||||||
|
* @category Phpdocx
|
||||||
|
* @package trasform
|
||||||
|
* @copyright Copyright (c) Narcea Producciones Multimedia S.L.
|
||||||
|
* (http://www.2mdc.com)
|
||||||
|
* @license phpdocx LICENSE
|
||||||
|
* @link https://www.phpdocx.com
|
||||||
|
*/
|
||||||
|
class TransformDocAdvHTMLDOMPDFPlugin extends TransformDocAdvHTMLPlugin
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Conversion factor, used by the transformSizes method
|
||||||
|
* @var float
|
||||||
|
*/
|
||||||
|
protected $conversionFactor = 1.3;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate section tags
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
protected $generateSectionTags = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add image src as base64
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
protected $imagesAsBase64 = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Target folder for images and other external contents. Not used for images is $imagesAsBase64 is true
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $outputFilesPath = 'output_files/';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OOXML => HTML tags
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $tags = array(
|
||||||
|
'bidi' => 'bidi',
|
||||||
|
'br' => 'br',
|
||||||
|
'comboBox' => 'select',
|
||||||
|
'comboBoxItem' => 'option',
|
||||||
|
'footer' => 'footer',
|
||||||
|
'header' => 'header',
|
||||||
|
'heading' => 'h',
|
||||||
|
'hyperlink' => 'a',
|
||||||
|
'image' => 'img',
|
||||||
|
'itemList' => 'li',
|
||||||
|
'orderedList' => 'ol',
|
||||||
|
'paragraph' => 'p',
|
||||||
|
'section' => 'section',
|
||||||
|
'span' => 'span',
|
||||||
|
'subscript' => 'sub',
|
||||||
|
'superscript' => 'sup',
|
||||||
|
'table' => 'table',
|
||||||
|
'tc' => 'td',
|
||||||
|
'tr' => 'tr',
|
||||||
|
'unorderedList' => 'ul',
|
||||||
|
);
|
||||||
|
|
||||||
|
protected $unit = 'px';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor. Init HTML, CSS, meta and javascript base contents
|
||||||
|
*/
|
||||||
|
public function __construct() {
|
||||||
|
$this->baseCSS = '<style>p { margin-top: 0px;margin-bottom: 0px;}.page_break { page-break-before: always; }</style>';
|
||||||
|
$this->baseHTML = '<!DOCTYPE html><html>';
|
||||||
|
$this->baseJavaScript = '';
|
||||||
|
$this->baseMeta = '<meta charset="UTF-8">';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate class name to be added to tags
|
||||||
|
* @return string Class name
|
||||||
|
*/
|
||||||
|
public function generateClassName()
|
||||||
|
{
|
||||||
|
return str_replace('.', '_', uniqid('docx_', true));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform colors
|
||||||
|
* @return string New color
|
||||||
|
*/
|
||||||
|
public function transformColors($color) {
|
||||||
|
$colorTarget = $color;
|
||||||
|
|
||||||
|
if ($color == 'auto') {
|
||||||
|
$colorTarget = '000000';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $colorTarget;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform content sizes
|
||||||
|
* @param string $value OOXML size
|
||||||
|
* @param string $source OOXML type size
|
||||||
|
* @param string $target Target size
|
||||||
|
* @return string HTML/CSS size
|
||||||
|
*/
|
||||||
|
public function transformSizes($value, $source, $target = null)
|
||||||
|
{
|
||||||
|
$returnValue = 0;
|
||||||
|
|
||||||
|
if ($target === null) {
|
||||||
|
$target = $this->unit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($source == 'twips') {
|
||||||
|
if ($target == 'px') {
|
||||||
|
if ($value) {
|
||||||
|
$returnValue = ($value / 20) * $this->conversionFactor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($source == 'eights') {
|
||||||
|
if ($target == 'px') {
|
||||||
|
if ($value) {
|
||||||
|
$returnValue = ($value / 8) * $this->conversionFactor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// minimum value
|
||||||
|
if ($returnValue < 2) {
|
||||||
|
$returnValue = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($source == 'half-points') {
|
||||||
|
if ($target == 'px') {
|
||||||
|
if ($value) {
|
||||||
|
$returnValue = ($value / 2) * $this->conversionFactor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($source == 'pts') {
|
||||||
|
if ($target == 'px') {
|
||||||
|
if ($value) {
|
||||||
|
$returnValue = $value * $this->conversionFactor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($source == 'fifths-percent') {
|
||||||
|
if ($target == '%') {
|
||||||
|
if ($value) {
|
||||||
|
$returnValue = ($value / 50);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// normalize decimal values to use dots
|
||||||
|
$returnValue = str_replace(',', '.', $returnValue);
|
||||||
|
|
||||||
|
return (string)$returnValue . $target;
|
||||||
|
}
|
||||||
|
}
|
167
src/phpdocx/src/Transform/TransformDocAdvHTMLDefaultPlugin.php
Normal file
167
src/phpdocx/src/Transform/TransformDocAdvHTMLDefaultPlugin.php
Normal file
@ -0,0 +1,167 @@
|
|||||||
|
<?php
|
||||||
|
namespace Phpdocx\Transform;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform DOCX to HTML using native PHP classes. Default plugin
|
||||||
|
*
|
||||||
|
* @category Phpdocx
|
||||||
|
* @package trasform
|
||||||
|
* @copyright Copyright (c) Narcea Producciones Multimedia S.L.
|
||||||
|
* (http://www.2mdc.com)
|
||||||
|
* @license phpdocx LICENSE
|
||||||
|
* @link https://www.phpdocx.com
|
||||||
|
*/
|
||||||
|
class TransformDocAdvHTMLDefaultPlugin extends TransformDocAdvHTMLPlugin
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Conversion factor, used by the transformSizes method
|
||||||
|
* @var float
|
||||||
|
*/
|
||||||
|
protected $conversionFactor = 1.3;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate section tags
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
protected $generateSectionTags = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add image src as base64
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
protected $imagesAsBase64 = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Target folder for images and other external contents. Not used for images is $imagesAsBase64 is true
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $outputFilesPath = 'output_files/';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OOXML => HTML tags
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $tags = array(
|
||||||
|
'bidi' => 'bidi',
|
||||||
|
'br' => 'br',
|
||||||
|
'comboBox' => 'select',
|
||||||
|
'comboBoxItem' => 'option',
|
||||||
|
'footer' => 'footer',
|
||||||
|
'header' => 'header',
|
||||||
|
'heading' => 'h',
|
||||||
|
'hyperlink' => 'a',
|
||||||
|
'image' => 'img',
|
||||||
|
'itemList' => 'li',
|
||||||
|
'orderedList' => 'ol',
|
||||||
|
'paragraph' => 'p',
|
||||||
|
'section' => 'section',
|
||||||
|
'span' => 'span',
|
||||||
|
'subscript' => 'sub',
|
||||||
|
'superscript' => 'sup',
|
||||||
|
'table' => 'table',
|
||||||
|
'tc' => 'td',
|
||||||
|
'tr' => 'tr',
|
||||||
|
'unorderedList' => 'ul',
|
||||||
|
);
|
||||||
|
|
||||||
|
protected $unit = 'px';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor. Init HTML, CSS, meta and javascript base contents
|
||||||
|
*/
|
||||||
|
public function __construct() {
|
||||||
|
$this->baseCSS = '<style>p { margin-top: 0px;margin-bottom: 0px;} span.tabcontent{margin-left: 50px;}</style>';
|
||||||
|
$this->baseHTML = '<!DOCTYPE html><html>';
|
||||||
|
$this->baseJavaScript = '';
|
||||||
|
$this->baseMeta = '<meta charset="UTF-8">';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate class name to be added to tags
|
||||||
|
* @return string Class name
|
||||||
|
*/
|
||||||
|
public function generateClassName()
|
||||||
|
{
|
||||||
|
return str_replace('.', '_', uniqid('docx_', true));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform colors
|
||||||
|
* @return string New color
|
||||||
|
*/
|
||||||
|
public function transformColors($color) {
|
||||||
|
$colorTarget = $color;
|
||||||
|
|
||||||
|
if ($color == 'auto' || empty($color)) {
|
||||||
|
$colorTarget = '000000';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $colorTarget;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform content sizes
|
||||||
|
* @param string $value OOXML size
|
||||||
|
* @param string $source OOXML type size
|
||||||
|
* @param string $target Target size
|
||||||
|
* @return string HTML/CSS size
|
||||||
|
*/
|
||||||
|
public function transformSizes($value, $source, $target = null)
|
||||||
|
{
|
||||||
|
$returnValue = 0;
|
||||||
|
|
||||||
|
if ($target === null) {
|
||||||
|
$target = $this->unit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($source == 'twips') {
|
||||||
|
if ($target == 'px') {
|
||||||
|
if ($value) {
|
||||||
|
$returnValue = ($value / 20) * $this->conversionFactor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($source == 'eights') {
|
||||||
|
if ($target == 'px') {
|
||||||
|
if ($value) {
|
||||||
|
$returnValue = ($value / 8) * $this->conversionFactor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// minimum value
|
||||||
|
if ($returnValue < 2) {
|
||||||
|
$returnValue = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($source == 'half-points') {
|
||||||
|
if ($target == 'px') {
|
||||||
|
if ($value) {
|
||||||
|
$returnValue = ($value / 2) * $this->conversionFactor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($source == 'pts') {
|
||||||
|
if ($target == 'px') {
|
||||||
|
if ($value) {
|
||||||
|
$returnValue = $value * $this->conversionFactor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($source == 'fifths-percent') {
|
||||||
|
if ($target == '%') {
|
||||||
|
if ($value) {
|
||||||
|
$returnValue = ($value / 50);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// normalize decimal values to use dots
|
||||||
|
$returnValue = str_replace(',', '.', $returnValue);
|
||||||
|
|
||||||
|
return (string)$returnValue . $target;
|
||||||
|
}
|
||||||
|
}
|
299
src/phpdocx/src/Transform/TransformDocAdvHTMLPlugin.php
Normal file
299
src/phpdocx/src/Transform/TransformDocAdvHTMLPlugin.php
Normal file
@ -0,0 +1,299 @@
|
|||||||
|
<?php
|
||||||
|
namespace Phpdocx\Transform;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform DOCX to HTML using native PHP classes. Abstract class
|
||||||
|
*
|
||||||
|
* @category Phpdocx
|
||||||
|
* @package trasform
|
||||||
|
* @copyright Copyright (c) Narcea Producciones Multimedia S.L.
|
||||||
|
* (http://www.2mdc.com)
|
||||||
|
* @license phpdocx LICENSE
|
||||||
|
* @link https://www.phpdocx.com
|
||||||
|
*/
|
||||||
|
abstract class TransformDocAdvHTMLPlugin
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Base CSS
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $baseCSS;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base HTML
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $baseHTML;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base JavaScript
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $baseJavaScript;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base Meta
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $baseMeta;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Conversion factor, used by the transformSizes method
|
||||||
|
* @var float
|
||||||
|
*/
|
||||||
|
protected $conversionFactor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate section tags
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
protected $generateSectionTags = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Images as base64
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
protected $imagesAsBase64;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Target folder for images and other external contents. Not used for images is $imagesAsBase64 is true
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $outputFilesPath;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Conversion unit
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
protected $unit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate class name to be added to tags
|
||||||
|
*/
|
||||||
|
abstract public function generateClassName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform colors
|
||||||
|
* @param string $color
|
||||||
|
* @return string New color
|
||||||
|
*/
|
||||||
|
abstract public function transformColors($color);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform content sizes
|
||||||
|
* @param string $value OOXML size
|
||||||
|
* @param string $source OOXML type size
|
||||||
|
* @param string $target Target size
|
||||||
|
* @return string HTML/CSS size
|
||||||
|
*/
|
||||||
|
abstract public function transformSizes($value, $source, $target = null);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter $baseCSS
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getBaseCSS()
|
||||||
|
{
|
||||||
|
return $this->baseCSS;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Setter $baseCSS
|
||||||
|
* @param string $baseCSS
|
||||||
|
*/
|
||||||
|
public function setBaseCSS($baseCSS)
|
||||||
|
{
|
||||||
|
$this->baseCSS = $baseCSS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter $baseHTML
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getBaseHTML()
|
||||||
|
{
|
||||||
|
return $this->baseHTML;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Setter $baseHTML
|
||||||
|
* @param string $baseHTML
|
||||||
|
*/
|
||||||
|
public function setBaseHTML($baseHTML)
|
||||||
|
{
|
||||||
|
$this->baseHTML = $baseHTML;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter $baseJavaScript
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getBaseJavaScript()
|
||||||
|
{
|
||||||
|
return $this->baseJavaScript;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Setter $baseJavaScript
|
||||||
|
* @param string $baseJavaScript
|
||||||
|
*/
|
||||||
|
public function setBaseJavaScript($baseJavaScript)
|
||||||
|
{
|
||||||
|
$this->baseJavaScript = $baseJavaScript;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter $baseMeta
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getBaseMeta()
|
||||||
|
{
|
||||||
|
return $this->baseMeta;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Setter $baseMeta
|
||||||
|
* @param string $baseMeta
|
||||||
|
*/
|
||||||
|
public function setBaseMeta($baseMeta)
|
||||||
|
{
|
||||||
|
$this->baseMeta = $baseMeta;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter $conversionFactor
|
||||||
|
* @return float
|
||||||
|
*/
|
||||||
|
public function getConversionFactor()
|
||||||
|
{
|
||||||
|
return $this->conversionFactor;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Setter $conversionFactor
|
||||||
|
* @param float $conversionFactor
|
||||||
|
*/
|
||||||
|
public function setConversionFactor($conversionFactor)
|
||||||
|
{
|
||||||
|
$this->conversionFactor = $conversionFactor;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter extra class value
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getExtraClass($tag)
|
||||||
|
{
|
||||||
|
if (isset($this->extraClasses[$tag])) {
|
||||||
|
return $this->extraClasses[$tag];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Getter $extraClasses
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getExtraClasses()
|
||||||
|
{
|
||||||
|
return $this->extraClasses;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setter $extraClasses
|
||||||
|
* @param string $tag
|
||||||
|
* @param string $class
|
||||||
|
*/
|
||||||
|
public function setExtraClasses($tag, $class)
|
||||||
|
{
|
||||||
|
$this->extraClasses[$tag] = $class;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Getter $generateSectionTags
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function getGenerateSectionTags()
|
||||||
|
{
|
||||||
|
return $this->generateSectionTags;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setter $generateSectionTags
|
||||||
|
* @param bool $generateSectionTags
|
||||||
|
*/
|
||||||
|
public function setGenerateSectionTags($generateSectionTags)
|
||||||
|
{
|
||||||
|
$this->generateSectionTags = $generateSectionTags;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter $imagesAsBase64
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function getImagesAsBase64()
|
||||||
|
{
|
||||||
|
return $this->imagesAsBase64;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Setter $imagesAsBase64
|
||||||
|
* @param bool $imagesAsBase64
|
||||||
|
*/
|
||||||
|
public function setImagesAsBase64($imagesAsBase64)
|
||||||
|
{
|
||||||
|
$this->imagesAsBase64 = $imagesAsBase64;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter $outputFilesPath
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getOutputFilesPath()
|
||||||
|
{
|
||||||
|
return $this->outputFilesPath;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Setter $outputFilesPath
|
||||||
|
* @param string $outputFilesPath
|
||||||
|
*/
|
||||||
|
public function setOutputFilesPath($outputFilesPath)
|
||||||
|
{
|
||||||
|
$this->outputFilesPath = $outputFilesPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter $tag value
|
||||||
|
* @param string $tag
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getTag($tag)
|
||||||
|
{
|
||||||
|
return $this->tags[$tag];
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Setter $setTag
|
||||||
|
* @param string $tag
|
||||||
|
* @param string $value
|
||||||
|
*/
|
||||||
|
public function setTag($tag, $value)
|
||||||
|
{
|
||||||
|
$this->tags[$tag] = $value;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Getter $tags
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getTags()
|
||||||
|
{
|
||||||
|
return $this->tags;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Getter $unit
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function getUnit()
|
||||||
|
{
|
||||||
|
return $this->unit;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Setter $setUnit
|
||||||
|
* @param int $unit
|
||||||
|
*/
|
||||||
|
public function setUnit($unit)
|
||||||
|
{
|
||||||
|
$this->unit = $unit;
|
||||||
|
}
|
||||||
|
}
|
168
src/phpdocx/src/Transform/TransformDocAdvHTMLTCPDFPlugin.php
Normal file
168
src/phpdocx/src/Transform/TransformDocAdvHTMLTCPDFPlugin.php
Normal file
@ -0,0 +1,168 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Phpdocx\Transform;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform DOCX to PDF using native PHP classes and TCPDF. TCPDF plugin
|
||||||
|
*
|
||||||
|
* @category Phpdocx
|
||||||
|
* @package trasform
|
||||||
|
* @copyright Copyright (c) Narcea Producciones Multimedia S.L.
|
||||||
|
* (http://www.2mdc.com)
|
||||||
|
* @license phpdocx LICENSE
|
||||||
|
* @link https://www.phpdocx.com
|
||||||
|
*/
|
||||||
|
class TransformDocAdvHTMLTCPDFPlugin extends TransformDocAdvHTMLPlugin
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Conversion factor, used by the transformSizes method
|
||||||
|
* @var float
|
||||||
|
*/
|
||||||
|
protected $conversionFactor = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate section tags
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
protected $generateSectionTags = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add image src as base64
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
protected $imagesAsBase64 = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Target folder for images and other external contents. Not used for images is $imagesAsBase64 is true
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $outputFilesPath = 'output_files/';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OOXML => HTML tags
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $tags = array(
|
||||||
|
'bidi' => 'bidi',
|
||||||
|
'br' => 'br',
|
||||||
|
'comboBox' => 'select',
|
||||||
|
'comboBoxItem' => 'option',
|
||||||
|
'footer' => 'footer',
|
||||||
|
'header' => 'header',
|
||||||
|
'heading' => 'h',
|
||||||
|
'hyperlink' => 'a',
|
||||||
|
'image' => 'img',
|
||||||
|
'itemList' => 'li',
|
||||||
|
'orderedList' => 'ol',
|
||||||
|
'paragraph' => 'p',
|
||||||
|
'section' => 'section',
|
||||||
|
'span' => 'span',
|
||||||
|
'subscript' => 'sub',
|
||||||
|
'superscript' => 'sup',
|
||||||
|
'table' => 'table',
|
||||||
|
'tc' => 'td',
|
||||||
|
'tr' => 'tr',
|
||||||
|
'unorderedList' => 'ul',
|
||||||
|
);
|
||||||
|
|
||||||
|
protected $unit = 'px';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor. Init HTML, CSS, meta and javascript base contents
|
||||||
|
*/
|
||||||
|
public function __construct() {
|
||||||
|
$this->baseCSS = '<style>p { margin-top: 0px;margin-bottom: 0px;}</style>';
|
||||||
|
$this->baseHTML = '<!DOCTYPE html><html>';
|
||||||
|
$this->baseJavaScript = '';
|
||||||
|
$this->baseMeta = '<meta charset="UTF-8">';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate class name to be added to tags
|
||||||
|
* @return string Class name
|
||||||
|
*/
|
||||||
|
public function generateClassName()
|
||||||
|
{
|
||||||
|
return str_replace('.', '_', uniqid('docx_', true));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform colors
|
||||||
|
* @return string New color
|
||||||
|
*/
|
||||||
|
public function transformColors($color) {
|
||||||
|
$colorTarget = $color;
|
||||||
|
|
||||||
|
if ($color == 'auto') {
|
||||||
|
$colorTarget = '000000';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $colorTarget;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform content sizes
|
||||||
|
* @param string $value OOXML size
|
||||||
|
* @param string $source OOXML type size
|
||||||
|
* @param string $target Target size
|
||||||
|
* @return string HTML/CSS size
|
||||||
|
*/
|
||||||
|
public function transformSizes($value, $source, $target = null)
|
||||||
|
{
|
||||||
|
$returnValue = 0;
|
||||||
|
|
||||||
|
if ($target === null) {
|
||||||
|
$target = $this->unit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($source == 'twips') {
|
||||||
|
if ($target == 'px') {
|
||||||
|
if ($value) {
|
||||||
|
$returnValue = ($value / 20) * $this->conversionFactor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($source == 'eights') {
|
||||||
|
if ($target == 'px') {
|
||||||
|
if ($value) {
|
||||||
|
$returnValue = ($value / 8) * $this->conversionFactor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// minimum value
|
||||||
|
if ($returnValue < 2) {
|
||||||
|
$returnValue = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($source == 'half-points') {
|
||||||
|
if ($target == 'px') {
|
||||||
|
if ($value) {
|
||||||
|
$returnValue = ($value / 2) * $this->conversionFactor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($source == 'pts') {
|
||||||
|
if ($target == 'px') {
|
||||||
|
if ($value) {
|
||||||
|
$returnValue = $value * $this->conversionFactor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($source == 'fifths-percent') {
|
||||||
|
if ($target == '%') {
|
||||||
|
if ($value) {
|
||||||
|
$returnValue = ($value / 50);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// normalize decimal values to use dots
|
||||||
|
$returnValue = str_replace(',', '.', $returnValue);
|
||||||
|
|
||||||
|
return (string)$returnValue . $target;
|
||||||
|
}
|
||||||
|
}
|
182
src/phpdocx/src/Transform/TransformDocAdvLibreOffice.php
Normal file
182
src/phpdocx/src/Transform/TransformDocAdvLibreOffice.php
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
<?php
|
||||||
|
namespace Phpdocx\Transform;
|
||||||
|
|
||||||
|
use Phpdocx\Clean\CleanTemp;
|
||||||
|
use Phpdocx\Create\CreateDocx;
|
||||||
|
use Phpdocx\Logger\PhpdocxLogger;
|
||||||
|
use Phpdocx\Parse\RepairPDF;
|
||||||
|
use Phpdocx\Transform\TransformDocAdv;
|
||||||
|
use Phpdocx\Utilities\PhpdocxUtilities;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform documents using LibreOffice
|
||||||
|
*
|
||||||
|
* @category Phpdocx
|
||||||
|
* @package trasform
|
||||||
|
* @copyright Copyright (c) Narcea Producciones Multimedia S.L.
|
||||||
|
* (http://www.2mdc.com)
|
||||||
|
* @license phpdocx LICENSE
|
||||||
|
* @link https://www.phpdocx.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once dirname(__FILE__) . '/TransformDocAdv.php';
|
||||||
|
|
||||||
|
class TransformDocAdvLibreOffice extends TransformDocAdv
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Calculate and return the document statistics
|
||||||
|
*
|
||||||
|
* @param string $source DOCX document
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getStatistics($source)
|
||||||
|
{
|
||||||
|
if (!file_exists($source)) {
|
||||||
|
PhpdocxLogger::logger('The file not exist', 'fatal');
|
||||||
|
}
|
||||||
|
|
||||||
|
$phpdocxconfig = PhpdocxUtilities::parseConfig();
|
||||||
|
$libreOfficePath = $phpdocxconfig['transform']['path'];
|
||||||
|
|
||||||
|
// storage the output as ASCII text file
|
||||||
|
$tempFile = realpath($source) . uniqid('_txt');
|
||||||
|
|
||||||
|
// run the statistics macro
|
||||||
|
passthru($libreOfficePath . ' --invisible "macro:///Standard.Module1.GetStatistics(' . realpath($source) . ',' . $tempFile . ')" ');
|
||||||
|
|
||||||
|
// parse the statistics and return them
|
||||||
|
$statistics = array();
|
||||||
|
$statisticsFile = fopen($tempFile, 'r');
|
||||||
|
if (!$statisticsFile) {
|
||||||
|
throw new \Exception('Unable to open the stats file.');
|
||||||
|
}
|
||||||
|
while (($statistic = fgets($statisticsFile)) !== false) {
|
||||||
|
$dataStatistic = explode(': ', $statistic);
|
||||||
|
$statistics[$dataStatistic[0]] = $dataStatistic[1];
|
||||||
|
}
|
||||||
|
fclose($statisticsFile);
|
||||||
|
|
||||||
|
return $statistics;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform documents:
|
||||||
|
* DOCX to PDF, HTML, DOC, ODT, PNG, RTF, TXT
|
||||||
|
* DOC to DOCX, PDF, HTML, ODT, PNG, RTF, TXT
|
||||||
|
* ODT to DOCX, PDF, HTML, DOC, PNG, RTF, TXT
|
||||||
|
* RTF to DOCX, PDF, HTML, DOC, ODT, PNG, TXT
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param $source
|
||||||
|
* @param $target
|
||||||
|
* @param array $options :
|
||||||
|
* 'comments' (bool) : false (default) or true. Exports the comments
|
||||||
|
* 'debug' (bool) : false (default) or true. Shows debug information about the plugin conversion
|
||||||
|
* 'formsfields' (bool) : false (default) or true. Exports the form fields
|
||||||
|
* 'homeFolder' (string) : set a custom home folder to be used for the conversions
|
||||||
|
* 'lossless' (bool) : false (default) or true. Lossless compression
|
||||||
|
* 'method' (string) : 'direct' (default), 'script' ; 'direct' method uses passthru and 'script' uses a external script. If you're using Apache and 'direct' doesn't work use 'script'
|
||||||
|
* 'outdir' (string) : set the outdir path. Useful when the PDF output path is not the same than the running script
|
||||||
|
* 'pdfa1' (bool) : false (default) or true. Generates the TOC before exporting the document
|
||||||
|
* 'toc' (bool) : false (default) or true. Generates the TOC before transforming the document
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function transformDocument($source, $target, $options = array())
|
||||||
|
{
|
||||||
|
$allowedExtensionsSource = array('doc', 'docx', 'html', 'odt', 'rtf', 'txt', 'xhtml');
|
||||||
|
$allowedExtensionsTarget = array('doc', 'docx', 'html', 'odt', 'pdf', 'png', 'rtf', 'txt', 'xhtml');
|
||||||
|
|
||||||
|
$filesExtensions = $this->checkSupportedExtension($source, $target, $allowedExtensionsSource, $allowedExtensionsTarget);
|
||||||
|
|
||||||
|
if (!isset($options['method'])) {
|
||||||
|
$options['method'] = 'direct';
|
||||||
|
}
|
||||||
|
if (!isset($options['debug'])) {
|
||||||
|
$options['debug'] = false;
|
||||||
|
}
|
||||||
|
if (!isset($options['toc'])) {
|
||||||
|
$options['toc'] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the file info
|
||||||
|
$sourceFileInfo = pathinfo($source);
|
||||||
|
$sourceExtension = $sourceFileInfo['extension'];
|
||||||
|
|
||||||
|
$phpdocxconfig = PhpdocxUtilities::parseConfig();
|
||||||
|
$libreOfficePath = $phpdocxconfig['transform']['path'];
|
||||||
|
|
||||||
|
$customHomeFolder = false;
|
||||||
|
if (isset($options['homeFolder'])) {
|
||||||
|
$currentHomeFolder = getenv("HOME");
|
||||||
|
putenv("HOME=" . $options['homeFolder']);
|
||||||
|
$customHomeFolder = true;
|
||||||
|
} else if (isset($phpdocxconfig['transform']['home_folder'])) {
|
||||||
|
$currentHomeFolder = getenv("HOME");
|
||||||
|
putenv("HOME=" . $phpdocxconfig['transform']['home_folder']);
|
||||||
|
$customHomeFolder = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set outputstring for debugging
|
||||||
|
$outputDebug = '';
|
||||||
|
if (PHP_OS == 'Linux' || PHP_OS == 'Darwin' || PHP_OS == ' FreeBSD') {
|
||||||
|
if (!$options['debug']) {
|
||||||
|
$outputDebug = ' > /dev/null 2>&1';
|
||||||
|
}
|
||||||
|
} elseif (substr(PHP_OS, 0, 3) == 'Win' || substr(PHP_OS, 0, 3) == 'WIN') {
|
||||||
|
if (!$options['debug']) {
|
||||||
|
$outputDebug = ' > nul 2>&1';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the outdir option is set use it as target path, instead use the dir path
|
||||||
|
if (isset($options['outdir'])) {
|
||||||
|
$outdir = $options['outdir'];
|
||||||
|
} else {
|
||||||
|
$outdir = $sourceFileInfo['dirname'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($options['method'] == 'script') {
|
||||||
|
passthru('php ' . dirname(__FILE__) . '/../lib/convertSimple.php -s ' . $source . ' -e ' . $filesExtensions['targetExtension'] . ' -p ' . $libreOfficePath . ' -t ' . $options['toc'] . ' -o ' . $outdir . $outputDebug);
|
||||||
|
} else {
|
||||||
|
if ((isset($options['toc']) && $options['toc'] === true) && (!isset($options['pdfa1']) || (isset($options['pdfa1']) && $options['pdfa1'] === false))) {
|
||||||
|
if ($filesExtensions['targetExtension'] == 'docx') {
|
||||||
|
// TOC DOCX
|
||||||
|
passthru($libreOfficePath . ' --invisible "macro:///Standard.Module1.SaveToDocxToc(' . realpath($source) . ')" ' . $outputDebug);
|
||||||
|
} else {
|
||||||
|
// TOC PDF
|
||||||
|
passthru($libreOfficePath . ' --invisible "macro:///Standard.Module1.SaveToPdfToc(' . realpath($source) . ')" ' . $outputDebug);
|
||||||
|
}
|
||||||
|
} elseif ((isset($options['toc']) && $options['toc'] === true) && (isset($options['pdfa1']) && $options['pdfa1'] === true)) {
|
||||||
|
// TOC and PDFA-1
|
||||||
|
passthru($libreOfficePath . ' --invisible "macro:///Standard.Module1.SaveToPdfA1Toc(' . realpath($source) . ')" ' . $outputDebug);
|
||||||
|
} elseif ((isset($options['pdfa1']) && $options['pdfa1'] === true) && (!isset($options['toc']) || (!isset($options['toc']) || $options['toc'] === false))) {
|
||||||
|
// PDFA-1
|
||||||
|
passthru($libreOfficePath . ' --invisible "macro:///Standard.Module1.SaveToPdfA1(' . realpath($source) . ')" ' . $outputDebug);
|
||||||
|
} elseif ((isset($options['comments']) && $options['comments'] === true)) {
|
||||||
|
// comments
|
||||||
|
passthru($libreOfficePath . ' --invisible "macro:///Standard.Module1.ExportNotesToPdf(' . realpath($source) . ')" ' . $outputDebug);
|
||||||
|
} elseif ((isset($options['lossless']) && $options['lossless'] === true)) {
|
||||||
|
// lossless
|
||||||
|
passthru($libreOfficePath . ' --invisible "macro:///Standard.Module1.LosslessPdf(' . realpath($source) . ')" ' . $outputDebug);
|
||||||
|
} elseif ((isset($options['formsfields']) && $options['formsfields'] === true)) {
|
||||||
|
// forms fields
|
||||||
|
passthru($libreOfficePath . ' --invisible "macro:///Standard.Module1.ExportFormFieldsToPdf(' . realpath($source) . ')" ' . $outputDebug);
|
||||||
|
} else {
|
||||||
|
// default
|
||||||
|
passthru($libreOfficePath . ' --invisible --convert-to ' . $filesExtensions['targetExtension'] . ' ' . $source . ' --outdir ' . $outdir . $outputDebug);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the converted document, this is the name of the source and the extension
|
||||||
|
$newDocumentPath = $outdir . '/' . $sourceFileInfo['filename'] . '.' . $filesExtensions['targetExtension'];
|
||||||
|
|
||||||
|
// move the document to the guessed destination
|
||||||
|
rename($newDocumentPath, $target);
|
||||||
|
|
||||||
|
// restore the previous HOME value if a custom one has been set
|
||||||
|
if ($customHomeFolder) {
|
||||||
|
putenv("HOME=" . $currentHomeFolder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
150
src/phpdocx/src/Transform/TransformDocAdvMSWord.php
Normal file
150
src/phpdocx/src/Transform/TransformDocAdvMSWord.php
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Phpdocx\Transform;
|
||||||
|
|
||||||
|
use Phpdocx\Logger\PhpdocxLogger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform documents using native PHP classes
|
||||||
|
*
|
||||||
|
* @category Phpdocx
|
||||||
|
* @package trasform
|
||||||
|
* @copyright Copyright (c) Narcea Producciones Multimedia S.L.
|
||||||
|
* (http://www.2mdc.com)
|
||||||
|
* @license phpdocx LICENSE
|
||||||
|
* @link https://www.phpdocx.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once dirname(__FILE__) . '/TransformDocAdv.php';
|
||||||
|
|
||||||
|
class TransformDocAdvMSWord extends TransformDocAdv
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Calculate and return the document statistics
|
||||||
|
*
|
||||||
|
* @param string $source DOCX document
|
||||||
|
* @param array $options :
|
||||||
|
* 'selectedContent' (string) : documents or active (default)
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getStatistics($source, $options = array())
|
||||||
|
{
|
||||||
|
if (!file_exists($source)) {
|
||||||
|
PhpdocxLogger::logger('The file not exist', 'fatal');
|
||||||
|
}
|
||||||
|
|
||||||
|
// statistics
|
||||||
|
$statistics = array();
|
||||||
|
|
||||||
|
// start a Word instance
|
||||||
|
$MSWordInstance = new \COM("word.application") or exit('Check that PHP COM is enabled and a working copy of Word is installed.');
|
||||||
|
|
||||||
|
// check that the version of MS Word is 12 or higher
|
||||||
|
if ($MSWordInstance->Version >= 12) {
|
||||||
|
// hide MS Word
|
||||||
|
$MSWordInstance->Visible = 0;
|
||||||
|
|
||||||
|
// open the source document
|
||||||
|
$MSWordInstance->Documents->Open($source);
|
||||||
|
|
||||||
|
if (isset($options['selectedContent']) && $options['selectedContent'] == 'documents') {
|
||||||
|
$statistics['Characters'] = $MSWordInstance->Documents[1]->ComputeStatistics(3);
|
||||||
|
$statistics['CharactersWithSpaces'] = $MSWordInstance->Documents[1]->ComputeStatistics(5);
|
||||||
|
$statistics['Lines'] = $MSWordInstance->Documents[1]->ComputeStatistics(1);
|
||||||
|
$statistics['Pages'] = $MSWordInstance->Documents[1]->ComputeStatistics(2);
|
||||||
|
$statistics['Paragraphs'] = $MSWordInstance->Documents[1]->ComputeStatistics(4);
|
||||||
|
$statistics['Words'] = $MSWordInstance->Documents[1]->ComputeStatistics(0);
|
||||||
|
|
||||||
|
// close Word
|
||||||
|
$MSWordInstance->Documents[1]->Close();
|
||||||
|
} else {
|
||||||
|
$statistics['Characters'] = $MSWordInstance->ActiveDocument->ComputeStatistics(3);
|
||||||
|
$statistics['CharactersWithSpaces'] = $MSWordInstance->ActiveDocument->ComputeStatistics(5);
|
||||||
|
$statistics['Lines'] = $MSWordInstance->ActiveDocument->ComputeStatistics(1);
|
||||||
|
$statistics['Pages'] = $MSWordInstance->ActiveDocument->ComputeStatistics(2);
|
||||||
|
$statistics['Paragraphs'] = $MSWordInstance->ActiveDocument->ComputeStatistics(4);
|
||||||
|
$statistics['Words'] = $MSWordInstance->ActiveDocument->ComputeStatistics(0);
|
||||||
|
|
||||||
|
// close Word
|
||||||
|
$MSWordInstance->ActiveDocument->Close();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
exit('The version of Word should be 12 (Word 2007) or higher');
|
||||||
|
}
|
||||||
|
$MSWordInstance->Quit();
|
||||||
|
|
||||||
|
$MSWordInstance = null;
|
||||||
|
|
||||||
|
return $statistics;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform documents:
|
||||||
|
* DOCX to PDF, DOC
|
||||||
|
* PDF to DOCX, DOC
|
||||||
|
* DOC to DOCX, PDF
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param $source
|
||||||
|
* @param $target
|
||||||
|
* @param array $options :
|
||||||
|
* 'selectedContent' (string) : documents or active (default)
|
||||||
|
* 'toc' (bool) : false (default) or true. It generates the TOC before transforming the document
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function transformDocument($source, $target, $options = array())
|
||||||
|
{
|
||||||
|
$allowedExtensionsSource = array('doc', 'docx', 'pdf');
|
||||||
|
$allowedExtensionsTarget = array('doc', 'docx', 'pdf');
|
||||||
|
|
||||||
|
$filesExtensions = $this->checkSupportedExtension($source, $target, $allowedExtensionsSource, $allowedExtensionsTarget);
|
||||||
|
|
||||||
|
$code = array(
|
||||||
|
'doc' => new \VARIANT(0, VT_I4),
|
||||||
|
'docx' => new \VARIANT(16, VT_I4),
|
||||||
|
'pdf' => new \VARIANT(17, VT_I4),
|
||||||
|
);
|
||||||
|
|
||||||
|
// start a Word instance
|
||||||
|
$MSWordInstance = new \COM("word.application") or exit('Please check that PHP COM is enabled and a working copy of Word is installed.');
|
||||||
|
|
||||||
|
// check that the version of MS Word is 12 or higher
|
||||||
|
if ($MSWordInstance->Version >= 12) {
|
||||||
|
// hide MS Word
|
||||||
|
$MSWordInstance->Visible = 0;
|
||||||
|
|
||||||
|
// open the source document
|
||||||
|
$MSWordInstance->Documents->Open($source);
|
||||||
|
|
||||||
|
if (isset($options['selectedContent']) && $options['selectedContent'] == 'documents') {
|
||||||
|
// generate the TOC content
|
||||||
|
if (isset($options['toc']) && $options['toc']) {
|
||||||
|
$MSWordInstance->Documents[1]->TablesOfContents(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// save the target document
|
||||||
|
$MSWordInstance->Documents[1]->SaveAs($target, $code[$filesExtensions['targetExtension']]);
|
||||||
|
|
||||||
|
// close Word
|
||||||
|
$MSWordInstance->Documents[1]->Close();
|
||||||
|
} else {
|
||||||
|
// generate the TOC content
|
||||||
|
if (isset($options['toc']) && $options['toc']) {
|
||||||
|
$MSWordInstance->ActiveDocument->TablesOfContents(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// save the target document
|
||||||
|
$MSWordInstance->ActiveDocument->SaveAs($target, $code[$filesExtensions['targetExtension']]);
|
||||||
|
|
||||||
|
// close Word
|
||||||
|
$MSWordInstance->ActiveDocument->Close();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
exit('The version of Word should be 12 (Word 2007) or higher');
|
||||||
|
}
|
||||||
|
$MSWordInstance->Quit();
|
||||||
|
|
||||||
|
$MSWordInstance = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
79
src/phpdocx/src/Transform/TransformDocAdvNative.php
Normal file
79
src/phpdocx/src/Transform/TransformDocAdvNative.php
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Phpdocx\Transform;
|
||||||
|
|
||||||
|
use Phpdocx\Create\CreateDocx as CreateDocx;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform documents using native PHP classes
|
||||||
|
*
|
||||||
|
* @category Phpdocx
|
||||||
|
* @package trasform
|
||||||
|
* @copyright Copyright (c) Narcea Producciones Multimedia S.L.
|
||||||
|
* (http://www.2mdc.com)
|
||||||
|
* @license phpdocx LICENSE
|
||||||
|
* @link https://www.phpdocx.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once dirname(__FILE__) . '/TransformDocAdv.php';
|
||||||
|
|
||||||
|
class TransformDocAdvNative extends TransformDocAdv
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Transform documents:
|
||||||
|
* DOCX to PDF, HTML
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param $source
|
||||||
|
* @param $target
|
||||||
|
* @param array $options :
|
||||||
|
* 'htmlPlugin' (TransformDocAdvHTMLPlugin): plugin to use to do the transformation to HTML. TransformDocAdvHTMLDefaultPlugin as default
|
||||||
|
* 'stream' (bool): enable the stream mode. False as default
|
||||||
|
* @return void or stream
|
||||||
|
*/
|
||||||
|
public function transformDocument($source, $target, $options = array())
|
||||||
|
{
|
||||||
|
$allowedExtensionsSource = array('docx', 'html');
|
||||||
|
$allowedExtensionsTarget = array('html', 'docx', 'pdf');
|
||||||
|
|
||||||
|
$filesExtensions = $this->checkSupportedExtension($source, $target, $allowedExtensionsSource, $allowedExtensionsTarget);
|
||||||
|
|
||||||
|
if ($filesExtensions['sourceExtension'] == 'docx') {
|
||||||
|
if ($filesExtensions['targetExtension'] == 'html') {
|
||||||
|
if (!isset($options['htmlPlugin'])) {
|
||||||
|
$options['htmlPlugin'] = new TransformDocAdvHTMLDefaultPlugin();
|
||||||
|
}
|
||||||
|
|
||||||
|
$transform = new TransformDocAdvHTML($source);
|
||||||
|
$html = $transform->transform($options['htmlPlugin']);
|
||||||
|
|
||||||
|
if ((isset($options['stream']) && $options['stream']) || CreateDocx::$streamMode == true) {
|
||||||
|
// stream mode enabled
|
||||||
|
echo $html;
|
||||||
|
} else {
|
||||||
|
// stream mode disabled, save the document
|
||||||
|
file_put_contents($target, $html);
|
||||||
|
}
|
||||||
|
} else if ($filesExtensions['targetExtension'] == 'pdf') {
|
||||||
|
$transform = new TransformDocAdvPDF($source);
|
||||||
|
$transform->transform($target);
|
||||||
|
}
|
||||||
|
} else if ($filesExtensions['sourceExtension'] == 'html') {
|
||||||
|
if ($filesExtensions['targetExtension'] == 'docx') {
|
||||||
|
$docx = new CreateDocx();
|
||||||
|
$docx->embedHTML(file_get_contents($source));
|
||||||
|
|
||||||
|
$docx->createDocx($target);
|
||||||
|
} else if ($filesExtensions['targetExtension'] == 'pdf') {
|
||||||
|
// first transform HTML to DOCX and then DOCX to PDF
|
||||||
|
$docx = new CreateDocx();
|
||||||
|
$docx->embedHTML(file_get_contents($source));
|
||||||
|
$docx->createDocx($target . '.docx');
|
||||||
|
|
||||||
|
$transform = new TransformDocAdvPDF($source);
|
||||||
|
$transform->transform($target);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
344
src/phpdocx/src/Transform/TransformDocAdvOpenOffice.php
Normal file
344
src/phpdocx/src/Transform/TransformDocAdvOpenOffice.php
Normal file
@ -0,0 +1,344 @@
|
|||||||
|
<?php
|
||||||
|
namespace Phpdocx\Transform;
|
||||||
|
|
||||||
|
use Phpdocx\Clean\CleanTemp;
|
||||||
|
use Phpdocx\Create\CreateDocx;
|
||||||
|
use Phpdocx\Logger\PhpdocxLogger;
|
||||||
|
use Phpdocx\Parse\RepairPDF;
|
||||||
|
use Phpdocx\Transform\TransformDocAdv;
|
||||||
|
use Phpdocx\Utilities\PhpdocxUtilities;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform DOCX to PDF, ODT, SXW, RTF, DOC, TXT, HTML or WIKI using OpenOffice
|
||||||
|
*
|
||||||
|
* @category Phpdocx
|
||||||
|
* @package trasform
|
||||||
|
* @copyright Copyright (c) Narcea Producciones Multimedia S.L.
|
||||||
|
* (http://www.2mdc.com)
|
||||||
|
* @license phpdocx LICENSE
|
||||||
|
* @link https://www.phpdocx.com
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once dirname(__FILE__) . '/TransformDocAdv.php';
|
||||||
|
|
||||||
|
class TransformDocAdvOpenOffice extends TransformDocAdv
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Prepare docx before pdf transformation
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param $source
|
||||||
|
* @param $tempDir
|
||||||
|
* @param $options
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function prepareDocx($source, $tempDir = null, $options)
|
||||||
|
{
|
||||||
|
if ($tempDir === null) {
|
||||||
|
$tempDir = $this->getTempDirPath();
|
||||||
|
$tempName = $tempDir . '/tempDocX_' . uniqid() . '.docx';
|
||||||
|
} else {
|
||||||
|
$tempName = $tempDir . '/tempDocX_' . uniqid() . '.docx';
|
||||||
|
}
|
||||||
|
copy($source, $tempName);
|
||||||
|
|
||||||
|
return $tempName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replace charts as images
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param $source
|
||||||
|
*/
|
||||||
|
public function replaceChartsWithImages($source){
|
||||||
|
$sourceDocx = new \ZipArchive();
|
||||||
|
$sourceDocx->open($source);
|
||||||
|
|
||||||
|
// if jpgraph exists use it, instead use ezComponents
|
||||||
|
if (file_exists(dirname(__FILE__) . '/../lib/jpgraph/')) {
|
||||||
|
$image = new CreateChartImageJpgraph();
|
||||||
|
} else {
|
||||||
|
$image = new CreateChartImageEzComponents();
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the images
|
||||||
|
$image->getChartsDocx($source);
|
||||||
|
$image->parseCharts();
|
||||||
|
$listChartImages = $image->getListImages();
|
||||||
|
if (!is_array($listChartImages)) {
|
||||||
|
$listChartImages = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
// parse de docx and add the images
|
||||||
|
$contentTypesXML = $sourceDocx->getFromName('[Content_Types].xml');
|
||||||
|
|
||||||
|
// get the document.xml.rels file from the DOCX
|
||||||
|
$documentRelsXML = $sourceDocx->getFromName('word/_rels/document.xml.rels');
|
||||||
|
$documentRelsDOM = new \SimpleXMLElement($documentRelsXML);
|
||||||
|
$documentRelsDOM->registerXPathNamespace('ns', 'http://schemas.openxmlformats.org/package/2006/relationships');
|
||||||
|
|
||||||
|
// get the document.xml file from the DOCX
|
||||||
|
$documentXML = $sourceDocx->getFromName('word/document.xml');
|
||||||
|
$documentDOM = new \SimpleXMLElement($documentXML);
|
||||||
|
|
||||||
|
// get the chart elements of the DOM
|
||||||
|
$contentTypesDOM = new \SimpleXMLElement($contentTypesXML);
|
||||||
|
$contentTypesDOM->registerXPathNamespace('ns', 'http://schemas.openxmlformats.org/package/2006/content-types');
|
||||||
|
$elementsCharts = $contentTypesDOM->xpath('ns:Override[@ContentType="application/vnd.openxmlformats-officedocument.drawingml.chart+xml"]');
|
||||||
|
|
||||||
|
// as some nodes are removed, iterate the charts in reverse order
|
||||||
|
//$elementsCharts = array_reverse($elementsCharts);
|
||||||
|
|
||||||
|
// index of the image to be added to the ZIP
|
||||||
|
$indexImage = 0;
|
||||||
|
foreach ($elementsCharts as $value) {
|
||||||
|
// get the attributes of the element
|
||||||
|
$attributes = $value->attributes();
|
||||||
|
|
||||||
|
// get the width and height and add them to the charts array
|
||||||
|
// get the rId of the chart from the documentRels
|
||||||
|
$relationshipChart = $documentRelsDOM->xpath('ns:Relationship[@Target="'.substr($attributes['PartName'], 6).'"]');
|
||||||
|
$documentDOM->registerXPathNamespace('a', 'http://schemas.openxmlformats.org/drawingml/2006/main');
|
||||||
|
$documentDOM->registerXPathNamespace('c', 'http://schemas.openxmlformats.org/drawingml/2006/chart');
|
||||||
|
|
||||||
|
// get the a:graphicData element of the chart
|
||||||
|
$elementAGraphicData = $documentDOM->xpath('//a:graphicData[c:chart[@r:id="'. $relationshipChart[0]->attributes()->Id . '"]]');
|
||||||
|
$elementAGraphicData[0]['uri'] = 'http://schemas.openxmlformats.org/drawingml/2006/picture';
|
||||||
|
|
||||||
|
//get and remove the c:chart child
|
||||||
|
$elementAGraphicData[0]->registerXPathNamespace('c', 'http://schemas.openxmlformats.org/drawingml/2006/chart');
|
||||||
|
$elementCChart = $elementAGraphicData[0]->xpath('//c:chart');
|
||||||
|
//unset($elementCChart[0][0]);
|
||||||
|
|
||||||
|
// remove the chart content keeping w:drawing tag
|
||||||
|
$domElementAGraphicData = dom_import_simplexml($elementAGraphicData[0]);
|
||||||
|
$picture = $this->getTemplateImage(uniqid(), $relationshipChart[0]->attributes()->Id);
|
||||||
|
$pictureFragment = $domElementAGraphicData->ownerDocument->createDocumentFragment();
|
||||||
|
$pictureFragment->appendXML($picture);
|
||||||
|
$domElementAGraphicData->appendChild($pictureFragment);
|
||||||
|
$sourceDocx->addFile($listChartImages[$indexImage], 'word/media/' . $listChartImages[$indexImage]);
|
||||||
|
|
||||||
|
//Modify the Type attribute of document.xml.rels to http://schemas.openxmlformats.org/officeDocument/2006/relationships/image
|
||||||
|
//and the Target to media/'.$listChartImages[$indexImage]
|
||||||
|
$relsImage = $documentRelsDOM->xpath('//ns:Relationship[@Id="'. $relationshipChart[0]->attributes()->Id.'"]');
|
||||||
|
$relsImage[0]['Type'] = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image';
|
||||||
|
$relsImage[0]['Target'] = 'media/' . $listChartImages[$indexImage];
|
||||||
|
|
||||||
|
$indexImage++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// save the modified document.xml.rels file
|
||||||
|
$docXML = $documentDOM->asXML();
|
||||||
|
$docXML = str_replace('<pic:pic xmlns:r="http://schemas.openxmlformats.org/package/2006/relationships" xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">', '<pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">', $docXML);
|
||||||
|
$docXML = str_replace('<pic:pic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">', '<pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">', $docXML);
|
||||||
|
$docXML = str_replace('<pic:pic xmlns:r="http://schemas.openxmlformats.org/package/2006/relationships" xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture"', '<pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">', $docXML);
|
||||||
|
$sourceDocx->addFromString('word/document.xml', $docXML);
|
||||||
|
|
||||||
|
// save the modified document.xml.rels file
|
||||||
|
$relsDoc = $documentRelsDOM->asXML();
|
||||||
|
$sourceDocx->addFromString('word/_rels/document.xml.rels', $relsDoc);
|
||||||
|
|
||||||
|
// make sure that there is the associated content type "png"
|
||||||
|
$position = strpos('Extension="png"', $contentTypesXML);
|
||||||
|
if($position === false){
|
||||||
|
$contentTypesXML = str_replace('</Types>', '<Default Extension="png" ContentType="image/png"/></Types>', $contentTypesXML);
|
||||||
|
$sourceDocx->addFromString('[Content_Types].xml', $contentTypesXML);
|
||||||
|
}
|
||||||
|
// close the zip
|
||||||
|
$sourceDocx->close();
|
||||||
|
|
||||||
|
// remove the generated images
|
||||||
|
foreach ($listChartImages as $listChartImage) {
|
||||||
|
unlink($listChartImage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To add support of sys_get_temp_dir for PHP versions under 5.2.1
|
||||||
|
*
|
||||||
|
* @access protected
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function getTempDirPath()
|
||||||
|
{
|
||||||
|
if ($this->phpdocxconfig['settings']['temp_path']) {
|
||||||
|
return $this->phpdocxconfig['settings']['temp_path'];
|
||||||
|
}
|
||||||
|
if (!function_exists('sys_get_temp_dir')) {
|
||||||
|
|
||||||
|
function sys_get_temp_dir()
|
||||||
|
{
|
||||||
|
if ($temp = getenv('TMP')) {
|
||||||
|
return $temp;
|
||||||
|
}
|
||||||
|
if ($temp = getenv('TEMP')) {
|
||||||
|
return $temp;
|
||||||
|
}
|
||||||
|
if ($temp = getenv('TMPDIR')) {
|
||||||
|
return $temp;
|
||||||
|
}
|
||||||
|
$temp = tempnam(__FILE__, '');
|
||||||
|
if (file_exists($temp)) {
|
||||||
|
unlink($temp);
|
||||||
|
return dirname($temp);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
return sys_get_temp_dir();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected function getTemplateImage($name, $id)
|
||||||
|
{
|
||||||
|
$templateImage = '<pic:pic xmlns:r="http://schemas.openxmlformats.org/package/2006/relationships" xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
|
||||||
|
<pic:nvPicPr>
|
||||||
|
<pic:cNvPr id="0" name="' . $name .'"/>
|
||||||
|
<pic:cNvPicPr/>
|
||||||
|
</pic:nvPicPr>
|
||||||
|
<pic:blipFill>
|
||||||
|
<a:blip r:embed="' . $id . '"/>
|
||||||
|
<a:stretch>
|
||||||
|
<a:fillRect/>
|
||||||
|
</a:stretch>
|
||||||
|
</pic:blipFill>
|
||||||
|
<pic:spPr>
|
||||||
|
<a:xfrm>
|
||||||
|
<a:off x="0" y="0"/>
|
||||||
|
<a:ext cx="4876800" cy="3657600"/>
|
||||||
|
</a:xfrm>
|
||||||
|
<a:prstGeom prst="rect">
|
||||||
|
<a:avLst/>
|
||||||
|
</a:prstGeom>
|
||||||
|
</pic:spPr>
|
||||||
|
</pic:pic>';
|
||||||
|
return $templateImage;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform all documents supported by OpenOffice
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param $source
|
||||||
|
* @param $target
|
||||||
|
* @param array $options :
|
||||||
|
* 'debug' (bool) : false (default) or true. It shows debug information about the plugin conversion
|
||||||
|
* 'homeFolder' (string) : set a custom home folder to be used for the conversions
|
||||||
|
* 'method' (string) : 'direct' (default), 'script' ; 'direct' method uses passthru and 'script' uses a external script. If you're using Apache and 'direct' doesn't work use 'script'
|
||||||
|
* 'odfconverter' (bool) : true (default) or false. Use odf-converter to preproccess documents
|
||||||
|
* 'tempDir' (string) : uses a custom temp folder
|
||||||
|
* 'version' (string) : 32-bit or 64-bit architecture. 32, 64 or null (default). If null autodetect
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function transformDocument($source, $target, $options = array())
|
||||||
|
{
|
||||||
|
$allowedExtensionsSource = array('doc', 'docx', 'html', 'odt', 'rtf', 'txt', 'xhtml');
|
||||||
|
$allowedExtensionsTarget = array('doc', 'docx', 'html', 'odt', 'pdf', 'rtf', 'txt', 'xhtml');
|
||||||
|
|
||||||
|
$filesExtensions = $this->checkSupportedExtension($source, $target, $allowedExtensionsSource, $allowedExtensionsTarget);
|
||||||
|
|
||||||
|
// get the file info
|
||||||
|
$sourceFileInfo = pathinfo($source);
|
||||||
|
$sourceExtension = $sourceFileInfo['extension'];
|
||||||
|
|
||||||
|
if (!isset($options['method'])) {
|
||||||
|
$options['method'] = 'direct';
|
||||||
|
}
|
||||||
|
if (!isset($options['odfconverter'])) {
|
||||||
|
$options['odfconverter'] = true;
|
||||||
|
}
|
||||||
|
if (!isset($options['debug'])) {
|
||||||
|
$options['debug'] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$tempDir = null;
|
||||||
|
if (isset($options['tempDir'])) {
|
||||||
|
$tempDir = $options['tempDir'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$version = '64';
|
||||||
|
if (isset($options['version'])) {
|
||||||
|
$version = $options['version'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($options['homeFolder'])) {
|
||||||
|
$currentHomeFolder = getenv("HOME");
|
||||||
|
putenv("HOME=" . $options['homeFolder']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($sourceExtension == 'docx') {
|
||||||
|
// set path to OdfConverter: 32-bit or 64-bit
|
||||||
|
$odfconverterPath = '';
|
||||||
|
// set outputstring for debugging
|
||||||
|
$outputDebug = '';
|
||||||
|
if (PHP_OS == 'Linux') {
|
||||||
|
if (!$options['debug']) {
|
||||||
|
$outputDebug = ' > /dev/null 2>&1';
|
||||||
|
}
|
||||||
|
if ($version == '32') {
|
||||||
|
$odfconverterPath = '/../../../lib/OdfConverter/32/OdfConverter';
|
||||||
|
} elseif ($version == '64') {
|
||||||
|
$odfconverterPath = '/../../../lib/OdfConverter/64/OdfConverter';
|
||||||
|
} else {
|
||||||
|
// detect if 32bit or 64bit
|
||||||
|
if (PHP_INT_SIZE * 8 == 64) {
|
||||||
|
$odfconverterPath = '/../../../lib/OdfConverter/64/OdfConverter';
|
||||||
|
} else {
|
||||||
|
$odfconverterPath = '/../../../lib/OdfConverter/32/OdfConverter';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} elseif (substr(PHP_OS, 0, 3) == 'Win' || substr(PHP_OS, 0, 3) == 'WIN') {
|
||||||
|
if (!$options['debug']) {
|
||||||
|
$outputDebug = ' > nul 2>&1';
|
||||||
|
}
|
||||||
|
$odfconverterPath = '/../../../lib/OdfConverter/Windows/OdfConverter.exe';
|
||||||
|
}
|
||||||
|
|
||||||
|
$newDocx = $this->prepareDocx($source, $tempDir, $options);
|
||||||
|
|
||||||
|
if (file_exists(dirname(__FILE__) . '/CreateChartImage.php') && (file_exists(dirname(__FILE__) . '/../../../lib/jpgraph/') || file_exists(dirname(__FILE__) . '/../../../lib/ezcomponents'))) {
|
||||||
|
$this->replaceChartsWithImages($newDocx);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($tempDir === null) {
|
||||||
|
$tempDir = $this->getTempDirPath();
|
||||||
|
$tempDoc = $tempDir . '/tempOdt_' . uniqid() . '.odt';
|
||||||
|
} else {
|
||||||
|
$tempDoc = $tempDir . '/tempOdt_' . uniqid() . '.odt';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($options['method'] == 'script') {
|
||||||
|
passthru('php ' . dirname(__FILE__) . '/../../../lib/convert.php -s ' . $newDocx . ' -t ' . $tempDoc . ' -d ' . $docDestination . ' -o ' . $options['odfconverter'] . ' -p ' . $odfconverterPath . $outputDebug);
|
||||||
|
} else {
|
||||||
|
if ($extension != 'rtf' && $options['odfconverter']) {
|
||||||
|
passthru(dirname(__FILE__) . $odfconverterPath . ' /I ' . $newDocx . ' /O ' . $tempDoc . $outputDebug);
|
||||||
|
} else {
|
||||||
|
copy($source, $tempDoc);
|
||||||
|
}
|
||||||
|
// How to start OpenOffice in headless mode: lib/openoffice/openoffice.org3/program/soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard;
|
||||||
|
passthru('java -jar ' . dirname(__FILE__) . '/../../../lib/openoffice/jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar ' . $tempDoc . ' ' . $docDestination . $outputDebug);
|
||||||
|
}
|
||||||
|
|
||||||
|
CleanTemp::clean($tempDoc);
|
||||||
|
} else {
|
||||||
|
if ($options['method'] == 'script') {
|
||||||
|
passthru('php ' . dirname(__FILE__) . '/../../../lib/convert.php -s ' . $source . ' -d ' . $docDestination . $outputDebug);
|
||||||
|
} else {
|
||||||
|
// how to start OpenOffice in headless mode: lib/openoffice/openoffice.org3/program/soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard;
|
||||||
|
passthru('java -jar ' . dirname(__FILE__) . '/../../../lib/openoffice/jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar ' . $source . ' ' . $docDestination . $outputDebug);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// restore the previous HOME value
|
||||||
|
if (isset($options['homeFolder'])) {
|
||||||
|
putenv("HOME=" . $currentHomeFolder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
3007
src/phpdocx/src/Transform/TransformDocAdvPDF.php
Normal file
3007
src/phpdocx/src/Transform/TransformDocAdvPDF.php
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user