]> BookStack Code Mirror - bookstack/commitdiff
PDF: Started new command option, merged options, simplified dompdf
authorDan Brown <redacted>
Mon, 22 Apr 2024 15:40:42 +0000 (16:40 +0100)
committerDan Brown <redacted>
Mon, 22 Apr 2024 15:40:42 +0000 (16:40 +0100)
- Updated DOMPDF to direcly use library instead of depending on barry
wrapper.
- Merged existing export options file into single exports file.
- Defined option for new command option.

Related to #4732

.env.example.complete
app/Config/app.php
app/Config/exports.php [moved from app/Config/dompdf.php with 88% similarity]
app/Config/snappy.php [deleted file]
app/Entities/Tools/PdfGenerator.php
composer.json
composer.lock
readme.md

index 1242968182a0e22b9a8d9b8fa20b60ddda9ec3df..b4beb60cc0ed99a77c03e49f74c27160a252e168 100644 (file)
@@ -325,6 +325,14 @@ FILE_UPLOAD_SIZE_LIMIT=50
 # Can be 'a4' or 'letter'.
 EXPORT_PAGE_SIZE=a4
 
+# Export PDF Command
+# Set a command which can be used to convert a HTML file into a PDF file.
+# When false this will not be used.
+# String values represent the command to be called for conversion.
+# Supports '{input_html_path}' and '{output_pdf_path}' placeholder values.
+# Example: EXPORT_PDF_COMMAND="/scripts/convert.sh {input_html_path} {output_pdf_path}"
+EXPORT_PDF_COMMAND=false
+
 # Set path to wkhtmltopdf binary for PDF generation.
 # Can be 'false' or a path path like: '/home/bins/wkhtmltopdf'
 # When false, BookStack will attempt to find a wkhtmltopdf in the application
index dda787f3f99cbc534d392cea1a579eca3ebb86e5..67f31159f60c03e0f5730dda376dc6e262677920 100644 (file)
@@ -116,7 +116,6 @@ return [
     // Application Service Providers
     'providers' => ServiceProvider::defaultProviders()->merge([
         // Third party service providers
-        Barryvdh\DomPDF\ServiceProvider::class,
         Barryvdh\Snappy\ServiceProvider::class,
         SocialiteProviders\Manager\ServiceProvider::class,
 
similarity index 88%
rename from app/Config/dompdf.php
rename to app/Config/exports.php
index 09dd91bcc3ca762b3a340cefb579eaa8faa6c4a2..63cc2419d3b56ad53037f5214d9a3c4772bdc7ac 100644 (file)
@@ -1,23 +1,56 @@
 <?php
 
 /**
- * DOMPDF configuration options.
+ * Export configuration options.
  *
  * Changes to these config files are not supported by BookStack and may break upon updates.
  * Configuration should be altered via the `.env` file or environment variables.
  * Do not edit this file unless you're happy to maintain any changes yourself.
  */
 
+$snappyPaperSizeMap = [
+    'a4'     => 'A4',
+    'letter' => 'Letter',
+];
+
 $dompdfPaperSizeMap = [
     'a4'     => 'a4',
     'letter' => 'letter',
 ];
 
+$exportPageSize = env('EXPORT_PAGE_SIZE', 'a4');
+
 return [
 
-    'show_warnings' => false,   // Throw an Exception on warnings from dompdf
+    // Set a command which can be used to convert a HTML file into a PDF file.
+    // When false this will not be used.
+    // String values represent the command to be called for conversion.
+    // Supports '{input_html_path}' and '{output_pdf_path}' placeholder values.
+    // Example: EXPORT_PDF_COMMAND="/scripts/convert.sh {input_html_path} {output_pdf_path}"
+    'pdf_command' => env('EXPORT_PDF_COMMAND', false),
+
+    // 2024-04: Snappy/WKHTMLtoPDF now considered deprecated in regard to BookStack support.
+    'snappy' => [
+        'pdf' => [
+            'enabled' => true,
+            'binary'  => file_exists(base_path('wkhtmltopdf')) ? base_path('wkhtmltopdf') : env('WKHTMLTOPDF', false),
+            'timeout' => false,
+            'options' => [
+                'outline'   => true,
+                'page-size' => $snappyPaperSizeMap[$exportPageSize] ?? 'A4',
+            ],
+            'env'     => [],
+        ],
+        'image' => [
+            'enabled' => false,
+            'binary'  => '/usr/local/bin/wkhtmltoimage',
+            'timeout' => false,
+            'options' => [],
+            'env'     => [],
+        ],
+    ],
 
-    'options'       => [
+    'dompdf' => [
         /**
          * The location of the DOMPDF font directory.
          *
@@ -101,7 +134,7 @@ return [
         /**
          * Whether to enable font subsetting or not.
          */
-        'enable_fontsubsetting' => false,
+        'enable_font_subsetting' => false,
 
         /**
          * The PDF rendering backend to use.
@@ -165,7 +198,7 @@ return [
          *
          * @see CPDF_Adapter::PAPER_SIZES for valid sizes ('letter', 'legal', 'A4', etc.)
          */
-        'default_paper_size' => $dompdfPaperSizeMap[env('EXPORT_PAGE_SIZE', 'a4')] ?? 'a4',
+        'default_paper_size' => $dompdfPaperSizeMap[$exportPageSize] ?? 'a4',
 
         /**
          * The default paper orientation.
@@ -268,15 +301,6 @@ return [
          */
         'font_height_ratio' => 1.1,
 
-        /**
-         * Enable CSS float.
-         *
-         * Allows people to disabled CSS float support
-         *
-         * @var bool
-         */
-        'enable_css_float' => true,
-
         /**
          * Use the HTML5 Lib parser.
          *
@@ -286,5 +310,4 @@ return [
          */
         'enable_html5_parser' => true,
     ],
-
 ];
diff --git a/app/Config/snappy.php b/app/Config/snappy.php
deleted file mode 100644 (file)
index a87ce80..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-/**
- * SnappyPDF configuration options.
- *
- * Changes to these config files are not supported by BookStack and may break upon updates.
- * Configuration should be altered via the `.env` file or environment variables.
- * Do not edit this file unless you're happy to maintain any changes yourself.
- */
-
-$snappyPaperSizeMap = [
-    'a4'     => 'A4',
-    'letter' => 'Letter',
-];
-
-return [
-    'pdf' => [
-        'enabled' => true,
-        'binary'  => file_exists(base_path('wkhtmltopdf')) ? base_path('wkhtmltopdf') : env('WKHTMLTOPDF', false),
-        'timeout' => false,
-        'options' => [
-            'outline'   => true,
-            'page-size' => $snappyPaperSizeMap[env('EXPORT_PAGE_SIZE', 'a4')] ?? 'A4',
-        ],
-        'env'     => [],
-    ],
-    'image' => [
-        'enabled' => false,
-        'binary'  => '/usr/local/bin/wkhtmltoimage',
-        'timeout' => false,
-        'options' => [],
-        'env'     => [],
-    ],
-];
index d0c9158a91c3a1dcd2a638461491170276097ff5..7502c10ff43243488c01e7cea82028def07c740f 100644 (file)
@@ -2,27 +2,32 @@
 
 namespace BookStack\Entities\Tools;
 
-use Barryvdh\DomPDF\Facade\Pdf as DomPDF;
 use Barryvdh\Snappy\Facades\SnappyPdf;
+use Dompdf\Dompdf;
 
 class PdfGenerator
 {
     const ENGINE_DOMPDF = 'dompdf';
     const ENGINE_WKHTML = 'wkhtml';
+    const ENGINE_COMMAND = 'command';
 
     /**
      * Generate PDF content from the given HTML content.
      */
     public function fromHtml(string $html): string
     {
-        if ($this->getActiveEngine() === self::ENGINE_WKHTML) {
+        $engine = $this->getActiveEngine();
+
+        if ($engine === self::ENGINE_WKHTML) {
             $pdf = SnappyPDF::loadHTML($html);
             $pdf->setOption('print-media-type', true);
-        } else {
-            $pdf = DomPDF::loadHTML($html);
+            return $pdf->output();
+        } else if ($engine === self::ENGINE_COMMAND) {
+            // TODO - Support PDF command
+            return '';
         }
 
-        return $pdf->output();
+        return $this->renderUsingDomPdf($html);
     }
 
     /**
@@ -31,8 +36,45 @@ class PdfGenerator
      */
     public function getActiveEngine(): string
     {
-        $useWKHTML = config('snappy.pdf.binary') !== false && config('app.allow_untrusted_server_fetching') === true;
+        $wkhtmlBinaryPath = config('snappy.pdf.binary');
+        if (file_exists(base_path('wkhtmltopdf'))) {
+            $wkhtmlBinaryPath = base_path('wkhtmltopdf');
+        }
+
+        if (is_string($wkhtmlBinaryPath) && config('app.allow_untrusted_server_fetching') === true) {
+            return self::ENGINE_WKHTML;
+        }
+
+        return self::ENGINE_DOMPDF;
+    }
+
+    protected function renderUsingDomPdf(string $html): string
+    {
+        $options = config('exports.dompdf');
+        $domPdf = new Dompdf($options);
+        $domPdf->setBasePath(base_path('public'));
 
-        return $useWKHTML ? self::ENGINE_WKHTML : self::ENGINE_DOMPDF;
+        $domPdf->loadHTML($this->convertEntities($html));
+        $domPdf->render();
+
+        return (string) $domPdf->output();
+    }
+
+    /**
+     * Taken from https://github.com/barryvdh/laravel-dompdf/blob/v2.1.1/src/PDF.php
+     * Copyright (c) 2021 barryvdh, MIT License
+     * https://github.com/barryvdh/laravel-dompdf/blob/v2.1.1/LICENSE
+     */
+    protected function convertEntities(string $subject): string
+    {
+        $entities = [
+            '€' => '&euro;',
+            '£' => '&pound;',
+        ];
+
+        foreach ($entities as $search => $replace) {
+            $subject = str_replace($search, $replace, $subject);
+        }
+        return $subject;
     }
 }
index b22c7b44de9ab52ed65291f40a249d6aa9be496c..94f64ec724578e1ba20fff3bdc6df8d7dd6de292 100644 (file)
@@ -17,9 +17,9 @@
         "ext-mbstring": "*",
         "ext-xml": "*",
         "bacon/bacon-qr-code": "^2.0",
-        "barryvdh/laravel-dompdf": "^2.0",
         "barryvdh/laravel-snappy": "^1.0",
         "doctrine/dbal": "^3.5",
+        "dompdf/dompdf": "^2.0",
         "guzzlehttp/guzzle": "^7.4",
         "intervention/image": "^3.5",
         "laravel/framework": "^10.10",
index 24c2215dd5f730d7e022104e29a84029b6cc55ab..657a5a7fb78e4e1a394a6f42b4137073058b9213 100644 (file)
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "ccfc07d0ecc580962915a0457f0466a7",
+    "content-hash": "c0c5a3169cb23d9ab8e34324202d4c37",
     "packages": [
         {
             "name": "aws/aws-crt-php",
             },
             "time": "2022-12-07T17:46:57+00:00"
         },
-        {
-            "name": "barryvdh/laravel-dompdf",
-            "version": "v2.1.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/barryvdh/laravel-dompdf.git",
-                "reference": "cb37868365f9b937039d316727a1fced1e87b31c"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/barryvdh/laravel-dompdf/zipball/cb37868365f9b937039d316727a1fced1e87b31c",
-                "reference": "cb37868365f9b937039d316727a1fced1e87b31c",
-                "shasum": ""
-            },
-            "require": {
-                "dompdf/dompdf": "^2.0.3",
-                "illuminate/support": "^6|^7|^8|^9|^10|^11",
-                "php": "^7.2 || ^8.0"
-            },
-            "require-dev": {
-                "larastan/larastan": "^1.0|^2.7.0",
-                "orchestra/testbench": "^4|^5|^6|^7|^8|^9",
-                "phpro/grumphp": "^1 || ^2.5",
-                "squizlabs/php_codesniffer": "^3.5"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.0-dev"
-                },
-                "laravel": {
-                    "providers": [
-                        "Barryvdh\\DomPDF\\ServiceProvider"
-                    ],
-                    "aliases": {
-                        "Pdf": "Barryvdh\\DomPDF\\Facade\\Pdf",
-                        "PDF": "Barryvdh\\DomPDF\\Facade\\Pdf"
-                    }
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Barryvdh\\DomPDF\\": "src"
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Barry vd. Heuvel",
-                    "email": "[email protected]"
-                }
-            ],
-            "description": "A DOMPDF Wrapper for Laravel",
-            "keywords": [
-                "dompdf",
-                "laravel",
-                "pdf"
-            ],
-            "support": {
-                "issues": "https://github.com/barryvdh/laravel-dompdf/issues",
-                "source": "https://github.com/barryvdh/laravel-dompdf/tree/v2.1.1"
-            },
-            "funding": [
-                {
-                    "url": "https://fruitcake.nl",
-                    "type": "custom"
-                },
-                {
-                    "url": "https://github.com/barryvdh",
-                    "type": "github"
-                }
-            ],
-            "time": "2024-03-15T12:48:39+00:00"
-        },
         {
             "name": "barryvdh/laravel-snappy",
             "version": "v1.0.3",
         },
         {
             "name": "dompdf/dompdf",
-            "version": "v2.0.4",
+            "version": "v2.0.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/dompdf/dompdf.git",
-                "reference": "093f2d9739cec57428e39ddadedfd4f3ae862c0f"
+                "reference": "ab0123052b42ad0867348f25df8c228f1ece8f14"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/dompdf/dompdf/zipball/093f2d9739cec57428e39ddadedfd4f3ae862c0f",
-                "reference": "093f2d9739cec57428e39ddadedfd4f3ae862c0f",
+                "url": "https://api.github.com/repos/dompdf/dompdf/zipball/ab0123052b42ad0867348f25df8c228f1ece8f14",
+                "reference": "ab0123052b42ad0867348f25df8c228f1ece8f14",
                 "shasum": ""
             },
             "require": {
                 "ext-mbstring": "*",
                 "masterminds/html5": "^2.0",
                 "phenx/php-font-lib": ">=0.5.4 <1.0.0",
-                "phenx/php-svg-lib": ">=0.3.3 <1.0.0",
+                "phenx/php-svg-lib": ">=0.5.2 <1.0.0",
                 "php": "^7.1 || ^8.0"
             },
             "require-dev": {
             "homepage": "https://github.com/dompdf/dompdf",
             "support": {
                 "issues": "https://github.com/dompdf/dompdf/issues",
-                "source": "https://github.com/dompdf/dompdf/tree/v2.0.4"
+                "source": "https://github.com/dompdf/dompdf/tree/v2.0.7"
             },
-            "time": "2023-12-12T20:19:39+00:00"
+            "time": "2024-04-15T12:40:33+00:00"
         },
         {
             "name": "dragonmantank/cron-expression",
         },
         {
             "name": "phenx/php-svg-lib",
-            "version": "0.5.3",
+            "version": "0.5.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/dompdf/php-svg-lib.git",
-                "reference": "0e46722c154726a5f9ac218197ccc28adba16fcf"
+                "reference": "46b25da81613a9cf43c83b2a8c2c1bdab27df691"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/0e46722c154726a5f9ac218197ccc28adba16fcf",
-                "reference": "0e46722c154726a5f9ac218197ccc28adba16fcf",
+                "url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/46b25da81613a9cf43c83b2a8c2c1bdab27df691",
+                "reference": "46b25da81613a9cf43c83b2a8c2c1bdab27df691",
                 "shasum": ""
             },
             "require": {
             "homepage": "https://github.com/PhenX/php-svg-lib",
             "support": {
                 "issues": "https://github.com/dompdf/php-svg-lib/issues",
-                "source": "https://github.com/dompdf/php-svg-lib/tree/0.5.3"
+                "source": "https://github.com/dompdf/php-svg-lib/tree/0.5.4"
             },
-            "time": "2024-02-23T20:39:24+00:00"
+            "time": "2024-04-08T12:52:34+00:00"
         },
         {
             "name": "phpoption/phpoption",
index 17e1a05f6593eb1e43042fcce36859fe61bf4b22..5adcc06bbcc7918dbead02f488c83c3a037fb062 100644 (file)
--- a/readme.md
+++ b/readme.md
@@ -142,7 +142,6 @@ Note: This is not an exhaustive list of all libraries and projects that would be
 * [Google Material Icons](https://github.com/google/material-design-icons) - _[Apache-2.0](https://github.com/google/material-design-icons/blob/master/LICENSE)_
 * [markdown-it](https://github.com/markdown-it/markdown-it) and [markdown-it-task-lists](https://github.com/revin/markdown-it-task-lists) - _[MIT](https://github.com/markdown-it/markdown-it/blob/master/LICENSE) and [ISC](https://github.com/revin/markdown-it-task-lists/blob/master/LICENSE)_
 * [Dompdf](https://github.com/dompdf/dompdf) - _[LGPL v2.1](https://github.com/dompdf/dompdf/blob/master/LICENSE.LGPL)_
-* [BarryVD/Dompdf](https://github.com/barryvdh/laravel-dompdf) - _[MIT](https://github.com/barryvdh/laravel-dompdf/blob/master/LICENSE)_
 * [BarryVD/Snappy (WKHTML2PDF)](https://github.com/barryvdh/laravel-snappy) - _[MIT](https://github.com/barryvdh/laravel-snappy/blob/master/LICENSE)_
 * [WKHTMLtoPDF](http://wkhtmltopdf.org/index.html) - _[LGPL v3.0](https://github.com/wkhtmltopdf/wkhtmltopdf/blob/master/LICENSE)_
 * [diagrams.net](https://github.com/jgraph/drawio) - _[Embedded Version Terms](https://www.diagrams.net/trust/) / [Source Project - Apache-2.0](https://github.com/jgraph/drawio/blob/dev/LICENSE)_