Merge branch 'seeddms-5.1.x' into seeddms-6.0.x

This commit is contained in:
Uwe Steinmann 2021-10-15 13:50:46 +02:00
commit 8e6828e36d
11 changed files with 154 additions and 22 deletions

View File

@ -6,7 +6,9 @@ Header set X-Content-Type-Options: "nosniff"
</IfModule> </IfModule>
RewriteEngine On RewriteEngine On
RewriteRule ^favicon.ico$ views/bootstrap/images/favicon.svg [L] #RewriteRule "^favicon\.ico$" "-" [L]
#RewriteRule "^(favicon\.ico)$" %{HTTP_HOST}/views/bootstrap/images/favicon.svg [L,NC]
RewriteRule "(favicon\.ico)" /views/bootstrap/images/favicon.svg [L,NC]
# Store the current location in an environment variable CWD to use # Store the current location in an environment variable CWD to use
# mod_rewrite in .htaccess files without knowing the RewriteBase # mod_rewrite in .htaccess files without knowing the RewriteBase

View File

@ -16,10 +16,10 @@ application/msword
catdoc %s catdoc %s
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
xlsx2csv %s xlsx2csv -d tab %s
application/vnd.ms-excel application/vnd.ms-excel
xls2csv %s xls2csv -d tab %s
text/html text/html
html2text %s html2text %s
@ -48,7 +48,7 @@ text/rtf
image/png image/png
image/jpg image/jpg
image/jpeg image/jpeg
convert -f pdf -density 300 '%f' '%o' convert -density 300 '%f' 'pdf:%o'
application/vnd.ms-powerpoint application/vnd.ms-powerpoint
application/vnd.openxmlformats-officedocument.presentationml.presentation application/vnd.openxmlformats-officedocument.presentationml.presentation
@ -71,16 +71,22 @@ It basically instructs you to comment out the line
in /etc/ImageMagick-6/policy.xml in /etc/ImageMagick-6/policy.xml
convert determines the format of the converted image from the extension of
the output filename. SeedDMS usually sets a propper extension when running
the command, but nevertheless it is good practice to explicitly set the output
format by prefixing the output filename with 'png:'. This is of course always
needed if the output goes to stdout.
image/jpg image/jpg
image/jpeg image/jpeg
image/png image/png
convert -resize %wx '%f' '%o' convert -resize %wx '%f' 'png:%o'
application/pdf application/pdf
gs -dBATCH -dNOPAUSE -sDEVICE=png16m -dPDFFitPage -r72x72 -sOutputFile=- -dFirstPage=1 -dLastPage=1 -q '%f' | convert -resize %wx png:- '%o' gs -dBATCH -dNOPAUSE -sDEVICE=png16m -dPDFFitPage -r72x72 -sOutputFile=- -dFirstPage=1 -dLastPage=1 -q '%f' | convert -resize %wx png:- '%o'
text/plain text/plain
a2ps -1 -a1 -R -B -o - '%f' | gs -dBATCH -dNOPAUSE -sDEVICE=png16m -dFirstPage=1 -dLastPage=1 -dPDFFitPage -r72x72 -sOutputFile=- -q - | convert -resize %wx png:- '%o' a2ps -1 -a1 -R -B -o - '%f' | gs -dBATCH -dNOPAUSE -sDEVICE=png16m -dFirstPage=1 -dLastPage=1 -dPDFFitPage -r72x72 -sOutputFile=- -q - | convert -resize %wx png:- 'png:%o'
application/msword application/msword
application/vnd.oasis.opendocument.spreadsheet application/vnd.oasis.opendocument.spreadsheet
@ -93,5 +99,5 @@ application/vnd.ms-powerpoint
text/csv text/csv
application/csv application/csv
application/vnd.wordperfect application/vnd.wordperfect
unoconv -d document -e PageRange=1 -f pdf --stdout -v '%f' | gs -dBATCH -dNOPAUSE -sDEVICE=pngalpha -dPDFFitPage -r72x72 -sOutputFile=- -dFirstPage=1 -dLastPage=1 -q - | convert -resize %wx png:- '%o' unoconv -d document -e PageRange=1 -f pdf --stdout -v '%f' | gs -dBATCH -dNOPAUSE -sDEVICE=pngalpha -dPDFFitPage -r72x72 -sOutputFile=- -dFirstPage=1 -dLastPage=1 -q - | convert -resize %wx png:- 'png:%o'

View File

@ -47,6 +47,10 @@ class SeedDMS_ConversionMgr {
return false; return false;
} }
public function getServices() {
return $this->services;
}
/** /**
* Convert a file * Convert a file
* *

View File

@ -49,6 +49,18 @@ abstract class SeedDMS_ConversionServiceBase {
return 'Conversion service'; return 'Conversion service';
} }
public function getAdditionalParams() { /* {{{ */
return [];
} /* }}} */
/**
* This method does the conversion
*
* It either returns the content of converted file (if $target is null)
* or writes the converted file into $target and returns true on success
* or false on error.
*/
public function convert($infile, $target = null, $params = array()) { public function convert($infile, $target = null, $params = array()) {
return false;
} }
} }

View File

@ -98,28 +98,95 @@ class SeedDMS_ConversionServiceExec extends SeedDMS_ConversionServiceBase {
$this->timeout = 5; $this->timeout = 5;
} }
public function getInfo() {
return "Convert with command '".$this->cmd."'";
}
public function getAdditionalParams() { /* {{{ */
/* output format is an image and the command has a placeholder for the
* width of the converted image, then allow to set the width.
*/
if(substr($this->to, 0, 6) == 'image/' && strpos($this->cmd, '%w') !== false)
return [
['name'=>'width', 'type'=>'number', 'description'=>'Width of converted image'],
];
return [];
} /* }}} */
/**
* Convert by running an external command
*
* The command was set when calling the constructor. The command may
* either write a file or to stdout, depending on the placeholder '%o'
* either exists or not in the command. If $target is null, but the
* command writes to a file, it will create a temporary file, write
* ot it and read the content back to be returned by the method.
*/
public function convert($infile, $target = null, $params = array()) { public function convert($infile, $target = null, $params = array()) {
/* if no %f placeholder is found, we assume output to stdout */
$tostdout = strpos($this->cmd, '%o') === false;
$format = '';
switch($this->to) {
case 'image/gif':
$format = 'gif';
break;
case 'image/jpg':
case 'image/jpeg':
$format = 'jpg';
break;
case 'image/png':
$format = 'png';
break;
case 'application/pdf':
$format = 'pdf';
break;
}
$start = microtime(true); $start = microtime(true);
if(!$target) $hastempfile = false;
if(!$target && !$tostdout) {
$tmpfile = tempnam(sys_get_temp_dir(), 'convert'); $tmpfile = tempnam(sys_get_temp_dir(), 'convert');
else /* Some programms (e.g. unoconv) need the output file to have the
* right extension. Without an extension it will add one by itself.
*/
if($format)
rename($tmpfile, $tmpfile .= '.'.$format);
$hastempfile = true;
} else
$tmpfile = $target; $tmpfile = $target;
$cmd = str_replace(array('%w', '%f', '%o', '%m'), array(isset($params['width']) ? $params['width'] : '', $infile, $tmpfile, $this->from), $this->cmd); /* %s was just added because the commands to convert to text/plain used
* it instead of %f for the input file
* %f = input file
* %o = output file
* %m = mime type
* %w = width
*/
$cmd = str_replace(array('%w', '%f', '%s', '%if', '%o', '%m'), array(!empty($params['width']) ? (int) $params['width'] : '150', $infile, $infile, $format, $tmpfile, $this->from), $this->cmd);
try { try {
self::execWithTimeout($cmd, $this->timeout); $ret = self::execWithTimeout($cmd, $this->timeout);
} catch(Exception $e) { } catch(Exception $e) {
if($hastempfile)
unlink($tmpfile);
return false; return false;
} }
$end = microtime(true); $end = microtime(true);
if($this->logger) { if($this->logger) {
$this->logger->log('Conversion from '.$this->from.' to '.$this->to.' with cmd "'.$this->cmd.'" took '.($end-$start).' sec.', PEAR_LOG_INFO); $this->logger->log('Conversion from '.$this->from.' to '.$this->to.' with cmd "'.$this->cmd.'" took '.($end-$start).' sec.', PEAR_LOG_DEBUG);
} }
if(!$target) { if($tostdout) {
$content = file_get_contents($tmpfile); if(!$target) {
unlink($tmpfile); return $ret['stdout'];
return $content; } else {
return file_put_contents($tmpfile, $ret['stdout']);
}
} else { } else {
return true; if(!$target) {
$content = file_get_contents($tmpfile);
unlink($tmpfile);
return $content;
} else {
return true;
}
} }
} }
} }

View File

@ -34,12 +34,22 @@ class SeedDMS_ConversionServiceImageToImage extends SeedDMS_ConversionServiceBas
$this->timeout = 5; $this->timeout = 5;
} }
public function getInfo() {
return "Convert with imagick php functions";
}
public function getAdditionalParams() { /* {{{ */
return [
['name'=>'width', 'type'=>'number', 'description'=>'Width of converted image']
];
} /* }}} */
public function convert($infile, $target = null, $params = array()) { public function convert($infile, $target = null, $params = array()) {
$start = microtime(true); $start = microtime(true);
$imagick = new Imagick(); $imagick = new Imagick();
if($imagick->readImage($infile)) { if($imagick->readImage($infile)) {
if(!empty($params['width'])) if(!empty($params['width']))
$imagick->scaleImage((int) $params['width'], 0); $imagick->scaleImage(min((int) $params['width'], $imagick->getImageWidth()), 0);
$end = microtime(true); $end = microtime(true);
if($this->logger) { if($this->logger) {
$this->logger->log('Conversion from '.$this->from.' to '.$this->to.' with image service took '.($end-$start).' sec.', PEAR_LOG_INFO); $this->logger->log('Conversion from '.$this->from.' to '.$this->to.' with image service took '.($end-$start).' sec.', PEAR_LOG_INFO);

View File

@ -34,6 +34,17 @@ class SeedDMS_ConversionServicePdfToImage extends SeedDMS_ConversionServiceBase
$this->timeout = 5; $this->timeout = 5;
} }
public function getInfo() {
return "Convert with imagick php functions";
}
public function getAdditionalParams() { /* {{{ */
return [
['name'=>'width', 'type'=>'number', 'description'=>'Width of converted image'],
['name'=>'page', 'type'=>'number', 'description'=>'Page of Pdf document'],
];
} /* }}} */
public function convert($infile, $target = null, $params = array()) { public function convert($infile, $target = null, $params = array()) {
$start = microtime(true); $start = microtime(true);
$imagick = new Imagick(); $imagick = new Imagick();
@ -41,9 +52,12 @@ class SeedDMS_ConversionServicePdfToImage extends SeedDMS_ConversionServiceBase
* A resolution of 72,72 will create a 596x842 image * A resolution of 72,72 will create a 596x842 image
*/ */
$imagick->setResolution(36,36); $imagick->setResolution(36,36);
if($imagick->readImage($infile.'[0]')) { $page = 0;
if(!empty($params['page']) && intval($params['page']) > 0)
$page = intval($params['page'])-1;
if($imagick->readImage($infile.'['.$page.']')) {
if(!empty($params['width'])) if(!empty($params['width']))
$imagick->scaleImage((int) $params['width'], 0); $imagick->scaleImage(min((int) $params['width'], $imagick->getImageWidth()), 0);
$imagick->setImageFormat('png'); $imagick->setImageFormat('png');
$end = microtime(true); $end = microtime(true);
if($this->logger) { if($this->logger) {

View File

@ -28,6 +28,10 @@ class SeedDMS_ConversionServiceTextToText extends SeedDMS_ConversionServiceBase
$this->to = $to; $this->to = $to;
} }
public function getInfo() {
return "Pass through document contents";
}
public function convert($infile, $target = null, $params = array()) { public function convert($infile, $target = null, $params = array()) {
if($target) { if($target) {
file_put_contents($target, file_get_contents($infile)); file_put_contents($target, file_get_contents($infile));

View File

@ -15,6 +15,12 @@ if(!empty($settings->_converters['pdf'])) {
} }
} }
if(!empty($settings->_converters['fulltext'])) {
foreach($settings->_converters['fulltext'] as $mimetype=>$cmd) {
$conversionmgr->addService(new SeedDMS_ConversionServiceExec($mimetype, 'text/plain', $cmd))->setLogger($logger);
}
}
$conversionmgr->addService(new SeedDMS_ConversionServicePdfToImage('application/pdf', 'image/png'))->setLogger($logger); $conversionmgr->addService(new SeedDMS_ConversionServicePdfToImage('application/pdf', 'image/png'))->setLogger($logger);
$conversionmgr->addService(new SeedDMS_ConversionServiceImageToImage('image/jpeg', 'image/png'))->setLogger($logger); $conversionmgr->addService(new SeedDMS_ConversionServiceImageToImage('image/jpeg', 'image/png'))->setLogger($logger);

View File

@ -412,7 +412,7 @@ function add_log_line($msg="", $priority=null) { /* {{{ */
elseif(!empty($_SERVER['REMOTE_ADDR'])) elseif(!empty($_SERVER['REMOTE_ADDR']))
$ip = $_SERVER['REMOTE_ADDR']; $ip = $_SERVER['REMOTE_ADDR'];
if(!empty($_SERVER["REQUEST_URI"])) if(!empty($_SERVER["REQUEST_URI"]))
$scriptname = basename($_SERVER["REQUEST_URI"], ".php").' '; $scriptname = basename($_SERVER["REQUEST_URI"]).' ';
else else
$scriptname = basename($_SERVER["SCRIPT_NAME"]).' '; $scriptname = basename($_SERVER["SCRIPT_NAME"]).' ';
if($user) if($user)

View File

@ -89,6 +89,13 @@ class SeedDMS_View_ExtensionMgr extends SeedDMS_Theme_Style {
}); });
}); });
}); });
/* This function is called after the list of installed extension is updated */
function filterList() {
var value = $("#extensionfilter").val().toLowerCase();
$("#extensionlist tbody tr").filter(function() {
$(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
});
}
<?php <?php
$this->printFileChooserJs(); $this->printFileChooserJs();
@ -280,7 +287,7 @@ class SeedDMS_View_ExtensionMgr extends SeedDMS_Theme_Style {
<div class="tab-content"> <div class="tab-content">
<div class="tab-pane <?php if(!$currenttab || $currenttab == 'installed') echo 'active'; ?>" id="installed" role="tabpanel"> <div class="tab-pane <?php if(!$currenttab || $currenttab == 'installed') echo 'active'; ?>" id="installed" role="tabpanel">
<input id="extensionfilter" class="form-control" type="text" placeholder="<?= getMLText('type_to_filter'); ?>"> <input id="extensionfilter" class="form-control" type="text" placeholder="<?= getMLText('type_to_filter'); ?>">
<div class="ajax" data-view="ExtensionMgr" data-action="installedList"></div> <div class="ajax" data-view="ExtensionMgr" data-action="installedList" data-afterload="()=>{filterList();}"></div>
<?php <?php
// $this->installedList(); // $this->installedList();
?> ?>