mirror of
https://github.com/OpenXE-org/OpenXE.git
synced 2024-12-27 15:10:28 +01:00
104 lines
3.0 KiB
PHP
104 lines
3.0 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace Xentral\Components\Pdf\Merger;
|
||
|
|
||
|
use Xentral\Components\Pdf\Exception\PdfComponentExceptionInterface;
|
||
|
use Xentral\Components\Pdf\Exception\ShellCommandFailedException;
|
||
|
|
||
|
final class GhostScriptPdfMerger extends AbstractPdfMerger
|
||
|
{
|
||
|
/**
|
||
|
* @param array $sourceFiles
|
||
|
* @param string $targetFile
|
||
|
*
|
||
|
* @throws PdfComponentExceptionInterface
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function mergeFiles(array $sourceFiles, $targetFile)
|
||
|
{
|
||
|
$this->preCheckMergeFiles($sourceFiles, $targetFile);
|
||
|
if (!$this->isGhostscriptAvailable()) {
|
||
|
throw new ShellCommandFailedException('Ghostscript command "gs" is missing or not callable.');
|
||
|
}
|
||
|
|
||
|
$sourceFilesParam = '';
|
||
|
foreach ($sourceFiles as $sourceFile) {
|
||
|
$sourceFilesParam .= escapeshellarg($sourceFile) . ' ';
|
||
|
}
|
||
|
|
||
|
$cmdTemplate = 'gs -dQUIET -dNOPAUSE -dBATCH ';
|
||
|
$cmdTemplate .= '-dPDFSETTINGS=/prepress '; // High quality, color preserving, 300 dpi images
|
||
|
$cmdTemplate .= '-dAutoRotatePages=/None -sDEVICE=pdfwrite -sOUTPUTFILE=%s %s';
|
||
|
$cmd = sprintf($cmdTemplate, escapeshellarg($targetFile), $sourceFilesParam);
|
||
|
|
||
|
$this->executeShellCommand($cmd);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param string $command
|
||
|
*
|
||
|
* @throws ShellCommandFailedException
|
||
|
*
|
||
|
* @return array|string[] Zeilenweise Ausgabe des Commands
|
||
|
*/
|
||
|
private function executeShellCommand($command)
|
||
|
{
|
||
|
if ($this->isFunctionDisabled('exec')) {
|
||
|
throw new ShellCommandFailedException('PHP function "exec" is disabled by php.ini settings.');
|
||
|
}
|
||
|
|
||
|
$output = [];
|
||
|
@exec($command, $output, $returnVar);
|
||
|
|
||
|
switch ($returnVar) {
|
||
|
case 0:
|
||
|
// Kein Fehler
|
||
|
break;
|
||
|
case 1:
|
||
|
throw new ShellCommandFailedException('General error: ' . implode(' ', $output));
|
||
|
break;
|
||
|
case 126:
|
||
|
throw new ShellCommandFailedException('Can not execute "gs" command.');
|
||
|
break;
|
||
|
case 127:
|
||
|
throw new ShellCommandFailedException('Command "gs" not found.');
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return $output;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return bool
|
||
|
*/
|
||
|
private function isGhostscriptAvailable()
|
||
|
{
|
||
|
if ($this->isFunctionDisabled('shell_exec')) {
|
||
|
throw new ShellCommandFailedException('PHP function "shell_exec" is disabled by php.ini settings.');
|
||
|
}
|
||
|
|
||
|
$result = @shell_exec('gs');
|
||
|
|
||
|
return !empty($result);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param string $functionName PHP function name
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function isFunctionDisabled($functionName)
|
||
|
{
|
||
|
$functionName = trim($functionName);
|
||
|
$disabledFunctions = explode(',', ini_get('disable_functions'));
|
||
|
foreach ($disabledFunctions as $disabledFunction) {
|
||
|
if (trim($disabledFunction) === $functionName) {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
}
|