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>
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
# mod_rewrite in .htaccess files without knowing the RewriteBase

View File

@ -16,10 +16,10 @@ application/msword
catdoc %s
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
xlsx2csv %s
xlsx2csv -d tab %s
application/vnd.ms-excel
xls2csv %s
xls2csv -d tab %s
text/html
html2text %s
@ -48,7 +48,7 @@ text/rtf
image/png
image/jpg
image/jpeg
convert -f pdf -density 300 '%f' '%o'
convert -density 300 '%f' 'pdf:%o'
application/vnd.ms-powerpoint
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
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/jpeg
image/png
convert -resize %wx '%f' '%o'
convert -resize %wx '%f' 'png:%o'
application/pdf
gs -dBATCH -dNOPAUSE -sDEVICE=png16m -dPDFFitPage -r72x72 -sOutputFile=- -dFirstPage=1 -dLastPage=1 -q '%f' | convert -resize %wx png:- '%o'
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/vnd.oasis.opendocument.spreadsheet
@ -93,5 +99,5 @@ application/vnd.ms-powerpoint
text/csv
application/csv
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;
}
public function getServices() {
return $this->services;
}
/**
* Convert a file
*

View File

@ -49,6 +49,18 @@ abstract class SeedDMS_ConversionServiceBase {
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()) {
return false;
}
}

View File

@ -98,28 +98,95 @@ class SeedDMS_ConversionServiceExec extends SeedDMS_ConversionServiceBase {
$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()) {
/* 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);
if(!$target)
$hastempfile = false;
if(!$target && !$tostdout) {
$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;
$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 {
self::execWithTimeout($cmd, $this->timeout);
$ret = self::execWithTimeout($cmd, $this->timeout);
} catch(Exception $e) {
if($hastempfile)
unlink($tmpfile);
return false;
}
$end = microtime(true);
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) {
$content = file_get_contents($tmpfile);
unlink($tmpfile);
return $content;
if($tostdout) {
if(!$target) {
return $ret['stdout'];
} else {
return file_put_contents($tmpfile, $ret['stdout']);
}
} 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;
}
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()) {
$start = microtime(true);
$imagick = new Imagick();
if($imagick->readImage($infile)) {
if(!empty($params['width']))
$imagick->scaleImage((int) $params['width'], 0);
$imagick->scaleImage(min((int) $params['width'], $imagick->getImageWidth()), 0);
$end = microtime(true);
if($this->logger) {
$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;
}
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()) {
$start = microtime(true);
$imagick = new Imagick();
@ -41,9 +52,12 @@ class SeedDMS_ConversionServicePdfToImage extends SeedDMS_ConversionServiceBase
* A resolution of 72,72 will create a 596x842 image
*/
$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']))
$imagick->scaleImage((int) $params['width'], 0);
$imagick->scaleImage(min((int) $params['width'], $imagick->getImageWidth()), 0);
$imagick->setImageFormat('png');
$end = microtime(true);
if($this->logger) {

View File

@ -28,6 +28,10 @@ class SeedDMS_ConversionServiceTextToText extends SeedDMS_ConversionServiceBase
$this->to = $to;
}
public function getInfo() {
return "Pass through document contents";
}
public function convert($infile, $target = null, $params = array()) {
if($target) {
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_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']))
$ip = $_SERVER['REMOTE_ADDR'];
if(!empty($_SERVER["REQUEST_URI"]))
$scriptname = basename($_SERVER["REQUEST_URI"], ".php").' ';
$scriptname = basename($_SERVER["REQUEST_URI"]).' ';
else
$scriptname = basename($_SERVER["SCRIPT_NAME"]).' ';
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
$this->printFileChooserJs();
@ -280,7 +287,7 @@ class SeedDMS_View_ExtensionMgr extends SeedDMS_Theme_Style {
<div class="tab-content">
<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'); ?>">
<div class="ajax" data-view="ExtensionMgr" data-action="installedList"></div>
<div class="ajax" data-view="ExtensionMgr" data-action="installedList" data-afterload="()=>{filterList();}"></div>
<?php
// $this->installedList();
?>