mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-07-20 00:12:15 +00:00
Added Library for document conversion and merging
Added function for loading documents of Akte
This commit is contained in:
@@ -12,18 +12,21 @@ class DmsLib
|
||||
public function __construct()
|
||||
{
|
||||
$this->ci =& get_instance();
|
||||
|
||||
|
||||
$this->ci->load->model('crm/Akte_model', 'AkteModel');
|
||||
$this->ci->load->model('content/Dms_model', 'DmsModel');
|
||||
$this->ci->load->model('content/DmsVersion_model', 'DmsVersionModel');
|
||||
$this->ci->load->model('content/DmsFS_model', 'DmsFSModel');
|
||||
|
||||
|
||||
// Loads helper message to manage returning messages
|
||||
$this->ci->load->helper('message');
|
||||
}
|
||||
|
||||
/**
|
||||
* read
|
||||
* Read a DMS Document from the Filesystem
|
||||
* @param int $dms_id ID of the Document.
|
||||
* @param int $version The version of the Document (latest if null).
|
||||
* @return object success or error
|
||||
*/
|
||||
public function read($dms_id, $version = null)
|
||||
{
|
||||
@@ -44,7 +47,7 @@ class DmsLib
|
||||
$result = $this->ci->DmsModel->loadWhere(array('dms_id' => $dms_id, 'version' => $version));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (hasData($result))
|
||||
{
|
||||
$resultFS = $this->ci->DmsFSModel->read($result->retval[0]->filename);
|
||||
@@ -57,20 +60,26 @@ class DmsLib
|
||||
$result = $resultFS;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* getAktenAcceptedDms
|
||||
* Get all accepted Documents of a Person
|
||||
*
|
||||
* @param int $person_id ID of the person.
|
||||
* @param string $dokument_kurzbz Type of document.
|
||||
* @param bool $no_file If null then loads also the content.
|
||||
* @return object success or error
|
||||
*/
|
||||
public function getAktenAcceptedDms($person_id, $dokument_kurzbz = null, $no_file = null)
|
||||
{
|
||||
$result = $this->ci->AkteModel->getAktenAcceptedDms($person_id, $dokument_kurzbz);
|
||||
|
||||
|
||||
if (hasData($result) && $no_file == null)
|
||||
{
|
||||
for ($i = 0; $i < count($result->retval); $i++)
|
||||
$cnt = count($result->retval);
|
||||
for ($i = 0; $i < $cnt; $i++)
|
||||
{
|
||||
$resultFS = $this->ci->DmsFSModel->read($result->retval[$i]->filename);
|
||||
if (isSuccess($resultFS))
|
||||
@@ -83,12 +92,14 @@ class DmsLib
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* save
|
||||
* Saves a Document
|
||||
* @param object $dms DMS Object ot be saved.
|
||||
* @return object
|
||||
*/
|
||||
public function save($dms)
|
||||
{
|
||||
@@ -142,30 +153,34 @@ class DmsLib
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* delete
|
||||
* Deletes a Akte of a Person
|
||||
* @param int $person_id ID of the person.
|
||||
* @param int $dms_id Id of the Document.
|
||||
* @return object
|
||||
*/
|
||||
public function delete($person_id, $dms_id)
|
||||
{
|
||||
$result = null;
|
||||
|
||||
|
||||
// If the parameters are valid
|
||||
if (is_numeric($person_id) && is_numeric($dms_id))
|
||||
{
|
||||
// Start DB transaction
|
||||
$this->ci->db->trans_start(false);
|
||||
|
||||
|
||||
// Get akte_id from table tbl_akte
|
||||
$result = $this->ci->AkteModel->loadWhere(array('person_id' => $person_id, 'dms_id' => $dms_id));
|
||||
if (isSuccess($result))
|
||||
{
|
||||
// Delete all entries in tbl_akte
|
||||
for ($i = 0; $i < count($result->retval); $i++)
|
||||
$cnt = count($result->retval);
|
||||
for ($i = 0; $i < $cnt; $i++)
|
||||
{
|
||||
$this->ci->AkteModel->delete($result->retval[$i]->akte_id);
|
||||
}
|
||||
|
||||
|
||||
// Get all filenames related to this dms
|
||||
$resultFileNames = $this->ci->DmsVersionModel->loadWhere(array('dms_id' => $dms_id));
|
||||
if (isSuccess($resultFileNames))
|
||||
@@ -179,10 +194,10 @@ class DmsLib
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Transaction complete!
|
||||
$this->ci->db->trans_complete();
|
||||
|
||||
|
||||
// Check if everything went ok during the transaction
|
||||
if ($this->ci->db->trans_status() === false || isError($result))
|
||||
{
|
||||
@@ -194,12 +209,13 @@ class DmsLib
|
||||
$this->ci->db->trans_commit();
|
||||
$result = success('Dms successfully removed from DB');
|
||||
}
|
||||
|
||||
|
||||
// If everything is ok
|
||||
if (isSuccess($result))
|
||||
{
|
||||
$cnt = count($resultFileNames->retval);
|
||||
// Remove all files related to this person and dms
|
||||
for ($i = 0; $i < count($resultFileNames->retval); $i++)
|
||||
for ($i = 0; $i < $cnt; $i++)
|
||||
{
|
||||
$this->ci->DmsFSModel->remove($resultFileNames->retval[$i]->filename);
|
||||
}
|
||||
@@ -209,17 +225,52 @@ class DmsLib
|
||||
{
|
||||
$result = error('Invalid parameters');
|
||||
}
|
||||
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* _saveFileOnInsert
|
||||
* Loads the Content of an akte
|
||||
* @param int $akte_id Id of the akte.
|
||||
* @return object with document content or error
|
||||
*/
|
||||
public function getAkteContent($akte_id)
|
||||
{
|
||||
$akte = $this->ci->AkteModel->load($akte_id);
|
||||
if (hasData($akte))
|
||||
{
|
||||
if ($akte->retval[0]->inhalt != '')
|
||||
{
|
||||
return success(base64_decode($akte->retval[0]->inhalt));
|
||||
}
|
||||
elseif ($akte->retval[0]->dms_id != '')
|
||||
{
|
||||
$dmscontent = $this->read($akte->retval[0]->dms_id);
|
||||
if (isSuccess($dmscontent))
|
||||
{
|
||||
return success(base64_decode($dmscontent->retval[0]->file_content));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return error('No Content available');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return error($akte->retval);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves the Content of a DMS in the Filesystem
|
||||
* @param object $dms DMS object to be saved.
|
||||
* @return object
|
||||
*/
|
||||
private function _saveFileOnInsert($dms)
|
||||
{
|
||||
$filename = uniqid().'.'.pathinfo($dms['name'], PATHINFO_EXTENSION);
|
||||
|
||||
|
||||
$result = $this->ci->DmsFSModel->write($filename, $dms['file_content']);
|
||||
if (isSuccess($result))
|
||||
{
|
||||
@@ -230,7 +281,9 @@ class DmsLib
|
||||
}
|
||||
|
||||
/**
|
||||
* _saveFileOnUpdate
|
||||
* Updates the File in the Filesystem
|
||||
* @param object $dms DMS object to update.
|
||||
* @return object
|
||||
*/
|
||||
private function _saveFileOnUpdate($dms)
|
||||
{
|
||||
|
||||
@@ -0,0 +1,182 @@
|
||||
<?php
|
||||
|
||||
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||
|
||||
class DocumentLib
|
||||
{
|
||||
private $unoconv_version;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
// Gets CI instance
|
||||
$this->ci =& get_instance();
|
||||
|
||||
exec('unoconv --version', $ret_arr);
|
||||
if(isset($ret_arr[0]))
|
||||
$this->unoconv_version = explode(' ', $ret_arr[0])[1];
|
||||
else
|
||||
show_error('Unoconv not found - Please install Unoconv');
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a File to PDF
|
||||
* @param string $filename Full path to the file.
|
||||
* @return success or error object
|
||||
*/
|
||||
public function convertToPDF($filename)
|
||||
{
|
||||
if (!file_exists($filename))
|
||||
return error('Unable to Convert to PDF. File not found:'.$filename);
|
||||
|
||||
$mimetype = mime_content_type($filename);
|
||||
$outFile = sys_get_temp_dir().'/FHC_'.uniqid().'.pdf';
|
||||
|
||||
switch ($mimetype)
|
||||
{
|
||||
case 'image/jpeg':
|
||||
case 'image/jpg':
|
||||
case 'image/pjpeg':
|
||||
$this->_jpegtopdf($filename, $outFile);
|
||||
return success($outFile);
|
||||
case 'application/vnd.oasis.opendocument.spreadsheet':
|
||||
case 'application/msword':
|
||||
case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document':
|
||||
case 'application/haansoftdocx':
|
||||
case 'application/vnd.ms-word':
|
||||
case 'application/vnd.oasis.opendocument.text':
|
||||
case 'text/plain':
|
||||
$this->convert($filename, $outFile, 'pdf');
|
||||
return success($outFile);
|
||||
case 'application/pdf':
|
||||
return success($filename);
|
||||
default:
|
||||
return error('Unknown Mimetype:'.$mimetype);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Combines multiple single PDFs to one PDF
|
||||
*
|
||||
* @param array $files Array of Files to merge (full path to file).
|
||||
* @param string $outFile Path to the Output File.
|
||||
* @return success or error object
|
||||
*/
|
||||
public function mergePDF($files, $outFile)
|
||||
{
|
||||
$cmd = "gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$outFile ";
|
||||
$finfo = finfo_open(FILEINFO_MIME_TYPE);
|
||||
|
||||
// add all pdf files to the command
|
||||
foreach ($files as $f)
|
||||
{
|
||||
$cmd .= $f." ";
|
||||
if (!file_exists($f))
|
||||
{
|
||||
return error("File not found: '$f'");
|
||||
}
|
||||
if (finfo_file($finfo, $f) != "application/pdf")
|
||||
{
|
||||
return error("Wrong format(".finfo_file($finfo, $f)."): '$f'");
|
||||
}
|
||||
}
|
||||
|
||||
finfo_close($finfo);
|
||||
|
||||
exec($cmd, $out, $ret);
|
||||
if ($ret != 0)
|
||||
{
|
||||
return error('PDF-zusammenfuegung ist derzeit nicht möglich. Bitte informieren Sie den Administrator');
|
||||
}
|
||||
return success(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a Document to another format with unoconv
|
||||
*
|
||||
* @param string $inFile File that should be convertet.
|
||||
* @param string $outFile Name of the Output File.
|
||||
* @param string $format Outputformat (PDF, DOC, ...).
|
||||
* @return success or error Object
|
||||
*/
|
||||
public function convert($inFile, $outFile, $format)
|
||||
{
|
||||
if ($this->unoconv_version == '0.6')
|
||||
$command = 'unoconv -f %1$s %3$s > %2$s';
|
||||
else
|
||||
$command = 'unoconv -f %s --output %s %s 2>&1';
|
||||
$command = sprintf($command, $format, $outFile, $inFile);
|
||||
|
||||
exec($command, $out, $ret);
|
||||
|
||||
if ($ret != 0)
|
||||
{
|
||||
return error('Dokumentenkonvertierung ist derzeit nicht möglich. Bitte informieren Sie den Administrator');
|
||||
}
|
||||
|
||||
return success(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a JPG to PDF
|
||||
*
|
||||
* @param string $filename Path to JPG.
|
||||
* @param string $outfile Path to Output (pdf) File.
|
||||
* @return success or error object
|
||||
*/
|
||||
private function _jpegtopdf($filename, $outfile)
|
||||
{
|
||||
if (!file_exists($filename))
|
||||
return error('File does not exists');
|
||||
|
||||
$size = getimagesize($filename);
|
||||
|
||||
$margin_left_right = 18;
|
||||
$margin_bottom = 18;
|
||||
|
||||
/*
|
||||
* längere Seite ermitteln
|
||||
* Hochformat wenn die Seiten gleich lang sind oder das Bild schmäler ist als die Seitenbreite
|
||||
*/
|
||||
if ($size[0] > $size[1] && $size[0] > 595)
|
||||
{
|
||||
$page_height = 595;
|
||||
$page_width = 842;
|
||||
//Wenn Bild kleiner oder gleich Seitenbreite, dann margin erhoehen
|
||||
if ($size[0] <= $page_width)
|
||||
{
|
||||
$margin_left_right = ($page_width - $size[0]) / 2;
|
||||
$margin_bottom = ($page_height - $size[1]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$page_height = 842;
|
||||
$page_width = 595;
|
||||
//Wenn Bild kleiner oder gleich Seitenbreite, dann margin erhoehen
|
||||
if ($size[0] <= $page_width)
|
||||
{
|
||||
$margin_left_right = ($page_width - $size[0]) / 2;
|
||||
$margin_bottom = ($page_height - $size[1]);
|
||||
}
|
||||
}
|
||||
|
||||
// -r300 = 300 ppi
|
||||
$cmd = 'gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -r100 ';
|
||||
$cmd .= '-o '.$outfile.' viewjpeg.ps -c "('.$filename.') ';
|
||||
$cmd .= '<< /PageSize ['.$page_width.' '.$page_height.'] ';
|
||||
$cmd .= '/.HWMargins ['.$margin_left_right.' '.$margin_bottom.' '.$margin_left_right.' 18] ';
|
||||
$cmd .= '/countspaces { [ exch { dup 32 ne { pop } if } forall ] length } bind def >> ';
|
||||
$cmd .= 'setpagedevice viewJPEG"';
|
||||
|
||||
exec($cmd, $out, $ret);
|
||||
if ($ret != 0)
|
||||
{
|
||||
$this->errormsg = 'jpegToPdf ist derzeit nicht möglich. Bitte informieren Sie den Administrator';
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user