Works on odt generation

This commit is contained in:
Laurent Destailleur 2010-05-12 17:15:02 +00:00
parent 9bb9558aab
commit dbaaa179c0

View File

@ -9,7 +9,7 @@ class OdfException extends Exception
* Encoding : ISO-8859-1 * Encoding : ISO-8859-1
* Last commit by $Author$ * Last commit by $Author$
* Date - $Date$ * Date - $Date$
* SVN Revision - $Rev: 42 $ * SVN Revision - $Rev: 56 $
* Id : $Id$ * Id : $Id$
* *
* @copyright GPL License 2008 - Julien Pauli - Cyril PIERRE de GEYER - Anaska (http://www.anaska.com) * @copyright GPL License 2008 - Julien Pauli - Cyril PIERRE de GEYER - Anaska (http://www.anaska.com)
@ -26,9 +26,10 @@ class Odf
'PATH_TO_TMP' => '/tmp' 'PATH_TO_TMP' => '/tmp'
); );
protected $file; protected $file;
protected $contentXml; protected $contentXml; // To store content of content.xml file
protected $manifestXml; // To store content of META-INF/manifest.xml file
protected $tmpfile; protected $tmpfile;
protected $tmpdir; protected $tmpdir='';
protected $images = array(); protected $images = array();
protected $vars = array(); protected $vars = array();
protected $segments = array(); protected $segments = array();
@ -53,7 +54,7 @@ class Odf
} }
$md5uniqid = md5(uniqid()); $md5uniqid = md5(uniqid());
if ($this->config['PATH_TO_TMP']) $this->tmpdir = preg_replace('|[\/]$|','',$this->config['PATH_TO_TMP']); if ($this->config['PATH_TO_TMP']) $this->tmpdir = preg_replace('|[\/]$|','',$this->config['PATH_TO_TMP']); // Remove last \ or /
$this->tmpdir .= ($this->tmpdir?'/':'').$md5uniqid; $this->tmpdir .= ($this->tmpdir?'/':'').$md5uniqid;
$this->tmpfile = $this->tmpdir.'/'.$md5uniqid.'.odt'; // We keep .odt extension to allow OpenOffice usage during debug. $this->tmpfile = $this->tmpdir.'/'.$md5uniqid.'.odt'; // We keep .odt extension to allow OpenOffice usage during debug.
@ -69,20 +70,25 @@ class Odf
// Load zip proxy // Load zip proxy
$zipHandler = $this->config['ZIP_PROXY']; $zipHandler = $this->config['ZIP_PROXY'];
define('PCLZIP_TEMPORARY_DIR',$this->tmpdir); if (!defined('PCLZIP_TEMPORARY_DIR')) define('PCLZIP_TEMPORARY_DIR',$this->tmpdir);
include_once('zip/'.$zipHandler.'.php'); include_once('zip/'.$zipHandler.'.php');
if (! class_exists($this->config['ZIP_PROXY'])) { if (! class_exists($this->config['ZIP_PROXY'])) {
throw new OdfException($this->config['ZIP_PROXY'] . ' class not found - check your php settings'); throw new OdfException($this->config['ZIP_PROXY'] . ' class not found - check your php settings');
} }
$this->file = new $zipHandler($this->tmpdir); $this->file = new $zipHandler($this->tmpdir);
if ($this->file->open($filename) !== true) { // This also create the tmpdir directory if ($this->file->open($filename) !== true) { // This also create the tmpdir directory
throw new OdfException("Error while Opening the file '$filename' - Check your odt file"); throw new OdfException("Error while Opening the file '$filename' - Check your odt filename");
} }
if (($this->contentXml = $this->file->getFromName('content.xml')) === false) { if (($this->contentXml = $this->file->getFromName('content.xml')) === false) {
throw new OdfException("Nothing to parse - check that the content.xml file is correctly formed"); throw new OdfException("Nothing to parse - Check that the content.xml file is correctly formed in source file '$filename'");
} }
$this->file->close(); // This also remove the tmpdir directory if (($this->manifestXml = $this->file->getFromName('META-INF/manifest.xml')) === false) {
throw new OdfException("Something is wrong with META-INF/manifest.xm in source file '$filename'");
}
$this->file->close();
//print "tmpdir=".$tmpdir; //print "tmpdir=".$tmpdir;
//print "filename=".$filename; //print "filename=".$filename;
@ -112,6 +118,7 @@ class Odf
$this->vars[$this->config['DELIMITER_LEFT'] . $key . $this->config['DELIMITER_RIGHT']] = str_replace("\n", "<text:line-break/>", $value); $this->vars[$this->config['DELIMITER_LEFT'] . $key . $this->config['DELIMITER_RIGHT']] = str_replace("\n", "<text:line-break/>", $value);
return $this; return $this;
} }
/** /**
* Assign a template variable as a picture * Assign a template variable as a picture
* *
@ -138,6 +145,7 @@ IMG;
$this->setVars($key, $xml, false); $this->setVars($key, $xml, false);
return $this; return $this;
} }
/** /**
* Move segment tags for lines of tables * Move segment tags for lines of tables
* Called automatically within the constructor * Called automatically within the constructor
@ -166,6 +174,7 @@ IMG;
} }
} }
} }
/** /**
* Merge template variables * Merge template variables
* Called automatically for a save * Called automatically for a save
@ -176,6 +185,7 @@ IMG;
{ {
$this->contentXml = str_replace(array_keys($this->vars), array_values($this->vars), $this->contentXml); $this->contentXml = str_replace(array_keys($this->vars), array_values($this->vars), $this->contentXml);
} }
/** /**
* Add the merged segment to the document * Add the merged segment to the document
* *
@ -194,6 +204,7 @@ IMG;
$this->contentXml = preg_replace($reg, $segment->getXmlParsed(), $this->contentXml); $this->contentXml = preg_replace($reg, $segment->getXmlParsed(), $this->contentXml);
return $this; return $this;
} }
/** /**
* Display all the current template variables * Display all the current template variables
* *
@ -203,6 +214,7 @@ IMG;
{ {
return print_r('<pre>' . print_r($this->vars, true) . '</pre>', true); return print_r('<pre>' . print_r($this->vars, true) . '</pre>', true);
} }
/** /**
* Display the XML content of the file from odt document * Display the XML content of the file from odt document
* as it is at the moment * as it is at the moment
@ -213,6 +225,7 @@ IMG;
{ {
return $this->contentXml; return $this->contentXml;
} }
/** /**
* Display loop segments declared with setSegment() * Display loop segments declared with setSegment()
* *
@ -222,6 +235,7 @@ IMG;
{ {
return '<pre>' . print_r(implode(' ', array_keys($this->segments)), true) . '</pre>'; return '<pre>' . print_r(implode(' ', array_keys($this->segments)), true) . '</pre>';
} }
/** /**
* Declare a segment in order to use it in a loop * Declare a segment in order to use it in a loop
* *
@ -261,8 +275,9 @@ IMG;
$this->_save(); $this->_save();
} }
} }
/** /**
* Internal save * Write output file onto disk
* *
* @throws OdfException * @throws OdfException
* @return void * @return void
@ -276,9 +291,26 @@ IMG;
} }
foreach ($this->images as $imageKey => $imageValue) { foreach ($this->images as $imageKey => $imageValue) {
$this->file->addFile($imageKey, 'Pictures/' . $imageValue); $this->file->addFile($imageKey, 'Pictures/' . $imageValue);
$this->addImageToManifest($imageValue);
}
if (! $this->file->addFromString('./META-INF/manifest.xml', $this->manifestXml)) {
throw new OdfException('Error during file export: manifest.xml');
} }
$this->file->close(); $this->file->close();
} }
/**
* Update Manifest file according to added image files
*
* @param string $file Image file to add into manifest content
*/
public function addImageToManifest($file)
{
$extension = explode('.', $file);
$add = ' <manifest:file-entry manifest:media-type="image/'.$extension[1].'" manifest:full-path="Pictures/'.$file.'"/>'."\n";
$this->manifestXml = str_replace('</manifest:manifest>', $add.'</manifest:manifest>', $this->manifestXml);
}
/** /**
* Export the file as attached file by HTTP * Export the file as attached file by HTTP
* *