Debug to make MAIN_ODT_AS_PDF workign with unoconv
This commit is contained in:
parent
f93ecc1584
commit
d404d8be9f
@ -36,14 +36,14 @@ class Odf
|
|||||||
protected $images = array();
|
protected $images = array();
|
||||||
protected $vars = array();
|
protected $vars = array();
|
||||||
protected $segments = array();
|
protected $segments = array();
|
||||||
|
|
||||||
public $creator;
|
public $creator;
|
||||||
public $title;
|
public $title;
|
||||||
public $subject;
|
public $subject;
|
||||||
public $userdefined=array();
|
public $userdefined=array();
|
||||||
|
|
||||||
const PIXEL_TO_CM = 0.026458333;
|
const PIXEL_TO_CM = 0.026458333;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class constructor
|
* Class constructor
|
||||||
*
|
*
|
||||||
@ -113,7 +113,7 @@ class Odf
|
|||||||
|
|
||||||
copy($filename, $this->tmpfile);
|
copy($filename, $this->tmpfile);
|
||||||
|
|
||||||
// Now file has been loaded, we must move the [!-- BEGIN and [!-- END tags outside the
|
// Now file has been loaded, we must move the [!-- BEGIN and [!-- END tags outside the
|
||||||
// <table:table-row tag and clean bad lines tags.
|
// <table:table-row tag and clean bad lines tags.
|
||||||
$this->_moveRowSegments();
|
$this->_moveRowSegments();
|
||||||
}
|
}
|
||||||
@ -124,7 +124,7 @@ class Odf
|
|||||||
* @param string $key Name of the variable within the template
|
* @param string $key Name of the variable within the template
|
||||||
* @param string $value Replacement value
|
* @param string $value Replacement value
|
||||||
* @param bool $encode If true, special XML characters are encoded
|
* @param bool $encode If true, special XML characters are encoded
|
||||||
* @param string $charset Charset
|
* @param string $charset Charset
|
||||||
* @throws OdfException
|
* @throws OdfException
|
||||||
* @return odf
|
* @return odf
|
||||||
*/
|
*/
|
||||||
@ -211,7 +211,7 @@ class Odf
|
|||||||
{
|
{
|
||||||
preg_match_all('/[\{\<]\?(php)?\s+(?P<content>.+)\?[\}\>]/iU',$this->contentXml, $matches); // detecting all {?php code ?} or <?php code ? >
|
preg_match_all('/[\{\<]\?(php)?\s+(?P<content>.+)\?[\}\>]/iU',$this->contentXml, $matches); // detecting all {?php code ?} or <?php code ? >
|
||||||
$nbfound=count($matches['content']);
|
$nbfound=count($matches['content']);
|
||||||
for ($i=0; $i < $nbfound; $i++)
|
for ($i=0; $i < $nbfound; $i++)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
$ob_output = ''; // flush the output for each code. This var will be filled in by the eval($code) and output buffering : any print or echo or output will be redirected into this variable
|
$ob_output = ''; // flush the output for each code. This var will be filled in by the eval($code) and output buffering : any print or echo or output will be redirected into this variable
|
||||||
@ -268,7 +268,7 @@ IMG;
|
|||||||
$this->contentXml = preg_replace('/\[!--\sBEGIN<text:s[^>]>(row.[\S]*)\s--\]/sm', '[!-- BEGIN \\1 --]', $this->contentXml);
|
$this->contentXml = preg_replace('/\[!--\sBEGIN<text:s[^>]>(row.[\S]*)\s--\]/sm', '[!-- BEGIN \\1 --]', $this->contentXml);
|
||||||
// Replace END<text:s/>xxx into END xxx
|
// Replace END<text:s/>xxx into END xxx
|
||||||
$this->contentXml = preg_replace('/\[!--\sEND<text:s[^>]>(row.[\S]*)\s--\]/sm', '[!-- END \\1 --]', $this->contentXml);
|
$this->contentXml = preg_replace('/\[!--\sEND<text:s[^>]>(row.[\S]*)\s--\]/sm', '[!-- END \\1 --]', $this->contentXml);
|
||||||
|
|
||||||
// Search all possible rows in the document
|
// Search all possible rows in the document
|
||||||
$reg1 = "#<table:table-row[^>]*>(.*)</table:table-row>#smU";
|
$reg1 = "#<table:table-row[^>]*>(.*)</table:table-row>#smU";
|
||||||
preg_match_all($reg1, $this->contentXml, $matches);
|
preg_match_all($reg1, $this->contentXml, $matches);
|
||||||
@ -302,7 +302,7 @@ IMG;
|
|||||||
// Search all tags fou into condition to complete $this->vars, so we will proceed all tests even if not defined
|
// Search all tags fou into condition to complete $this->vars, so we will proceed all tests even if not defined
|
||||||
$reg='@\[!--\sIF\s([{}a-zA-Z0-9\.\,_]+)\s--\]@smU';
|
$reg='@\[!--\sIF\s([{}a-zA-Z0-9\.\,_]+)\s--\]@smU';
|
||||||
preg_match_all($reg, $this->contentXml, $matches, PREG_SET_ORDER);
|
preg_match_all($reg, $this->contentXml, $matches, PREG_SET_ORDER);
|
||||||
|
|
||||||
//var_dump($this->vars);exit;
|
//var_dump($this->vars);exit;
|
||||||
foreach($matches as $match) // For each match, if there is no entry into this->vars, we add it
|
foreach($matches as $match) // For each match, if there is no entry into this->vars, we add it
|
||||||
{
|
{
|
||||||
@ -312,7 +312,7 @@ IMG;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
//var_dump($this->vars);exit;
|
//var_dump($this->vars);exit;
|
||||||
|
|
||||||
// Conditionals substitution
|
// Conditionals substitution
|
||||||
// Note: must be done before static substitution, else the variable will be replaced by its value and the conditional won't work anymore
|
// Note: must be done before static substitution, else the variable will be replaced by its value and the conditional won't work anymore
|
||||||
foreach($this->vars as $key => $value)
|
foreach($this->vars as $key => $value)
|
||||||
@ -358,7 +358,7 @@ IMG;
|
|||||||
if ($type == 'content') $this->contentXml = str_replace(array_keys($this->vars), array_values($this->vars), $this->contentXml);
|
if ($type == 'content') $this->contentXml = str_replace(array_keys($this->vars), array_values($this->vars), $this->contentXml);
|
||||||
if ($type == 'styles') $this->stylesXml = str_replace(array_keys($this->vars), array_values($this->vars), $this->stylesXml);
|
if ($type == 'styles') $this->stylesXml = str_replace(array_keys($this->vars), array_values($this->vars), $this->stylesXml);
|
||||||
if ($type == 'meta') $this->metaXml = str_replace(array_keys($this->vars), array_values($this->vars), $this->metaXml);
|
if ($type == 'meta') $this->metaXml = str_replace(array_keys($this->vars), array_values($this->vars), $this->metaXml);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -467,7 +467,7 @@ IMG;
|
|||||||
|
|
||||||
$this->setMetaData();
|
$this->setMetaData();
|
||||||
//print $this->metaXml;exit;
|
//print $this->metaXml;exit;
|
||||||
|
|
||||||
if (! $this->file->addFromString('content.xml', $this->contentXml)) {
|
if (! $this->file->addFromString('content.xml', $this->contentXml)) {
|
||||||
throw new OdfException('Error during file export addFromString content');
|
throw new OdfException('Error during file export addFromString content');
|
||||||
}
|
}
|
||||||
@ -477,7 +477,7 @@ IMG;
|
|||||||
if (! $this->file->addFromString('styles.xml', $this->stylesXml)) {
|
if (! $this->file->addFromString('styles.xml', $this->stylesXml)) {
|
||||||
throw new OdfException('Error during file export addFromString styles');
|
throw new OdfException('Error during file export addFromString styles');
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($this->images as $imageKey => $imageValue) {
|
foreach ($this->images as $imageKey => $imageValue) {
|
||||||
// Add the image inside the ODT document
|
// Add the image inside the ODT document
|
||||||
$this->file->addFile($imageKey, 'Pictures/' . $imageValue);
|
$this->file->addFile($imageKey, 'Pictures/' . $imageValue);
|
||||||
@ -499,12 +499,12 @@ IMG;
|
|||||||
public function setMetaData()
|
public function setMetaData()
|
||||||
{
|
{
|
||||||
if (empty($this->creator)) $this->creator='';
|
if (empty($this->creator)) $this->creator='';
|
||||||
|
|
||||||
$this->metaXml = preg_replace('/<dc:date>.*<\/dc:date>/', '<dc:date>'.gmdate("Y-m-d\TH:i:s").'</dc:date>', $this->metaXml);
|
$this->metaXml = preg_replace('/<dc:date>.*<\/dc:date>/', '<dc:date>'.gmdate("Y-m-d\TH:i:s").'</dc:date>', $this->metaXml);
|
||||||
$this->metaXml = preg_replace('/<dc:creator>.*<\/dc:creator>/', '<dc:creator>'.htmlspecialchars($this->creator).'</dc:creator>', $this->metaXml);
|
$this->metaXml = preg_replace('/<dc:creator>.*<\/dc:creator>/', '<dc:creator>'.htmlspecialchars($this->creator).'</dc:creator>', $this->metaXml);
|
||||||
$this->metaXml = preg_replace('/<dc:title>.*<\/dc:title>/', '<dc:title>'.htmlspecialchars($this->title).'</dc:title>', $this->metaXml);
|
$this->metaXml = preg_replace('/<dc:title>.*<\/dc:title>/', '<dc:title>'.htmlspecialchars($this->title).'</dc:title>', $this->metaXml);
|
||||||
$this->metaXml = preg_replace('/<dc:subject>.*<\/dc:subject>/', '<dc:subject>'.htmlspecialchars($this->subject).'</dc:subject>', $this->metaXml);
|
$this->metaXml = preg_replace('/<dc:subject>.*<\/dc:subject>/', '<dc:subject>'.htmlspecialchars($this->subject).'</dc:subject>', $this->metaXml);
|
||||||
|
|
||||||
if (count($this->userdefined))
|
if (count($this->userdefined))
|
||||||
{
|
{
|
||||||
foreach($this->userdefined as $key => $val)
|
foreach($this->userdefined as $key => $val)
|
||||||
@ -515,7 +515,7 @@ IMG;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update Manifest file according to added image files
|
* Update Manifest file according to added image files
|
||||||
*
|
*
|
||||||
@ -569,24 +569,58 @@ IMG;
|
|||||||
{
|
{
|
||||||
global $conf;
|
global $conf;
|
||||||
|
|
||||||
if( $name == "" ) $name = md5(uniqid());
|
if( $name == "" ) $name = "temp".md5(uniqid());
|
||||||
|
|
||||||
dol_syslog(get_class($this).'::exportAsAttachedPDF $name='.$name, LOG_DEBUG);
|
dol_syslog(get_class($this).'::exportAsAttachedPDF $name='.$name, LOG_DEBUG);
|
||||||
$this->saveToDisk($name);
|
$this->saveToDisk($name);
|
||||||
|
|
||||||
$execmethod=(empty($conf->global->MAIN_EXEC_USE_POPEN)?1:2); // 1 or 2
|
$execmethod=(empty($conf->global->MAIN_EXEC_USE_POPEN)?1:2); // 1 or 2
|
||||||
|
// Method 1 sometimes hang the server.
|
||||||
|
|
||||||
$name=preg_replace('/\.odt/i', '', $name);
|
if (preg_match('/unoconv/', $conf->global->MAIN_ODT_AS_PDF))
|
||||||
if (!empty($conf->global->MAIN_DOL_SCRIPTS_ROOT))
|
|
||||||
{
|
{
|
||||||
$command = $conf->global->MAIN_DOL_SCRIPTS_ROOT.'/scripts/odt2pdf/odt2pdf.sh '.escapeshellcmd($name).' '.(is_numeric($conf->global->MAIN_ODT_AS_PDF)?'jodconverter':$conf->global->MAIN_ODT_AS_PDF);
|
// If issue with unoconv, see https://github.com/dagwieers/unoconv/issues/87
|
||||||
|
|
||||||
|
// MAIN_ODT_AS_PDF should be "sudo -u unoconv /usr/bin/unoconv" and userunoconv must have sudo to be root by adding file /etc/sudoers.d/unoconv with content www-data ALL=(unoconv) NOPASSWD: /usr/bin/unoconv .
|
||||||
|
|
||||||
|
// Try this with www-data user: /usr/bin/unoconv -vvvv -f pdf /tmp/document-example.odt
|
||||||
|
// It must return:
|
||||||
|
//Verbosity set to level 4
|
||||||
|
//Using office base path: /usr/lib/libreoffice
|
||||||
|
//Using office binary path: /usr/lib/libreoffice/program
|
||||||
|
//DEBUG: Connection type: socket,host=127.0.0.1,port=2002;urp;StarOffice.ComponentContext
|
||||||
|
//DEBUG: Existing listener not found.
|
||||||
|
//DEBUG: Launching our own listener using /usr/lib/libreoffice/program/soffice.bin.
|
||||||
|
//LibreOffice listener successfully started. (pid=9287)
|
||||||
|
//Input file: /tmp/document-example.odt
|
||||||
|
//unoconv: file `/tmp/document-example.odt' does not exist.
|
||||||
|
//unoconv: RuntimeException during import phase:
|
||||||
|
//Office probably died. Unsupported URL <file:///tmp/document-example.odt>: "type detection failed"
|
||||||
|
//DEBUG: Terminating LibreOffice instance.
|
||||||
|
//DEBUG: Waiting for LibreOffice instance to exit
|
||||||
|
|
||||||
|
// It fails:
|
||||||
|
// - set shel of user to bash instead of nologin.
|
||||||
|
// - set permission to read/write to user on home directory /var/www so user can create the libreoffice , dconf and .cache dir and files then set permission back
|
||||||
|
|
||||||
|
$command = $conf->global->MAIN_ODT_AS_PDF.' '.escapeshellcmd($name);
|
||||||
|
//$command = '/usr/bin/unoconv -vvv '.escapeshellcmd($name);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dol_syslog(get_class($this).'::exportAsAttachedPDF is used but the constant MAIN_DOL_SCRIPTS_ROOT with path to script directory was not defined.', LOG_WARNING);
|
// deprecated old method
|
||||||
$command = '../../scripts/odt2pdf/odt2pdf.sh '.escapeshellcmd($name).' '.(is_numeric($conf->global->MAIN_ODT_AS_PDF)?'jodconverter':$conf->global->MAIN_ODT_AS_PDF);
|
$name=preg_replace('/\.odt/i', '', $name);
|
||||||
}
|
|
||||||
|
|
||||||
|
if (!empty($conf->global->MAIN_DOL_SCRIPTS_ROOT))
|
||||||
|
{
|
||||||
|
$command = $conf->global->MAIN_DOL_SCRIPTS_ROOT.'/scripts/odt2pdf/odt2pdf.sh '.escapeshellcmd($name).' '.(is_numeric($conf->global->MAIN_ODT_AS_PDF)?'jodconverter':$conf->global->MAIN_ODT_AS_PDF);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dol_syslog(get_class($this).'::exportAsAttachedPDF is used but the constant MAIN_DOL_SCRIPTS_ROOT with path to script directory was not defined.', LOG_WARNING);
|
||||||
|
$command = '../../scripts/odt2pdf/odt2pdf.sh '.escapeshellcmd($name).' '.(is_numeric($conf->global->MAIN_ODT_AS_PDF)?'jodconverter':$conf->global->MAIN_ODT_AS_PDF);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//$dirname=dirname($name);
|
//$dirname=dirname($name);
|
||||||
//$command = DOL_DOCUMENT_ROOT.'/includes/odtphp/odt2pdf.sh '.$name.' '.$dirname;
|
//$command = DOL_DOCUMENT_ROOT.'/includes/odtphp/odt2pdf.sh '.$name.' '.$dirname;
|
||||||
@ -598,16 +632,19 @@ IMG;
|
|||||||
}
|
}
|
||||||
if ($execmethod == 2)
|
if ($execmethod == 2)
|
||||||
{
|
{
|
||||||
|
$outputfile = DOL_DATA_ROOT.'/odt2pdf.log';
|
||||||
|
|
||||||
$ok=0;
|
$ok=0;
|
||||||
$handle = fopen($outputfile, 'w');
|
$handle = fopen($outputfile, 'w');
|
||||||
if ($handle)
|
if ($handle)
|
||||||
{
|
{
|
||||||
dol_syslog(get_class($this)."Run command ".$command,LOG_DEBUG);
|
dol_syslog(get_class($this)."Run command ".$command,LOG_DEBUG);
|
||||||
|
fwrite($handle, $command."\n");
|
||||||
$handlein = popen($command, 'r');
|
$handlein = popen($command, 'r');
|
||||||
while (!feof($handlein))
|
while (!feof($handlein))
|
||||||
{
|
{
|
||||||
$read = fgets($handlein);
|
$read = fgets($handlein);
|
||||||
fwrite($handle,$read);
|
fwrite($handle, $read);
|
||||||
$output_arr[]=$read;
|
$output_arr[]=$read;
|
||||||
}
|
}
|
||||||
pclose($handlein);
|
pclose($handlein);
|
||||||
@ -616,7 +653,7 @@ IMG;
|
|||||||
if (! empty($conf->global->MAIN_UMASK)) @chmod($outputfile, octdec($conf->global->MAIN_UMASK));
|
if (! empty($conf->global->MAIN_UMASK)) @chmod($outputfile, octdec($conf->global->MAIN_UMASK));
|
||||||
}
|
}
|
||||||
|
|
||||||
if($retval == 0)
|
if ($retval == 0)
|
||||||
{
|
{
|
||||||
dol_syslog(get_class($this).'::exportAsAttachedPDF $ret_val='.$retval, LOG_DEBUG);
|
dol_syslog(get_class($this).'::exportAsAttachedPDF $ret_val='.$retval, LOG_DEBUG);
|
||||||
if (headers_sent($filename, $linenum)) {
|
if (headers_sent($filename, $linenum)) {
|
||||||
@ -686,7 +723,7 @@ IMG;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Empty the temporary working directory recursively
|
* Empty the temporary working directory recursively
|
||||||
*
|
*
|
||||||
* @param string $dir The temporary working directory
|
* @param string $dir The temporary working directory
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
@ -709,7 +746,7 @@ IMG;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* return the value present on odt in [valuename][/valuename]
|
* return the value present on odt in [valuename][/valuename]
|
||||||
*
|
*
|
||||||
* @param string $valuename Balise in the template
|
* @param string $valuename Balise in the template
|
||||||
* @return string The value inside the balise
|
* @return string The value inside the balise
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -3,20 +3,26 @@
|
|||||||
# @copyright GPL License 2013 - Florian HEnry - florian.henry@open-concept.pro
|
# @copyright GPL License 2013 - Florian HEnry - florian.henry@open-concept.pro
|
||||||
# @copyright GPL License 2017 - Laurent Destailleur - eldy@users.sourceforge.net
|
# @copyright GPL License 2017 - Laurent Destailleur - eldy@users.sourceforge.net
|
||||||
#
|
#
|
||||||
# Convert an ODT into a PDF using "jodconverter" or "pyodconverter" tool.
|
# Convert an ODT into a PDF using "jodconverter" or "pyodconverter" or "unoconv" tool.
|
||||||
# Dolibarr variable MAIN_ODT_AS_PDF must be defined to value "jodconverter" to call jodconverter wrapper after ODT generation
|
# Dolibarr variable MAIN_ODT_AS_PDF must be defined
|
||||||
|
# to value "unoconv" to call unoconv CLI tool after ODT generation.
|
||||||
# or value "pyodconverter" to call DocumentConverter.py after ODT generation.
|
# or value "pyodconverter" to call DocumentConverter.py after ODT generation.
|
||||||
|
# or value "jodconverter" to call jodconverter wrapper after ODT generation
|
||||||
# or value "/pathto/jodconverter-cli-file.jar" to call jodconverter java tool without wrapper after ODT generation.
|
# or value "/pathto/jodconverter-cli-file.jar" to call jodconverter java tool without wrapper after ODT generation.
|
||||||
# Dolibarr variable MAIN_DOL_SCRIPTS_ROOT must be defined to path of script directories (otherwise dolibarr will try to guess).
|
# Dolibarr variable MAIN_DOL_SCRIPTS_ROOT must be defined to path of script directories (otherwise dolibarr will try to guess).
|
||||||
|
|
||||||
|
|
||||||
if [ "x$1" == "x" ]
|
if [ "x$1" == "x" ]
|
||||||
then
|
then
|
||||||
echo "Usage: odt2pdf.sh fullfilename [jodconverter|pyodconverter|pathtojodconverterjar]"
|
echo "Usage: odt2pdf.sh fullfilename [unoconv|jodconverter|pyodconverter|pathtojodconverterjar]"
|
||||||
|
echo "Example: odt2pdf.sh myfile unoconv"
|
||||||
echo "Example: odt2pdf.sh myfile ~/jodconverter/jodconverter-cli-2.2.2.jar"
|
echo "Example: odt2pdf.sh myfile ~/jodconverter/jodconverter-cli-2.2.2.jar"
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Full patch where soffice is installed
|
# Full patch where soffice is installed
|
||||||
soffice="/usr/bin/soffice"
|
soffice="/usr/bin/soffice"
|
||||||
|
|
||||||
@ -26,7 +32,21 @@ home_java="/tmp"
|
|||||||
|
|
||||||
# Main program
|
# Main program
|
||||||
if [ -f "$1.odt" ]
|
if [ -f "$1.odt" ]
|
||||||
then
|
then
|
||||||
|
|
||||||
|
if [ "x$2" == "xunoconv" ]
|
||||||
|
then
|
||||||
|
# See issue https://github.com/dagwieers/unoconv/issues/87
|
||||||
|
/usr/bin/unoconv -vvv "$1.odt"
|
||||||
|
retcode=$?
|
||||||
|
if [ $retcode -ne 0 ]
|
||||||
|
then
|
||||||
|
echo "Error while converting odt to pdf: $retcode"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
nbprocess=$(pgrep -c soffice)
|
nbprocess=$(pgrep -c soffice)
|
||||||
if [ $nbprocess -ne 1 ] # If there is some soffice process running
|
if [ $nbprocess -ne 1 ] # If there is some soffice process running
|
||||||
then
|
then
|
||||||
@ -59,8 +79,9 @@ if [ -f "$1.odt" ]
|
|||||||
echo "Error while converting odt to pdf: $retcode"
|
echo "Error while converting odt to pdf: $retcode"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
sleep 1
|
sleep 1
|
||||||
else
|
else
|
||||||
echo "Error: Odt file $1.odt does not exist"
|
echo "Error: Odt file $1.odt does not exist"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user