From 91f310020b3aac285676f6bb13b82262761859eb Mon Sep 17 00:00:00 2001 From: Vincent Vanwaelscappel Date: Thu, 27 Apr 2023 20:24:54 +0200 Subject: [PATCH] wait #5893 @1.5 --- app/Fluidbook/Compiler.php | 1 + .../FluidbookCollectionCrudController.php | 1 + .../FluidbookPublicationCrudController.php | 2 + .../Services/ExportPdfOperation.php | 178 ++++++++++++++++++ .../Services/SocialImageOperation.php | 6 +- app/Models/FluidbookPublication.php | 22 ++- 6 files changed, 205 insertions(+), 5 deletions(-) create mode 100644 app/Http/Controllers/Admin/Operations/FluidbookPublication/Services/ExportPdfOperation.php diff --git a/app/Fluidbook/Compiler.php b/app/Fluidbook/Compiler.php index 10d73c9d6..8cf4d2016 100644 --- a/app/Fluidbook/Compiler.php +++ b/app/Fluidbook/Compiler.php @@ -2881,6 +2881,7 @@ height="0" width="0" style="display:none;visibility:hidden"> $v = $data[$k] = !!$v; } } + $data['id'] = $this->book_id; return 'var SETTINGS=' . json_encode($data) . ';' . "\n"; } diff --git a/app/Http/Controllers/Admin/FluidbookCollectionCrudController.php b/app/Http/Controllers/Admin/FluidbookCollectionCrudController.php index 48cfd7074..213998969 100644 --- a/app/Http/Controllers/Admin/FluidbookCollectionCrudController.php +++ b/app/Http/Controllers/Admin/FluidbookCollectionCrudController.php @@ -13,6 +13,7 @@ class FluidbookCollectionCrudController extends \Cubist\Backpack\Magic\Controlle use \Backpack\CRUD\app\Http\Controllers\Operations\DeleteOperation; use \Backpack\CRUD\app\Http\Controllers\Operations\BulkDeleteOperation; use \Cubist\Backpack\Http\Controllers\Operations\ReviseOperation; + use \App\Http\Controllers\Admin\Operations\FluidbookCollection\PreviewOperation; use \App\Http\Controllers\Admin\Operations\FluidbookCollection\DownloadOperation; diff --git a/app/Http/Controllers/Admin/FluidbookPublicationCrudController.php b/app/Http/Controllers/Admin/FluidbookPublicationCrudController.php index f15358c4d..d940a59d3 100644 --- a/app/Http/Controllers/Admin/FluidbookPublicationCrudController.php +++ b/app/Http/Controllers/Admin/FluidbookPublicationCrudController.php @@ -16,6 +16,8 @@ class FluidbookPublicationCrudController extends \Cubist\Backpack\Magic\Controll use \App\Http\Controllers\Admin\Operations\FluidbookPublication\DeletefbOperation; use \App\Http\Controllers\Admin\Operations\FluidbookPublication\EditOperation; use \App\Http\Controllers\Admin\Operations\ChangeownerOperation; + use \App\Http\Controllers\Admin\Operations\FluidbookPublication\Services\SocialImageOperation; + use \App\Http\Controllers\Admin\Operations\FluidbookPublication\Services\ExportPdfOperation; diff --git a/app/Http/Controllers/Admin/Operations/FluidbookPublication/Services/ExportPdfOperation.php b/app/Http/Controllers/Admin/Operations/FluidbookPublication/Services/ExportPdfOperation.php new file mode 100644 index 000000000..dea5f053c --- /dev/null +++ b/app/Http/Controllers/Admin/Operations/FluidbookPublication/Services/ExportPdfOperation.php @@ -0,0 +1,178 @@ +withoutMiddleware([CheckIfAdmin::class]); + Route::match(['get'], $s . '/p/{cid}/{range}', $controller . '@pdfprint')->withoutMiddleware([CheckIfAdmin::class]); + Route::match(['get'], $s . '/ep/{cid}/{range}', $controller . '@pdfprintcontainer')->withoutMiddleware([CheckIfAdmin::class]); + } + } + + public function pdfdownload($cid, $range) + { + return $this->pdf($cid, $range); + } + + + public function pdfprint($cid, $range) + { + return $this->pdf($cid, $range, true); + } + + protected function pdf($cid, $range, $print = false) + { + set_time_limit(0); + /** @var FluidbookPublication $book */ + $book = FluidbookPublication::withoutGlobalScopes()->where('cid', $cid)->first(); + // Return the file + return XSendFileController::sendfileNoCache($this->getPDFComplex($book, $range, $print)); + } + + public function pdfprintcontainer($cid, $range) + { + // Prepare the file and wait for it before showing the iframe + $this->pdf($cid, $range, true); + + + return response(' + + + + + + + + +'); + } + + /** + * @param $book FluidbookPublication + * @param $range string + * @param $print bool + * @return array|false + */ + public function getPDFComplex($book, $range = null, $print = false) + { + // Normalize range + $range = ArrayUtil::parseRange($range, 1, $book->getPagesNumber()); + if (!count($range)) { + return; + } + + // Paths init + $baseDocument = $this->getPDFComplexBaseDocument($book); + $destDir = Files::mkdir(protected_path('fluidbookpublication/cache/exportpdf/' . $book->id)); + $fname = md5($baseDocument) . '-' . md5(implode(',%ù', $range) . ($print ? '1' : '0')) . '.pdf'; + $destFile = $destDir . '/' . $fname; + + // If result exists, don't make the pdf again + if (!file_exists($destFile) || filemtime($destFile) < filemtime($baseDocument)) { + if ($print) { + $memoDest = $destFile; + $destFile = Files::tempnam(); + } + + if ($range[0] == 1 && count($range) == $book->getPagesNumber() && $range[$book->getPagesNumber() - 1] == $book->getPagesNumber()) { + // The request range is the whole document + $cp = new CommandLine('cp'); + $cp->setArg(null, $baseDocument); + $cp->setArg(null, $destFile); + $cp->execute(); +// $cp->debug(); + } else { + // Prepare the command line + $l = array('A="' . $baseDocument . '"', 'cat'); + foreach ($range as $page) { + $l[] = 'A' . $page; + } + $l[] = 'output'; + $l[] = $destFile; + + $args = implode(' ', $l); + // Execute the command line + $pdftk = new CommandLine('pdftk'); + $pdftk->setManualArg($args); + $pdftk->execute(); +// $pdftk->debug(); + } + + if ($print) { + $gs = new CommandLine('gs'); + $gs->setArg('-dNoOutputFonts'); + $gs->setManualArg('-sDEVICE=pdfwrite'); + $gs->setArg('o', $memoDest); + $gs->setArg(null, $destFile); + $gs->execute(); +// $gs->debug(); + } + } + + return $destFile; + } + + public function getPDFComplexBaseDocument($book, $force = false) + { + global $core; + $mode = $force ? $force : $book->bookmarkUsePDF; + /** @var $book FluidbookPublication */ + $wid = $book->getAssetDir(); + $res = false; + switch ($mode) { + case 'download': + $res = $wid . $book->pdfReplace; + break; + case 'thumbnails': + $res = $wid . $book->pdfThumbnails; + break; + default: + break; + } + if (!$res || !file_exists($res) || is_dir($res)) { + $res = Files::firstThatExists($book->getPDFDir() . 'original.pdf', $book->getPDFDir() . 'normal.pdf'); + } + if (!file_exists($res) || is_dir($res)) { + return false; + } + return $res; + } + +} diff --git a/app/Http/Controllers/Admin/Operations/FluidbookPublication/Services/SocialImageOperation.php b/app/Http/Controllers/Admin/Operations/FluidbookPublication/Services/SocialImageOperation.php index 1efcb398d..47d3aa619 100644 --- a/app/Http/Controllers/Admin/Operations/FluidbookPublication/Services/SocialImageOperation.php +++ b/app/Http/Controllers/Admin/Operations/FluidbookPublication/Services/SocialImageOperation.php @@ -16,8 +16,10 @@ trait SocialImageOperation { protected function setupSocialimageRoutes($segment, $routeName, $controller) { - Route::match(['get'], 'services/socialimage/{cid?}', $controller . '@socialImage')->withoutMiddleware([CheckIfAdmin::class]); - Route::match(['get'], 'services/facebook_thumbnail', $controller . '@ws2SocialImage')->withoutMiddleware([CheckIfAdmin::class]); + foreach (['services', 's'] as $segment) { + Route::match(['get'], $segment . '/socialimage/{cid?}', $controller . '@socialImage')->withoutMiddleware([CheckIfAdmin::class]); + Route::match(['get'], $segment . '/facebook_thumbnail', $controller . '@ws2SocialImage')->withoutMiddleware([CheckIfAdmin::class]); + } } public function ws2SocialImage() diff --git a/app/Models/FluidbookPublication.php b/app/Models/FluidbookPublication.php index 7b9faa99f..f4ab0910e 100644 --- a/app/Models/FluidbookPublication.php +++ b/app/Models/FluidbookPublication.php @@ -19,6 +19,8 @@ use App\Http\Controllers\Admin\Operations\FluidbookPublication\DownloadOperation use App\Http\Controllers\Admin\Operations\FluidbookPublication\EditOperation; use App\Http\Controllers\Admin\Operations\FluidbookPublication\LinksOperation; use App\Http\Controllers\Admin\Operations\FluidbookPublication\PreviewOperation; +use App\Http\Controllers\Admin\Operations\FluidbookPublication\Services\ExportPdfOperation; +use App\Http\Controllers\Admin\Operations\FluidbookPublication\Services\SocialImageOperation; use App\Http\Controllers\Admin\Operations\FluidbookPublication\StatsOperation; use App\Jobs\FluidbookImagesPreprocess; use App\Models\Base\ToolboxSettingsModel; @@ -58,7 +60,10 @@ class FluidbookPublication extends ToolboxSettingsModel protected static $_docs = []; - protected $_operations = [CreateOperation::class, PreviewOperation::class, LinksOperation::class, CompositionOperation::class, StatsOperation::class, DownloadOperation::class, CloneOperation::class, DeletefbOperation::class, EditOperation::class, ChangeownerOperation::class]; + protected $_operations = [CreateOperation::class, + PreviewOperation::class, + LinksOperation::class, + CompositionOperation::class, StatsOperation::class, DownloadOperation::class, CloneOperation::class, DeletefbOperation::class, EditOperation::class, ChangeownerOperation::class, SocialImageOperation::class, ExportPdfOperation::class]; protected $casts = ['composition' => 'array']; @@ -284,7 +289,7 @@ class FluidbookPublication extends ToolboxSettingsModel */ protected function _getFreeFileBaseDirectory() { - return '/application/protected/fluidbookpublication/working/' . $this->id; + return $this->getAssetDir(); } /** @@ -446,9 +451,15 @@ class FluidbookPublication extends ToolboxSettingsModel return protected_path('fluidbookpublication/final/' . $dir . '/' . ($scormVariant ? 'scorm' : 'online')); } + public function getAssetDir() { - return Files::mkdir(protected_path('fluidbookpublication/working/' . $this->id)); + return Files::mkdir(protected_path('fluidbookpublication/working/' . $this->getAssetDirId())); + } + + public function getPDFDir() + { + return Files::mkdir(protected_path('fluidbookpublication/pdf/' . $this->id)); } public function asset_path($path) @@ -723,4 +734,9 @@ class FluidbookPublication extends ToolboxSettingsModel } } } + + public function getAssetDirId() + { + return !isset($this->assetsDir) || !$this->assetsDir ? $this->id : trim($this->assetsDir); + } } -- 2.39.5