From 080acf0a6234952b4eac1df59e9c11d3be04074b Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Sun, 31 Jan 2016 17:53:30 +0000 Subject: [PATCH] Added plaintext & basic PDF page Export --- app/Http/Controllers/PageController.php | 33 ++- app/Http/routes.php | 2 +- app/Services/ExportService.php | 68 +++++- composer.json | 3 +- composer.lock | 215 ++++++++++++++---- config/app.php | 2 + config/dompdf.php | 266 +++++++++++++++++++++++ resources/assets/sass/_header.scss | 6 + resources/assets/sass/_variables.scss | 4 +- resources/assets/sass/export-styles.scss | 2 +- resources/views/pages/export.blade.php | 33 +++ resources/views/pages/pdf.blade.php | 46 ++-- resources/views/pages/show.blade.php | 8 +- storage/fonts/.gitignore | 2 + 14 files changed, 599 insertions(+), 91 deletions(-) create mode 100644 config/dompdf.php create mode 100644 resources/views/pages/export.blade.php create mode 100644 storage/fonts/.gitignore diff --git a/app/Http/Controllers/PageController.php b/app/Http/Controllers/PageController.php index 970d0dc..b4ab968 100644 --- a/app/Http/Controllers/PageController.php +++ b/app/Http/Controllers/PageController.php @@ -226,13 +226,22 @@ public function restoreRevision($bookSlug, $pageSlug, $revisionId) return redirect($page->getUrl()); } + /** + * Exports a page to pdf format using barryvdh/laravel-dompdf wrapper. + * https://github.com/barryvdh/laravel-dompdf + * @param $bookSlug + * @param $pageSlug + * @return \Illuminate\Http\Response + */ public function exportPdf($bookSlug, $pageSlug) { $book = $this->bookRepo->getBySlug($bookSlug); $page = $this->pageRepo->getBySlug($pageSlug, $book->id); - $cssContent = file_get_contents(public_path('/css/styles.css')); - - return $pdf->download($pageSlug . '.pdf'); + $pdfContent = $this->exportService->pageToPdf($page); + return response()->make($pdfContent, 200, [ + 'Content-Type' => 'application/octet-stream', + 'Content-Disposition' => 'attachment; filename="'.$pageSlug.'.pdf' + ]); } /** @@ -251,4 +260,22 @@ public function exportHtml($bookSlug, $pageSlug) 'Content-Disposition' => 'attachment; filename="'.$pageSlug.'.html' ]); } + + /** + * Export a page to a simple plaintext .txt file. + * @param $bookSlug + * @param $pageSlug + * @return \Illuminate\Http\Response + */ + public function exportPlainText($bookSlug, $pageSlug) + { + $book = $this->bookRepo->getBySlug($bookSlug); + $page = $this->pageRepo->getBySlug($pageSlug, $book->id); + $containedHtml = $this->exportService->pageToPlainText($page); + return response()->make($containedHtml, 200, [ + 'Content-Type' => 'application/octet-stream', + 'Content-Disposition' => 'attachment; filename="'.$pageSlug.'.txt' + ]); + } + } diff --git a/app/Http/routes.php b/app/Http/routes.php index 7c6a256..6ac3221 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -24,6 +24,7 @@ Route::get('/{bookSlug}/page/{pageSlug}', 'PageController@show'); Route::get('/{bookSlug}/page/{pageSlug}/export/pdf', 'PageController@exportPdf'); Route::get('/{bookSlug}/page/{pageSlug}/export/html', 'PageController@exportHtml'); + Route::get('/{bookSlug}/page/{pageSlug}/export/plaintext', 'PageController@exportPlainText'); Route::get('/{bookSlug}/page/{pageSlug}/edit', 'PageController@edit'); Route::get('/{bookSlug}/page/{pageSlug}/delete', 'PageController@showDelete'); Route::put('/{bookSlug}/page/{pageSlug}', 'PageController@update'); @@ -46,7 +47,6 @@ }); - // Users Route::get('/users', 'UserController@index'); Route::get('/users/create', 'UserController@create'); diff --git a/app/Services/ExportService.php b/app/Services/ExportService.php index 05ba85d..0497681 100644 --- a/app/Services/ExportService.php +++ b/app/Services/ExportService.php @@ -6,7 +6,6 @@ class ExportService { - /** * Convert a page to a self-contained HTML file. * Includes required CSS & image content. Images are base64 encoded into the HTML. @@ -14,12 +13,35 @@ class ExportService * @return mixed|string */ public function pageToContainedHtml(Page $page) + { + $cssContent = file_get_contents(public_path('/css/export-styles.css')); + $pageHtml = view('pages/export', ['page' => $page, 'css' => $cssContent])->render(); + return $this->containHtml($pageHtml); + } + + /** + * Convert a page to a pdf file. + * @param Page $page + * @return mixed|string + */ + public function pageToPdf(Page $page) { $cssContent = file_get_contents(public_path('/css/export-styles.css')); $pageHtml = view('pages/pdf', ['page' => $page, 'css' => $cssContent])->render(); + $containedHtml = $this->containHtml($pageHtml); + $pdf = \PDF::loadHTML($containedHtml); + return $pdf->output(); + } + /** + * Bundle of the contents of a html file to be self-contained. + * @param $htmlContent + * @return mixed|string + */ + protected function containHtml($htmlContent) + { $imageTagsOutput = []; - preg_match_all("/\/i", $pageHtml, $imageTagsOutput); + preg_match_all("/\/i", $htmlContent, $imageTagsOutput); // Replace image src with base64 encoded image strings if (isset($imageTagsOutput[0]) && count($imageTagsOutput[0]) > 0) { @@ -34,12 +56,12 @@ public function pageToContainedHtml(Page $page) $imageContent = file_get_contents($pathString); $imageEncoded = 'data:image/' . pathinfo($pathString, PATHINFO_EXTENSION) . ';base64,' . base64_encode($imageContent); $newImageString = str_replace($srcString, $imageEncoded, $oldImgString); - $pageHtml = str_replace($oldImgString, $newImageString, $pageHtml); + $htmlContent = str_replace($oldImgString, $newImageString, $htmlContent); } } $linksOutput = []; - preg_match_all("/\/i", $pageHtml, $linksOutput); + preg_match_all("/\/i", $htmlContent, $linksOutput); // Replace image src with base64 encoded image strings if (isset($linksOutput[0]) && count($linksOutput[0]) > 0) { @@ -49,13 +71,45 @@ public function pageToContainedHtml(Page $page) if (strpos(trim($srcString), 'http') !== 0) { $newSrcString = url($srcString); $newLinkString = str_replace($srcString, $newSrcString, $oldLinkString); - $pageHtml = str_replace($oldLinkString, $newLinkString, $pageHtml); + $htmlContent = str_replace($oldLinkString, $newLinkString, $htmlContent); } } } // Replace any relative links with system domain - return $pageHtml; + return $htmlContent; + } + + /** + * Converts the page contents into simple plain text. + * This method filters any bad looking content to + * provide a nice final output. + * @param Page $page + * @return mixed + */ + public function pageToPlainText(Page $page) + { + $text = $page->text; + // Replace multiple spaces with single spaces + $text = preg_replace('/\ {2,}/', ' ', $text); + // Reduce multiple horrid whitespace characters. + $text = preg_replace('/(\x0A|\xA0|\x0A|\r|\n){2,}/su', "\n\n", $text); + $text = html_entity_decode($text); + // Add title + $text = $page->name . "\n\n" . $text; + return $text; } -} \ No newline at end of file +} + + + + + + + + + + + + diff --git a/composer.json b/composer.json index 0f6cec0..4a4c554 100644 --- a/composer.json +++ b/composer.json @@ -11,7 +11,8 @@ "laravel/socialite": "^2.0", "barryvdh/laravel-ide-helper": "^2.1", "barryvdh/laravel-debugbar": "^2.0", - "league/flysystem-aws-s3-v3": "^1.0" + "league/flysystem-aws-s3-v3": "^1.0", + "barryvdh/laravel-dompdf": "0.6.*" }, "require-dev": { "fzaninotto/faker": "~1.4", diff --git a/composer.lock b/composer.lock index d64c48e..ad399b9 100644 --- a/composer.lock +++ b/composer.lock @@ -4,21 +4,21 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "1ca2bc3308d193a556124513e1f57106", - "content-hash": "99d01bead4e1ead29f826cd7eae234ea", + "hash": "523e654de96df9259fa5dfcb583d6e3e", + "content-hash": "74b5601c253aab71cf55e0885f31ae7f", "packages": [ { "name": "aws/aws-sdk-php", - "version": "3.13.1", + "version": "3.14.2", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "cc1796d1c21146cdcbfb7628aee816acb7b85e09" + "reference": "2970cb63e7b7b37dd8c07a4fa4e4e18a110ed4e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/cc1796d1c21146cdcbfb7628aee816acb7b85e09", - "reference": "cc1796d1c21146cdcbfb7628aee816acb7b85e09", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/2970cb63e7b7b37dd8c07a4fa4e4e18a110ed4e2", + "reference": "2970cb63e7b7b37dd8c07a4fa4e4e18a110ed4e2", "shasum": "" }, "require": { @@ -84,7 +84,7 @@ "s3", "sdk" ], - "time": "2016-01-19 22:46:22" + "time": "2016-01-28 21:33:18" }, { "name": "barryvdh/laravel-debugbar", @@ -140,6 +140,54 @@ ], "time": "2015-12-22 06:22:38" }, + { + "name": "barryvdh/laravel-dompdf", + "version": "v0.6.1", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-dompdf.git", + "reference": "b606788108833f7765801dca35455fb23ce9f869" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/laravel-dompdf/zipball/b606788108833f7765801dca35455fb23ce9f869", + "reference": "b606788108833f7765801dca35455fb23ce9f869", + "shasum": "" + }, + "require": { + "dompdf/dompdf": "0.6.*", + "illuminate/support": "5.0.x|5.1.x|5.2.x", + "php": ">=5.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.6-dev" + } + }, + "autoload": { + "psr-4": { + "Barryvdh\\DomPDF\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "A DOMPDF Wrapper for Laravel", + "keywords": [ + "dompdf", + "laravel", + "pdf" + ], + "time": "2015-12-21 19:51:22" + }, { "name": "barryvdh/laravel-ide-helper", "version": "v2.1.2", @@ -357,6 +405,47 @@ ], "time": "2015-11-06 14:35:42" }, + { + "name": "dompdf/dompdf", + "version": "v0.6.2", + "source": { + "type": "git", + "url": "https://github.com/dompdf/dompdf.git", + "reference": "cc06008f75262510ee135b8cbb14e333a309f651" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/dompdf/zipball/cc06008f75262510ee135b8cbb14e333a309f651", + "reference": "cc06008f75262510ee135b8cbb14e333a309f651", + "shasum": "" + }, + "require": { + "phenx/php-font-lib": "0.2.*" + }, + "type": "library", + "autoload": { + "classmap": [ + "include/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL" + ], + "authors": [ + { + "name": "Fabien Ménager", + "email": "fabien.menager@gmail.com" + }, + { + "name": "Brian Sweeney", + "email": "eclecticgeek@gmail.com" + } + ], + "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", + "homepage": "https://github.com/dompdf/dompdf", + "time": "2015-12-07 04:07:13" + }, { "name": "guzzle/guzzle", "version": "v3.8.1", @@ -564,16 +653,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "4d0bdbe1206df7440219ce14c972aa57cc5e4982" + "reference": "f5d04bdd2881ac89abde1fb78cc234bce24327bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/4d0bdbe1206df7440219ce14c972aa57cc5e4982", - "reference": "4d0bdbe1206df7440219ce14c972aa57cc5e4982", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5d04bdd2881ac89abde1fb78cc234bce24327bb", + "reference": "f5d04bdd2881ac89abde1fb78cc234bce24327bb", "shasum": "" }, "require": { @@ -618,7 +707,7 @@ "stream", "uri" ], - "time": "2015-11-03 01:34:55" + "time": "2016-01-23 01:23:02" }, { "name": "intervention/image", @@ -829,16 +918,16 @@ }, { "name": "laravel/framework", - "version": "v5.2.10", + "version": "v5.2.12", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "93dc5b0089eef468157fd7200e575c3861ec59a5" + "reference": "6b6255ad7bfbdb721b8d00b09d52b146c5d363d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/93dc5b0089eef468157fd7200e575c3861ec59a5", - "reference": "93dc5b0089eef468157fd7200e575c3861ec59a5", + "url": "https://api.github.com/repos/laravel/framework/zipball/6b6255ad7bfbdb721b8d00b09d52b146c5d363d7", + "reference": "6b6255ad7bfbdb721b8d00b09d52b146c5d363d7", "shasum": "" }, "require": { @@ -953,7 +1042,7 @@ "framework", "laravel" ], - "time": "2016-01-13 20:29:10" + "time": "2016-01-26 04:15:37" }, { "name": "laravel/socialite", @@ -1343,23 +1432,23 @@ }, { "name": "mtdowling/cron-expression", - "version": "v1.0.4", + "version": "v1.1.0", "source": { "type": "git", "url": "https://github.com/mtdowling/cron-expression.git", - "reference": "fd92e883195e5dfa77720b1868cf084b08be4412" + "reference": "c9ee7886f5a12902b225a1a12f36bb45f9ab89e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/fd92e883195e5dfa77720b1868cf084b08be4412", - "reference": "fd92e883195e5dfa77720b1868cf084b08be4412", + "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/c9ee7886f5a12902b225a1a12f36bb45f9ab89e5", + "reference": "c9ee7886f5a12902b225a1a12f36bb45f9ab89e5", "shasum": "" }, "require": { "php": ">=5.3.2" }, "require-dev": { - "phpunit/phpunit": "4.*" + "phpunit/phpunit": "~4.0|~5.0" }, "type": "library", "autoload": { @@ -1383,7 +1472,7 @@ "cron", "schedule" ], - "time": "2015-01-11 23:07:46" + "time": "2016-01-26 21:23:30" }, { "name": "mtdowling/jmespath.php", @@ -1540,16 +1629,16 @@ }, { "name": "paragonie/random_compat", - "version": "1.1.5", + "version": "1.1.6", "source": { "type": "git", "url": "https://github.com/paragonie/random_compat.git", - "reference": "dd8998b7c846f6909f4e7a5f67fabebfc412a4f7" + "reference": "e6f80ab77885151908d0ec743689ca700886e8b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/dd8998b7c846f6909f4e7a5f67fabebfc412a4f7", - "reference": "dd8998b7c846f6909f4e7a5f67fabebfc412a4f7", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/e6f80ab77885151908d0ec743689ca700886e8b0", + "reference": "e6f80ab77885151908d0ec743689ca700886e8b0", "shasum": "" }, "require": { @@ -1584,7 +1673,41 @@ "pseudorandom", "random" ], - "time": "2016-01-06 13:31:20" + "time": "2016-01-29 16:19:52" + }, + { + "name": "phenx/php-font-lib", + "version": "0.2.2", + "source": { + "type": "git", + "url": "https://github.com/PhenX/php-font-lib.git", + "reference": "c30c7fc00a6b0d863e9bb4c5d5dd015298b2dc82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PhenX/php-font-lib/zipball/c30c7fc00a6b0d863e9bb4c5d5dd015298b2dc82", + "reference": "c30c7fc00a6b0d863e9bb4c5d5dd015298b2dc82", + "shasum": "" + }, + "type": "library", + "autoload": { + "classmap": [ + "classes/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL" + ], + "authors": [ + { + "name": "Fabien Ménager", + "email": "fabien.menager@gmail.com" + } + ], + "description": "A library to read, parse, export and make subsets of different types of font files.", + "homepage": "https://github.com/PhenX/php-font-lib", + "time": "2014-02-01 15:22:28" }, { "name": "phpdocumentor/reflection-docblock", @@ -2261,16 +2384,16 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.0.1", + "version": "v1.1.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "49ff736bd5d41f45240cec77b44967d76e0c3d25" + "reference": "1289d16209491b584839022f29257ad859b8532d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/49ff736bd5d41f45240cec77b44967d76e0c3d25", - "reference": "49ff736bd5d41f45240cec77b44967d76e0c3d25", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/1289d16209491b584839022f29257ad859b8532d", + "reference": "1289d16209491b584839022f29257ad859b8532d", "shasum": "" }, "require": { @@ -2282,7 +2405,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "1.1-dev" } }, "autoload": { @@ -2316,20 +2439,20 @@ "portable", "shim" ], - "time": "2015-11-20 09:19:13" + "time": "2016-01-20 09:13:37" }, { "name": "symfony/polyfill-php56", - "version": "v1.0.1", + "version": "v1.1.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php56.git", - "reference": "e2e77609a9e2328eb370fbb0e0d8b2000ebb488f" + "reference": "4d891fff050101a53a4caabb03277284942d1ad9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/e2e77609a9e2328eb370fbb0e0d8b2000ebb488f", - "reference": "e2e77609a9e2328eb370fbb0e0d8b2000ebb488f", + "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/4d891fff050101a53a4caabb03277284942d1ad9", + "reference": "4d891fff050101a53a4caabb03277284942d1ad9", "shasum": "" }, "require": { @@ -2339,7 +2462,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "1.1-dev" } }, "autoload": { @@ -2372,20 +2495,20 @@ "portable", "shim" ], - "time": "2015-12-18 15:10:25" + "time": "2016-01-20 09:13:37" }, { "name": "symfony/polyfill-util", - "version": "v1.0.1", + "version": "v1.1.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-util.git", - "reference": "4271c55cbc0a77b2641f861b978123e46b3da969" + "reference": "8de62801aa12bc4dfcf85eef5d21981ae7bb3cc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/4271c55cbc0a77b2641f861b978123e46b3da969", - "reference": "4271c55cbc0a77b2641f861b978123e46b3da969", + "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/8de62801aa12bc4dfcf85eef5d21981ae7bb3cc4", + "reference": "8de62801aa12bc4dfcf85eef5d21981ae7bb3cc4", "shasum": "" }, "require": { @@ -2394,7 +2517,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "1.1-dev" } }, "autoload": { @@ -2424,7 +2547,7 @@ "polyfill", "shim" ], - "time": "2015-11-04 20:28:58" + "time": "2016-01-20 09:13:37" }, { "name": "symfony/process", diff --git a/config/app.php b/config/app.php index 65bafef..650ad1d 100644 --- a/config/app.php +++ b/config/app.php @@ -143,6 +143,7 @@ * Third Party */ Intervention\Image\ImageServiceProvider::class, + Barryvdh\DomPDF\ServiceProvider::class, Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class, Barryvdh\Debugbar\ServiceProvider::class, @@ -210,6 +211,7 @@ */ 'ImageTool' => Intervention\Image\Facades\Image::class, + 'PDF' => Barryvdh\DomPDF\Facade::class, 'Debugbar' => Barryvdh\Debugbar\Facade::class, /** diff --git a/config/dompdf.php b/config/dompdf.php new file mode 100644 index 0000000..924bdb9 --- /dev/null +++ b/config/dompdf.php @@ -0,0 +1,266 @@ + false, // Throw an Exception on warnings from dompdf + 'orientation' => 'portrait', + 'defines' => array( + /** + * The location of the DOMPDF font directory + * + * The location of the directory where DOMPDF will store fonts and font metrics + * Note: This directory must exist and be writable by the webserver process. + * *Please note the trailing slash.* + * + * Notes regarding fonts: + * Additional .afm font metrics can be added by executing load_font.php from command line. + * + * Only the original "Base 14 fonts" are present on all pdf viewers. Additional fonts must + * be embedded in the pdf file or the PDF may not display correctly. This can significantly + * increase file size unless font subsetting is enabled. Before embedding a font please + * review your rights under the font license. + * + * Any font specification in the source HTML is translated to the closest font available + * in the font directory. + * + * The pdf standard "Base 14 fonts" are: + * Courier, Courier-Bold, Courier-BoldOblique, Courier-Oblique, + * Helvetica, Helvetica-Bold, Helvetica-BoldOblique, Helvetica-Oblique, + * Times-Roman, Times-Bold, Times-BoldItalic, Times-Italic, + * Symbol, ZapfDingbats. + */ + "DOMPDF_FONT_DIR" => app_path('vendor/dompdf/dompdf/lib/fonts/'), //storage_path('fonts/'), // advised by dompdf (https://github.com/dompdf/dompdf/pull/782) + + /** + * The location of the DOMPDF font cache directory + * + * This directory contains the cached font metrics for the fonts used by DOMPDF. + * This directory can be the same as DOMPDF_FONT_DIR + * + * Note: This directory must exist and be writable by the webserver process. + */ + "DOMPDF_FONT_CACHE" => storage_path('fonts/'), + + /** + * The location of a temporary directory. + * + * The directory specified must be writeable by the webserver process. + * The temporary directory is required to download remote images and when + * using the PFDLib back end. + */ + "DOMPDF_TEMP_DIR" => sys_get_temp_dir(), + + /** + * ==== IMPORTANT ==== + * + * dompdf's "chroot": Prevents dompdf from accessing system files or other + * files on the webserver. All local files opened by dompdf must be in a + * subdirectory of this directory. DO NOT set it to '/' since this could + * allow an attacker to use dompdf to read any files on the server. This + * should be an absolute path. + * This is only checked on command line call by dompdf.php, but not by + * direct class use like: + * $dompdf = new DOMPDF(); $dompdf->load_html($htmldata); $dompdf->render(); $pdfdata = $dompdf->output(); + */ + "DOMPDF_CHROOT" => realpath(base_path()), + + /** + * Whether to use Unicode fonts or not. + * + * When set to true the PDF backend must be set to "CPDF" and fonts must be + * loaded via load_font.php. + * + * When enabled, dompdf can support all Unicode glyphs. Any glyphs used in a + * document must be present in your fonts, however. + */ + "DOMPDF_UNICODE_ENABLED" => true, + + /** + * Whether to enable font subsetting or not. + */ + "DOMPDF_ENABLE_FONTSUBSETTING" => false, + + /** + * The PDF rendering backend to use + * + * Valid settings are 'PDFLib', 'CPDF' (the bundled R&OS PDF class), 'GD' and + * 'auto'. 'auto' will look for PDFLib and use it if found, or if not it will + * fall back on CPDF. 'GD' renders PDFs to graphic files. {@link + * Canvas_Factory} ultimately determines which rendering class to instantiate + * based on this setting. + * + * Both PDFLib & CPDF rendering backends provide sufficient rendering + * capabilities for dompdf, however additional features (e.g. object, + * image and font support, etc.) differ between backends. Please see + * {@link PDFLib_Adapter} for more information on the PDFLib backend + * and {@link CPDF_Adapter} and lib/class.pdf.php for more information + * on CPDF. Also see the documentation for each backend at the links + * below. + * + * The GD rendering backend is a little different than PDFLib and + * CPDF. Several features of CPDF and PDFLib are not supported or do + * not make any sense when creating image files. For example, + * multiple pages are not supported, nor are PDF 'objects'. Have a + * look at {@link GD_Adapter} for more information. GD support is + * experimental, so use it at your own risk. + * + * @link http://www.pdflib.com + * @link http://www.ros.co.nz/pdf + * @link http://www.php.net/image + */ + "DOMPDF_PDF_BACKEND" => "CPDF", + + /** + * PDFlib license key + * + * If you are using a licensed, commercial version of PDFlib, specify + * your license key here. If you are using PDFlib-Lite or are evaluating + * the commercial version of PDFlib, comment out this setting. + * + * @link http://www.pdflib.com + * + * If pdflib present in web server and auto or selected explicitely above, + * a real license code must exist! + */ + //"DOMPDF_PDFLIB_LICENSE" => "your license key here", + + /** + * html target media view which should be rendered into pdf. + * List of types and parsing rules for future extensions: + * http://www.w3.org/TR/REC-html40/types.html + * screen, tty, tv, projection, handheld, print, braille, aural, all + * Note: aural is deprecated in CSS 2.1 because it is replaced by speech in CSS 3. + * Note, even though the generated pdf file is intended for print output, + * the desired content might be different (e.g. screen or projection view of html file). + * Therefore allow specification of content here. + */ + "DOMPDF_DEFAULT_MEDIA_TYPE" => "screen", + + /** + * The default paper size. + * + * North America standard is "letter"; other countries generally "a4" + * + * @see CPDF_Adapter::PAPER_SIZES for valid sizes ('letter', 'legal', 'A4', etc.) + */ + "DOMPDF_DEFAULT_PAPER_SIZE" => "a4", + + /** + * The default font family + * + * Used if no suitable fonts can be found. This must exist in the font folder. + * @var string + */ + "DOMPDF_DEFAULT_FONT" => "dejavu sans", + + /** + * Image DPI setting + * + * This setting determines the default DPI setting for images and fonts. The + * DPI may be overridden for inline images by explictly setting the + * image's width & height style attributes (i.e. if the image's native + * width is 600 pixels and you specify the image's width as 72 points, + * the image will have a DPI of 600 in the rendered PDF. The DPI of + * background images can not be overridden and is controlled entirely + * via this parameter. + * + * For the purposes of DOMPDF, pixels per inch (PPI) = dots per inch (DPI). + * If a size in html is given as px (or without unit as image size), + * this tells the corresponding size in pt. + * This adjusts the relative sizes to be similar to the rendering of the + * html page in a reference browser. + * + * In pdf, always 1 pt = 1/72 inch + * + * Rendering resolution of various browsers in px per inch: + * Windows Firefox and Internet Explorer: + * SystemControl->Display properties->FontResolution: Default:96, largefonts:120, custom:? + * Linux Firefox: + * about:config *resolution: Default:96 + * (xorg screen dimension in mm and Desktop font dpi settings are ignored) + * + * Take care about extra font/image zoom factor of browser. + * + * In images, size in pixel attribute, img css style, are overriding + * the real image dimension in px for rendering. + * + * @var int + */ + "DOMPDF_DPI" => 96, + + /** + * Enable inline PHP + * + * If this setting is set to true then DOMPDF will automatically evaluate + * inline PHP contained within tags. + * + * Enabling this for documents you do not trust (e.g. arbitrary remote html + * pages) is a security risk. Set this option to false if you wish to process + * untrusted documents. + * + * @var bool + */ + "DOMPDF_ENABLE_PHP" => false, + + /** + * Enable inline Javascript + * + * If this setting is set to true then DOMPDF will automatically insert + * JavaScript code contained within tags. + * + * @var bool + */ + "DOMPDF_ENABLE_JAVASCRIPT" => true, + + /** + * Enable remote file access + * + * If this setting is set to true, DOMPDF will access remote sites for + * images and CSS files as required. + * This is required for part of test case www/test/image_variants.html through www/examples.php + * + * Attention! + * This can be a security risk, in particular in combination with DOMPDF_ENABLE_PHP and + * allowing remote access to dompdf.php or on allowing remote html code to be passed to + * $dompdf = new DOMPDF(, $dompdf->load_html(..., + * This allows anonymous users to download legally doubtful internet content which on + * tracing back appears to being downloaded by your server, or allows malicious php code + * in remote html pages to be executed by your server with your account privileges. + * + * @var bool + */ + "DOMPDF_ENABLE_REMOTE" => true, + + /** + * A ratio applied to the fonts height to be more like browsers' line height + */ + "DOMPDF_FONT_HEIGHT_RATIO" => 1.1, + + /** + * Enable CSS float + * + * Allows people to disabled CSS float support + * @var bool + */ + "DOMPDF_ENABLE_CSS_FLOAT" => true, + + + /** + * Use the more-than-experimental HTML5 Lib parser + */ + "DOMPDF_ENABLE_HTML5PARSER" => true, + + + ), + + +); diff --git a/resources/assets/sass/_header.scss b/resources/assets/sass/_header.scss index 22c9994..de1f3d1 100644 --- a/resources/assets/sass/_header.scss +++ b/resources/assets/sass/_header.scss @@ -161,6 +161,12 @@ form.search-box { padding: $-xs 0; color: #555; text-align: left !important; + &.wide { + min-width: 220px; + } + .text-muted { + color: #999; + } a { display: block; padding: $-xs $-m; diff --git a/resources/assets/sass/_variables.scss b/resources/assets/sass/_variables.scss index 29a4630..7677b2f 100644 --- a/resources/assets/sass/_variables.scss +++ b/resources/assets/sass/_variables.scss @@ -27,8 +27,8 @@ $-xs: 6px; $-xxs: 3px; // Fonts -$heading: 'Roboto', Helvetica, Arial, sans-serif; -$text: 'Roboto', Helvetica, Arial, sans-serif; +$heading: 'Roboto', 'DejaVu Sans', Helvetica, Arial, sans-serif; +$text: 'Roboto', 'DejaVu Sans', Helvetica, Arial, sans-serif; $fs-m: 15px; $fs-s: 14px; diff --git a/resources/assets/sass/export-styles.scss b/resources/assets/sass/export-styles.scss index 31a89b4..90fdb19 100644 --- a/resources/assets/sass/export-styles.scss +++ b/resources/assets/sass/export-styles.scss @@ -1,4 +1,4 @@ -@import "reset"; +//@import "reset"; @import "variables"; @import "mixins"; @import "html"; diff --git a/resources/views/pages/export.blade.php b/resources/views/pages/export.blade.php new file mode 100644 index 0000000..96f0629 --- /dev/null +++ b/resources/views/pages/export.blade.php @@ -0,0 +1,33 @@ + + + + + {{ $page->name }} + + + @yield('head') + + +
+
+
+
+ + @include('pages/page-display') + +
+ +

+ Created {{$page->created_at->toDayDateTimeString()}} @if($page->createdBy) by {{$page->createdBy->name}} @endif +
+ Last Updated {{$page->updated_at->toDayDateTimeString()}} @if($page->updatedBy) by {{$page->updatedBy->name}} @endif +

+ +
+
+
+
+ + diff --git a/resources/views/pages/pdf.blade.php b/resources/views/pages/pdf.blade.php index 73cf131..1077c09 100644 --- a/resources/views/pages/pdf.blade.php +++ b/resources/views/pages/pdf.blade.php @@ -1,32 +1,24 @@ - - - - - {{ $page->name }} +@extends('pages/export') +@section('head') - - -
-
-
-
- - @include('pages/page-display') + body { + font-size: 15px; + line-height: 1; + } -
+ h1, h2, h3, h4, h5, h6 { + line-height: 1; + } -

- Created {{$page->created_at->diffForHumans()}} @if($page->createdBy) by {{$page->createdBy->name}} @endif -
- Last Updated {{$page->updated_at->diffForHumans()}} @if($page->updatedBy) by {{$page->updatedBy->name}} @endif -

+ table { + max-width: 800px !important; + font-size: 0.8em; + width: auto !important; + } -
-
-
-
- - + table td { + width: auto !important; + } + +@stop \ No newline at end of file diff --git a/resources/views/pages/show.blade.php b/resources/views/pages/show.blade.php index f2ce6fb..a2c82fd 100644 --- a/resources/views/pages/show.blade.php +++ b/resources/views/pages/show.blade.php @@ -20,9 +20,11 @@
-
Export Page
-