]> _ Git - fluidbook-toolbox.git/commitdiff
wait #5893 @1.5
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Thu, 27 Apr 2023 18:24:54 +0000 (20:24 +0200)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Thu, 27 Apr 2023 18:24:54 +0000 (20:24 +0200)
app/Fluidbook/Compiler.php
app/Http/Controllers/Admin/FluidbookCollectionCrudController.php
app/Http/Controllers/Admin/FluidbookPublicationCrudController.php
app/Http/Controllers/Admin/Operations/FluidbookPublication/Services/ExportPdfOperation.php [new file with mode: 0644]
app/Http/Controllers/Admin/Operations/FluidbookPublication/Services/SocialImageOperation.php
app/Models/FluidbookPublication.php

index 10d73c9d695946fa74c09886fda7436a51f1277f..8cf4d20162f757d56f1fa5b6dff1ebf39fe06f56 100644 (file)
@@ -2881,6 +2881,7 @@ height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
                 $v = $data[$k] = !!$v;
             }
         }
+        $data['id'] = $this->book_id;
         return 'var SETTINGS=' . json_encode($data) . ';' . "\n";
     }
 
index 48cfd7074a72194962ba56fd2d7e50df171bdf2f..213998969b95dbbfba397e9afc3ba05e016ccb4c 100644 (file)
@@ -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;
        
 
index f15358c4d769d0ef11645e5c93ca5d77b90cfa20..d940a59d31044155aa6a0d753eb1cd88f92fcde8 100644 (file)
@@ -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 (file)
index 0000000..dea5f05
--- /dev/null
@@ -0,0 +1,178 @@
+<?php
+
+namespace App\Http\Controllers\Admin\Operations\FluidbookPublication\Services;
+
+use App\Http\Middleware\CheckIfAdmin;
+use App\Models\FluidbookPublication;
+use Cubist\Backpack\Http\Controllers\Base\XSendFileController;
+use Cubist\Util\ArrayUtil;
+use Cubist\Util\CommandLine;
+use Cubist\Util\Files\Files;
+use Illuminate\Support\Facades\Route;
+
+trait ExportPdfOperation
+{
+    protected function setupExportpdfRoutes($segment, $routeName, $controller)
+    {
+        foreach (['services', 's'] as $s) {
+            Route::match(['get'], $s . '/e/{cid}/{range}', $controller . '@pdfdownload')->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('<!DOCTYPE html>
+<html>
+<head>
+    <script type="text/javascript">
+        document.addEventListener("DOMContentLoaded", function() {
+            document.getElementById(\'pdf\').addEventListener("readystatechange", function(event){printPDF();});
+        });
+        function printPDF() {
+            var iframe = document.getElementById(\'pdf\');
+            setTimeout(function() {
+                try {
+                    iframe.contentWindow.print();
+                } catch (err) {
+                }
+            }, 2000);
+        }
+    </script>
+    <style>
+        *{
+            padding:0;
+            margin:0;
+        }
+        html,body{
+            height:100%;
+        }
+
+        body{
+            overflow: hidden;
+        }
+    </style>
+</head>
+<body>
+    <iframe id="pdf" name="pdff" src="/s/p/' . $cid . '/' . $range . '" width="100%" height="100%" onload="printPDF();"></iframe>
+</body>
+</html>');
+    }
+
+    /**
+     * @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;
+    }
+
+}
index 1efcb398d4a40bf6b353d782d310d6c70aa30258..47d3aa619b1881d25cfc78261d366bbb64bf0806 100644 (file)
@@ -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()
index 7b9faa99fb6fa79cd1627a92d436c83cee62ef95..f4ab0910ea3a585489af32c9024ef94e6a226e3a 100644 (file)
@@ -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);
+    }
 }