From 79ab852bf5a1c9a0c33960cf8c69a4b73476d6cb Mon Sep 17 00:00:00 2001 From: Adrien Crivelli Date: Sat, 14 Oct 2017 14:57:44 +0900 Subject: [PATCH] Expose PDF writer to be used directly We used to have some kind of wrapper that didn't do much except forward methods to the real instance. That unnecessary complexity made it harder to work with the real writer instance. --- composer.json | 3 + docs/topics/migration-from-PHPExcel.md | 12 +- docs/topics/reading-and-writing-to-file.md | 31 ++- samples/Basic/01_Simple_download_pdf.php | 6 +- samples/Basic/26_Utf8.php | 6 +- samples/Chart/32_Chart_read_write_PDF.php | 6 +- samples/Pdf/21_Pdf_Domdf.php | 4 +- samples/Pdf/21_Pdf_TCPDF.php | 4 +- samples/Pdf/21_Pdf_mPDF.php | 4 +- src/PhpSpreadsheet/Helper/Migrator.php | 2 +- src/PhpSpreadsheet/IOFactory.php | 9 + src/PhpSpreadsheet/Settings.php | 37 +-- src/PhpSpreadsheet/Writer/Pdf.php | 280 +++++++++++++++++--- src/PhpSpreadsheet/Writer/Pdf/Core.php | 282 --------------------- src/PhpSpreadsheet/Writer/Pdf/DomPDF.php | 3 +- src/PhpSpreadsheet/Writer/Pdf/MPDF.php | 3 +- src/PhpSpreadsheet/Writer/Pdf/TcPDF.php | 3 +- 17 files changed, 319 insertions(+), 376 deletions(-) delete mode 100644 src/PhpSpreadsheet/Writer/Pdf/Core.php diff --git a/composer.json b/composer.json index 199534f1..4c05ed40 100644 --- a/composer.json +++ b/composer.json @@ -27,6 +27,9 @@ "php-cs-fixer fix --ansi --dry-run --diff", "phpcs --report-width=200 --report-summary --report-full samples/ src/ tests/ --ignore=samples/Header.php --standard=PSR2 -n", "phpunit --color=always" + ], + "fix": [ + "php-cs-fixer fix --ansi" ] }, "require": { diff --git a/docs/topics/migration-from-PHPExcel.md b/docs/topics/migration-from-PHPExcel.md index 04374959..8a1eba77 100644 --- a/docs/topics/migration-from-PHPExcel.md +++ b/docs/topics/migration-from-PHPExcel.md @@ -124,13 +124,15 @@ autoloading mechanism. ## Writing PDF -`PHPExcel_Settings::setPdfRenderer()` and `PHPExcel_Settings::setPdfRenderer()` -were removed and PDF libraries must be installed via composer. So the only thing -to do is to specify a renderer like so: +`PHPExcel_Settings::getPdfRenderer()` and `PHPExcel_Settings::setPdfRenderer()` +were removed. `PHPExcel_Settings::getPdfRendererName()` and +`PHPExcel_Settings::setPdfRendererName()` were renamed as `setDefaultPdfWriter()` +and `setDefaultPdfWriter()` respectively. And PDF libraries must be installed via +composer. So the only thing to do is to specify a default writer class like so: ```php -$rendererName = \PhpOffice\PhpSpreadsheet\Settings::PDF_RENDERER_MPDF; -\PhpOffice\PhpSpreadsheet\Settings::setPdfRendererName($rendererName); +$rendererName = \PhpOffice\PhpSpreadsheet\Writer\Pdf\MPDF::class; +\PhpOffice\PhpSpreadsheet\Settings::setDefaultPdfWriter($rendererName); ``` ## PclZip and ZipArchive diff --git a/docs/topics/reading-and-writing-to-file.md b/docs/topics/reading-and-writing-to-file.md index 5bc05b74..b0ef11b1 100644 --- a/docs/topics/reading-and-writing-to-file.md +++ b/docs/topics/reading-and-writing-to-file.md @@ -745,11 +745,11 @@ of different libraries. Currently, the following libraries are supported: -Library | Downloadable from | PhpSpreadsheet Internal Constant ---------|-------------------------------------|--------------------------------- -tcPDF | https://github.com/tecnickcom/tcpdf | PDF_RENDERER_TCPDF -mPDF | https://github.com/mpdf/mpdf | PDF_RENDERER_MPDF -domPDF | https://github.com/dompdf/dompdf | PDF_RENDERER_DOMPDF +Library | Downloadable from | PhpSpreadsheet writer +--------|-------------------------------------|---------------------- +tcPDF | https://github.com/tecnickcom/tcpdf | TcPdf +mPDF | https://github.com/mpdf/mpdf | MPDF +domPDF | https://github.com/dompdf/dompdf | DomPDF The different libraries have different strengths and weaknesses. Some generate better formatted output than others, some are faster or use @@ -757,12 +757,19 @@ less memory than others, while some generate smaller .pdf files. It is the developers choice which one they wish to use, appropriate to their own circumstances. -Before instantiating a Writer to generate PDF output, you will need to -indicate which Rendering library you are using. +Before instantiating a Writer via `IOFactory` to generate PDF output, +you will need to indicate which writer you are using: ``` php -$rendererName = \PhpOffice\PhpSpreadsheet\Settings::PDF_RENDERER_MPDF; -\PhpOffice\PhpSpreadsheet\Settings::setPdfRendererName($rendererName); +$rendererName = \PhpOffice\PhpSpreadsheet\Writer\Pdf\MPDF::class; +\PhpOffice\PhpSpreadsheet\Settings::setDefaultPdfWriter($rendererName); +$writer = \PhpOffice\PhpSpreadsheet\IOFactory\IOFactory::createWriter($spreadsheet, 'Pdf'); +``` + +Or you can instantiate directly the writer of your choice like so: + +``` php +$writer = \PhpOffice\PhpSpreadsheet\Writer\Pdf\MPDF($spreadsheet); ``` #### Writing a spreadsheet @@ -771,11 +778,11 @@ Once you have identified the Renderer that you wish to use for PDF generation, you can write a .pdf file using the following code: ``` php -$writer = new \PhpOffice\PhpSpreadsheet\Writer\Pdf($spreadsheet); +$writer = new \PhpOffice\PhpSpreadsheet\Writer\Pdf\MPDF($spreadsheet); $writer->save("05featuredemo.pdf"); ``` -Please note that \PhpOffice\PhpSpreadsheet\Writer\Pdf only outputs the +Please note that `\PhpOffice\PhpSpreadsheet\Writer\Pdf` only outputs the first worksheet by default. #### Write all worksheets @@ -803,7 +810,7 @@ This can be slow on large spreadsheets, and maybe even unwanted. You can however disable formula pre-calculation: ``` php -$writer = new \PhpOffice\PhpSpreadsheet\Writer\Pdf($spreadsheet); +$writer = new \PhpOffice\PhpSpreadsheet\Writer\Pdf\MPDF($spreadsheet); $writer->setPreCalculateFormulas(false); $writer->save("05featuredemo.pdf"); diff --git a/samples/Basic/01_Simple_download_pdf.php b/samples/Basic/01_Simple_download_pdf.php index 7f013194..7b53c4f2 100644 --- a/samples/Basic/01_Simple_download_pdf.php +++ b/samples/Basic/01_Simple_download_pdf.php @@ -16,9 +16,7 @@ if ($helper->isCli()) { // Change these values to select the Rendering library that you wish to use // and its directory location on your server -//$rendererName = \PhpOffice\PhpSpreadsheet\Settings::PDF_RENDERER_TCPDF; -$rendererName = Settings::PDF_RENDERER_MPDF; -//$rendererName = \PhpOffice\PhpSpreadsheet\Settings::PDF_RENDERER_DOMPDF; +$rendererName = \PhpOffice\PhpSpreadsheet\Writer\Pdf\MPDF::class; // Create new Spreadsheet object $spreadsheet = new Spreadsheet(); @@ -51,7 +49,7 @@ $spreadsheet->getActiveSheet()->setShowGridLines(false); // Set active sheet index to the first sheet, so Excel opens this as the first sheet $spreadsheet->setActiveSheetIndex(0); -Settings::setPdfRendererName($rendererName); +Settings::setDefaultPdfWriter($rendererName); // Redirect output to a client’s web browser (PDF) header('Content-Type: application/pdf'); diff --git a/samples/Basic/26_Utf8.php b/samples/Basic/26_Utf8.php index 89be2c94..45a9ad60 100644 --- a/samples/Basic/26_Utf8.php +++ b/samples/Basic/26_Utf8.php @@ -7,9 +7,7 @@ require __DIR__ . '/../Header.php'; // Change these values to select the PDF Rendering library that you wish to use // and its directory location on your server -//$rendererName = \PhpOffice\PhpSpreadsheet\Settings::PDF_RENDERER_TCPDF; -//$rendererName = \PhpOffice\PhpSpreadsheet\Settings::PDF_RENDERER_MPDF; -$rendererName = Settings::PDF_RENDERER_DOMPDF; +$rendererName = \PhpOffice\PhpSpreadsheet\Writer\Pdf\DomPDF::class; // Read from Xlsx (.xlsx) template $helper->log('Load Xlsx template file'); @@ -21,7 +19,7 @@ $helper->write($spreadsheet, __FILE__, ['Xlsx', 'Xls', 'Html']); // Export to PDF (.pdf) $helper->log('Write to PDF format'); -Settings::setPdfRendererName($rendererName); +Settings::setDefaultPdfWriter($rendererName); $helper->write($spreadsheet, __FILE__, ['Pdf']); // Remove first two rows with field headers before exporting to CSV diff --git a/samples/Chart/32_Chart_read_write_PDF.php b/samples/Chart/32_Chart_read_write_PDF.php index c18ab872..987020ac 100644 --- a/samples/Chart/32_Chart_read_write_PDF.php +++ b/samples/Chart/32_Chart_read_write_PDF.php @@ -7,11 +7,9 @@ require __DIR__ . '/../Header.php'; // Change these values to select the Rendering library that you wish to use // for PDF files, and its directory location on your server -//$rendererName = \PhpOffice\PhpSpreadsheet\Settings::PDF_RENDERER_TCPDF; -$rendererName = Settings::PDF_RENDERER_MPDF; -//$rendererName = \PhpOffice\PhpSpreadsheet\Settings::PDF_RENDERER_DOMPDF; +$rendererName = \PhpOffice\PhpSpreadsheet\Writer\Pdf\MPDF::class; -Settings::setPdfRendererName($rendererName); +Settings::setDefaultPdfWriter($rendererName); // Change these values to select the Rendering library that you wish to use // for Chart images, and its directory location on your server diff --git a/samples/Pdf/21_Pdf_Domdf.php b/samples/Pdf/21_Pdf_Domdf.php index 6750da2f..4c6c7f07 100644 --- a/samples/Pdf/21_Pdf_Domdf.php +++ b/samples/Pdf/21_Pdf_Domdf.php @@ -12,9 +12,9 @@ $spreadsheet->getActiveSheet()->setShowGridLines(false); $helper->log('Set orientation to landscape'); $spreadsheet->getActiveSheet()->getPageSetup()->setOrientation(PageSetup::ORIENTATION_LANDSCAPE); -$rendererName = Settings::PDF_RENDERER_DOMPDF; +$rendererName = \PhpOffice\PhpSpreadsheet\Writer\Pdf\DomPDF::class; $helper->log("Write to PDF format using {$rendererName}"); -Settings::setPdfRendererName($rendererName); +Settings::setDefaultPdfWriter($rendererName); // Save $helper->write($spreadsheet, __FILE__, ['Pdf']); diff --git a/samples/Pdf/21_Pdf_TCPDF.php b/samples/Pdf/21_Pdf_TCPDF.php index 683ba547..11c1d4fb 100644 --- a/samples/Pdf/21_Pdf_TCPDF.php +++ b/samples/Pdf/21_Pdf_TCPDF.php @@ -12,9 +12,9 @@ $spreadsheet->getActiveSheet()->setShowGridLines(false); $helper->log('Set orientation to landscape'); $spreadsheet->getActiveSheet()->getPageSetup()->setOrientation(PageSetup::ORIENTATION_LANDSCAPE); -$rendererName = Settings::PDF_RENDERER_TCPDF; +$rendererName = \PhpOffice\PhpSpreadsheet\Writer\Pdf\TcPDF::class; $helper->log("Write to PDF format using {$rendererName}"); -Settings::setPdfRendererName($rendererName); +Settings::setDefaultPdfWriter($rendererName); // Save $helper->write($spreadsheet, __FILE__, ['Pdf']); diff --git a/samples/Pdf/21_Pdf_mPDF.php b/samples/Pdf/21_Pdf_mPDF.php index 1d455c5b..faad16fe 100644 --- a/samples/Pdf/21_Pdf_mPDF.php +++ b/samples/Pdf/21_Pdf_mPDF.php @@ -12,9 +12,9 @@ $spreadsheet->getActiveSheet()->setShowGridLines(false); $helper->log('Set orientation to landscape'); $spreadsheet->getActiveSheet()->getPageSetup()->setOrientation(PageSetup::ORIENTATION_LANDSCAPE); -$rendererName = Settings::PDF_RENDERER_MPDF; +$rendererName = \PhpOffice\PhpSpreadsheet\Writer\Pdf\MPDF::class; $helper->log("Write to PDF format using {$rendererName}"); -Settings::setPdfRendererName($rendererName); +Settings::setDefaultPdfWriter($rendererName); // Save $helper->write($spreadsheet, __FILE__, ['Pdf']); diff --git a/src/PhpSpreadsheet/Helper/Migrator.php b/src/PhpSpreadsheet/Helper/Migrator.php index 51252d0b..7162d8d9 100644 --- a/src/PhpSpreadsheet/Helper/Migrator.php +++ b/src/PhpSpreadsheet/Helper/Migrator.php @@ -59,7 +59,7 @@ class Migrator 'PHPExcel_Writer_OpenDocument_Styles' => \PhpOffice\PhpSpreadsheet\Writer\Ods\Styles::class, 'PHPExcel_Writer_OpenDocument_Thumbnails' => \PhpOffice\PhpSpreadsheet\Writer\Ods\Thumbnails::class, 'PHPExcel_Writer_OpenDocument_WriterPart' => \PhpOffice\PhpSpreadsheet\Writer\Ods\WriterPart::class, - 'PHPExcel_Writer_PDF_Core' => \PhpOffice\PhpSpreadsheet\Writer\Pdf\Core::class, + 'PHPExcel_Writer_PDF_Core' => \PhpOffice\PhpSpreadsheet\Writer\Pdf::class, 'PHPExcel_Writer_PDF_DomPDF' => \PhpOffice\PhpSpreadsheet\Writer\Pdf\DomPDF::class, 'PHPExcel_Writer_PDF_mPDF' => \PhpOffice\PhpSpreadsheet\Writer\Pdf\MPDF::class, 'PHPExcel_Writer_PDF_tcPDF' => \PhpOffice\PhpSpreadsheet\Writer\Pdf\TcPDF::class, diff --git a/src/PhpSpreadsheet/IOFactory.php b/src/PhpSpreadsheet/IOFactory.php index 9b3a0f2d..941e1892 100644 --- a/src/PhpSpreadsheet/IOFactory.php +++ b/src/PhpSpreadsheet/IOFactory.php @@ -98,6 +98,15 @@ class IOFactory // Search type $searchType = 'IWriter'; + if ($writerType === 'Pdf') { + $pdfWriter = Settings::getDefaultPdfWriter(); + if ($pdfWriter === null) { + throw new Exception('PDF default writer has not been defined.'); + } + + return new $pdfWriter($spreadsheet); + } + // Include class foreach (self::$searchLocations as $searchLocation) { if ($searchLocation['type'] == $searchType) { diff --git a/src/PhpSpreadsheet/Settings.php b/src/PhpSpreadsheet/Settings.php index b17b886a..1f71cda6 100644 --- a/src/PhpSpreadsheet/Settings.php +++ b/src/PhpSpreadsheet/Settings.php @@ -3,6 +3,7 @@ namespace PhpOffice\PhpSpreadsheet; use PhpOffice\PhpSpreadsheet\Collection\Memory; +use PhpOffice\PhpSpreadsheet\Writer\Pdf; use Psr\SimpleCache\CacheInterface; class Settings @@ -10,19 +11,9 @@ class Settings /** Optional Chart Rendering libraries */ const CHART_RENDERER_JPGRAPH = 'JpGraph'; - /** Optional PDF Rendering libraries */ - const PDF_RENDERER_TCPDF = 'TcPDF'; - const PDF_RENDERER_DOMPDF = 'DomPDF'; - const PDF_RENDERER_MPDF = 'MPDF'; - private static $chartRenderers = [ self::CHART_RENDERER_JPGRAPH, ]; - private static $pdfRenderers = [ - self::PDF_RENDERER_TCPDF, - self::PDF_RENDERER_DOMPDF, - self::PDF_RENDERER_MPDF, - ]; /** * Name of the external Library used for rendering charts @@ -47,7 +38,7 @@ class Settings * * @var string */ - private static $pdfRendererName; + private static $defaultPdfWriter; /** * Default options for libxml loader. @@ -152,33 +143,27 @@ class Settings } /** - * Identify to PhpSpreadsheet the external library to use for rendering PDF files. + * Identify to PhpSpreadsheet the default writer to use for PDF. * - * @param string $libraryName Internal reference name of the library - * e.g. \PhpOffice\PhpSpreadsheet\Settings::PDF_RENDERER_TCPDF, - * \PhpOffice\PhpSpreadsheet\Settings::PDF_RENDERER_DOMPDF - * or \PhpOffice\PhpSpreadsheet\Settings::PDF_RENDERER_MPDF + * @param string $writerClassName Internal reference name of the library */ - public static function setPdfRendererName($libraryName) + public static function setDefaultPdfWriter($writerClassName) { - if (!in_array($libraryName, self::$pdfRenderers)) { - throw new Exception('"' . $libraryName . '" is not a valid PDF library name'); + if (!is_a($writerClassName, Pdf::class, true)) { + throw new Exception('"' . $writerClassName . '" is not a valid PDF writer class name'); } - self::$pdfRendererName = $libraryName; + self::$defaultPdfWriter = $writerClassName; } /** - * Return the PDF Rendering Library that PhpSpreadsheet is currently configured to use (e.g. dompdf). + * Return the default PDF writer that PhpSpreadsheet is currently configured to use (e.g. dompdf). * * @return null|string Internal reference name of the PDF Rendering Library that PhpSpreadsheet is * currently configured to use - * e.g. \PhpOffice\PhpSpreadsheet\Settings::PDF_RENDERER_TCPDF, - * \PhpOffice\PhpSpreadsheet\Settings::PDF_RENDERER_DOMPDF - * or \PhpOffice\PhpSpreadsheet\Settings::PDF_RENDERER_MPDF */ - public static function getPdfRendererName() + public static function getDefaultPdfWriter() { - return self::$pdfRendererName; + return self::$defaultPdfWriter; } /** diff --git a/src/PhpSpreadsheet/Writer/Pdf.php b/src/PhpSpreadsheet/Writer/Pdf.php index 55e71953..93a03acd 100644 --- a/src/PhpSpreadsheet/Writer/Pdf.php +++ b/src/PhpSpreadsheet/Writer/Pdf.php @@ -2,58 +2,280 @@ namespace PhpOffice\PhpSpreadsheet\Writer; -use PhpOffice\PhpSpreadsheet\Settings; +use PhpOffice\PhpSpreadsheet\Calculation; +use PhpOffice\PhpSpreadsheet\Shared\File; use PhpOffice\PhpSpreadsheet\Spreadsheet; +use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup; +use PhpOffice\PhpSpreadsheet\Writer\Exception as WriterException; -class Pdf implements IWriter +abstract class Pdf extends Html implements IWriter { /** - * The wrapper for the requested PDF rendering engine. + * Temporary storage directory. * - * @var PDF\Core + * @var string */ - private $renderer; + protected $tempDir = ''; /** - * Instantiate a new renderer of the configured type within this container class. + * Font. * - * @param Spreadsheet $spreadsheet PhpSpreadsheet object + * @var string + */ + protected $font = 'freesans'; + + /** + * Orientation (Over-ride). * - * @throws Exception when PDF library is not configured + * @var string + */ + protected $orientation; + + /** + * Paper size (Over-ride). + * + * @var int + */ + protected $paperSize; + + /** + * Temporary storage for Save Array Return type. + * + * @var string + */ + private $saveArrayReturnType; + + /** + * Paper Sizes xRef List. + * + * @var array + */ + protected static $paperSizes = [ + PageSetup::PAPERSIZE_LETTER => 'LETTER', // (8.5 in. by 11 in.) + PageSetup::PAPERSIZE_LETTER_SMALL => 'LETTER', // (8.5 in. by 11 in.) + PageSetup::PAPERSIZE_TABLOID => [792.00, 1224.00], // (11 in. by 17 in.) + PageSetup::PAPERSIZE_LEDGER => [1224.00, 792.00], // (17 in. by 11 in.) + PageSetup::PAPERSIZE_LEGAL => 'LEGAL', // (8.5 in. by 14 in.) + PageSetup::PAPERSIZE_STATEMENT => [396.00, 612.00], // (5.5 in. by 8.5 in.) + PageSetup::PAPERSIZE_EXECUTIVE => 'EXECUTIVE', // (7.25 in. by 10.5 in.) + PageSetup::PAPERSIZE_A3 => 'A3', // (297 mm by 420 mm) + PageSetup::PAPERSIZE_A4 => 'A4', // (210 mm by 297 mm) + PageSetup::PAPERSIZE_A4_SMALL => 'A4', // (210 mm by 297 mm) + PageSetup::PAPERSIZE_A5 => 'A5', // (148 mm by 210 mm) + PageSetup::PAPERSIZE_B4 => 'B4', // (250 mm by 353 mm) + PageSetup::PAPERSIZE_B5 => 'B5', // (176 mm by 250 mm) + PageSetup::PAPERSIZE_FOLIO => 'FOLIO', // (8.5 in. by 13 in.) + PageSetup::PAPERSIZE_QUARTO => [609.45, 779.53], // (215 mm by 275 mm) + PageSetup::PAPERSIZE_STANDARD_1 => [720.00, 1008.00], // (10 in. by 14 in.) + PageSetup::PAPERSIZE_STANDARD_2 => [792.00, 1224.00], // (11 in. by 17 in.) + PageSetup::PAPERSIZE_NOTE => 'LETTER', // (8.5 in. by 11 in.) + PageSetup::PAPERSIZE_NO9_ENVELOPE => [279.00, 639.00], // (3.875 in. by 8.875 in.) + PageSetup::PAPERSIZE_NO10_ENVELOPE => [297.00, 684.00], // (4.125 in. by 9.5 in.) + PageSetup::PAPERSIZE_NO11_ENVELOPE => [324.00, 747.00], // (4.5 in. by 10.375 in.) + PageSetup::PAPERSIZE_NO12_ENVELOPE => [342.00, 792.00], // (4.75 in. by 11 in.) + PageSetup::PAPERSIZE_NO14_ENVELOPE => [360.00, 828.00], // (5 in. by 11.5 in.) + PageSetup::PAPERSIZE_C => [1224.00, 1584.00], // (17 in. by 22 in.) + PageSetup::PAPERSIZE_D => [1584.00, 2448.00], // (22 in. by 34 in.) + PageSetup::PAPERSIZE_E => [2448.00, 3168.00], // (34 in. by 44 in.) + PageSetup::PAPERSIZE_DL_ENVELOPE => [311.81, 623.62], // (110 mm by 220 mm) + PageSetup::PAPERSIZE_C5_ENVELOPE => 'C5', // (162 mm by 229 mm) + PageSetup::PAPERSIZE_C3_ENVELOPE => 'C3', // (324 mm by 458 mm) + PageSetup::PAPERSIZE_C4_ENVELOPE => 'C4', // (229 mm by 324 mm) + PageSetup::PAPERSIZE_C6_ENVELOPE => 'C6', // (114 mm by 162 mm) + PageSetup::PAPERSIZE_C65_ENVELOPE => [323.15, 649.13], // (114 mm by 229 mm) + PageSetup::PAPERSIZE_B4_ENVELOPE => 'B4', // (250 mm by 353 mm) + PageSetup::PAPERSIZE_B5_ENVELOPE => 'B5', // (176 mm by 250 mm) + PageSetup::PAPERSIZE_B6_ENVELOPE => [498.90, 354.33], // (176 mm by 125 mm) + PageSetup::PAPERSIZE_ITALY_ENVELOPE => [311.81, 651.97], // (110 mm by 230 mm) + PageSetup::PAPERSIZE_MONARCH_ENVELOPE => [279.00, 540.00], // (3.875 in. by 7.5 in.) + PageSetup::PAPERSIZE_6_3_4_ENVELOPE => [261.00, 468.00], // (3.625 in. by 6.5 in.) + PageSetup::PAPERSIZE_US_STANDARD_FANFOLD => [1071.00, 792.00], // (14.875 in. by 11 in.) + PageSetup::PAPERSIZE_GERMAN_STANDARD_FANFOLD => [612.00, 864.00], // (8.5 in. by 12 in.) + PageSetup::PAPERSIZE_GERMAN_LEGAL_FANFOLD => 'FOLIO', // (8.5 in. by 13 in.) + PageSetup::PAPERSIZE_ISO_B4 => 'B4', // (250 mm by 353 mm) + PageSetup::PAPERSIZE_JAPANESE_DOUBLE_POSTCARD => [566.93, 419.53], // (200 mm by 148 mm) + PageSetup::PAPERSIZE_STANDARD_PAPER_1 => [648.00, 792.00], // (9 in. by 11 in.) + PageSetup::PAPERSIZE_STANDARD_PAPER_2 => [720.00, 792.00], // (10 in. by 11 in.) + PageSetup::PAPERSIZE_STANDARD_PAPER_3 => [1080.00, 792.00], // (15 in. by 11 in.) + PageSetup::PAPERSIZE_INVITE_ENVELOPE => [623.62, 623.62], // (220 mm by 220 mm) + PageSetup::PAPERSIZE_LETTER_EXTRA_PAPER => [667.80, 864.00], // (9.275 in. by 12 in.) + PageSetup::PAPERSIZE_LEGAL_EXTRA_PAPER => [667.80, 1080.00], // (9.275 in. by 15 in.) + PageSetup::PAPERSIZE_TABLOID_EXTRA_PAPER => [841.68, 1296.00], // (11.69 in. by 18 in.) + PageSetup::PAPERSIZE_A4_EXTRA_PAPER => [668.98, 912.76], // (236 mm by 322 mm) + PageSetup::PAPERSIZE_LETTER_TRANSVERSE_PAPER => [595.80, 792.00], // (8.275 in. by 11 in.) + PageSetup::PAPERSIZE_A4_TRANSVERSE_PAPER => 'A4', // (210 mm by 297 mm) + PageSetup::PAPERSIZE_LETTER_EXTRA_TRANSVERSE_PAPER => [667.80, 864.00], // (9.275 in. by 12 in.) + PageSetup::PAPERSIZE_SUPERA_SUPERA_A4_PAPER => [643.46, 1009.13], // (227 mm by 356 mm) + PageSetup::PAPERSIZE_SUPERB_SUPERB_A3_PAPER => [864.57, 1380.47], // (305 mm by 487 mm) + PageSetup::PAPERSIZE_LETTER_PLUS_PAPER => [612.00, 913.68], // (8.5 in. by 12.69 in.) + PageSetup::PAPERSIZE_A4_PLUS_PAPER => [595.28, 935.43], // (210 mm by 330 mm) + PageSetup::PAPERSIZE_A5_TRANSVERSE_PAPER => 'A5', // (148 mm by 210 mm) + PageSetup::PAPERSIZE_JIS_B5_TRANSVERSE_PAPER => [515.91, 728.50], // (182 mm by 257 mm) + PageSetup::PAPERSIZE_A3_EXTRA_PAPER => [912.76, 1261.42], // (322 mm by 445 mm) + PageSetup::PAPERSIZE_A5_EXTRA_PAPER => [493.23, 666.14], // (174 mm by 235 mm) + PageSetup::PAPERSIZE_ISO_B5_EXTRA_PAPER => [569.76, 782.36], // (201 mm by 276 mm) + PageSetup::PAPERSIZE_A2_PAPER => 'A2', // (420 mm by 594 mm) + PageSetup::PAPERSIZE_A3_TRANSVERSE_PAPER => 'A3', // (297 mm by 420 mm) + PageSetup::PAPERSIZE_A3_EXTRA_TRANSVERSE_PAPER => [912.76, 1261.42], // (322 mm by 445 mm) + ]; + + /** + * Create a new PDF Writer instance. + * + * @param Spreadsheet $spreadsheet Spreadsheet object */ public function __construct(Spreadsheet $spreadsheet) { - $pdfLibraryName = Settings::getPdfRendererName(); - if ($pdfLibraryName === null) { - throw new Exception('PDF Rendering library has not been defined.'); - } - - $rendererName = '\\PhpOffice\\PhpSpreadsheet\\Writer\\Pdf\\' . $pdfLibraryName; - $this->renderer = new $rendererName($spreadsheet); + parent::__construct($spreadsheet); + $this->setUseInlineCss(true); + $this->tempDir = File::sysGetTempDir(); } /** - * Magic method to handle direct calls to the configured PDF renderer wrapper class. + * Get Font. * - * @param string $name Renderer library method name - * @param mixed[] $arguments Array of arguments to pass to the renderer method - * - * @return mixed Returned data from the PDF renderer wrapper method + * @return string */ - public function __call($name, $arguments) + public function getFont() { - if ($this->renderer === null) { - throw new Exception('PDF Rendering library has not been defined.'); - } - - return call_user_func_array([$this->renderer, $name], $arguments); + return $this->font; } /** - * {@inheritdoc} + * Set font. Examples: + * 'arialunicid0-chinese-simplified' + * 'arialunicid0-chinese-traditional' + * 'arialunicid0-korean' + * 'arialunicid0-japanese'. + * + * @param string $fontName */ - public function save($pFilename) + public function setFont($fontName) { - $this->renderer->save($pFilename); + $this->font = $fontName; + + return $this; + } + + /** + * Get Paper Size. + * + * @return int + */ + public function getPaperSize() + { + return $this->paperSize; + } + + /** + * Set Paper Size. + * + * @param string $pValue Paper size see PageSetup::PAPERSIZE_* + * + * @return self + */ + public function setPaperSize($pValue) + { + $this->paperSize = $pValue; + + return $this; + } + + /** + * Get Orientation. + * + * @return string + */ + public function getOrientation() + { + return $this->orientation; + } + + /** + * Set Orientation. + * + * @param string $pValue Page orientation see PageSetup::ORIENTATION_* + * + * @return self + */ + public function setOrientation($pValue) + { + $this->orientation = $pValue; + + return $this; + } + + /** + * Get temporary storage directory. + * + * @return string + */ + public function getTempDir() + { + return $this->tempDir; + } + + /** + * Set temporary storage directory. + * + * @param string $pValue Temporary storage directory + * + * @throws WriterException when directory does not exist + * + * @return self + */ + public function setTempDir($pValue) + { + if (is_dir($pValue)) { + $this->tempDir = $pValue; + } else { + throw new WriterException("Directory does not exist: $pValue"); + } + + return $this; + } + + /** + * Save Spreadsheet to PDF file, pre-save. + * + * @param string $pFilename Name of the file to save as + * + * @throws WriterException + */ + protected function prepareForSave($pFilename) + { + // garbage collect + $this->spreadsheet->garbageCollect(); + + $this->saveArrayReturnType = Calculation::getArrayReturnType(); + Calculation::setArrayReturnType(Calculation::RETURN_ARRAY_AS_VALUE); + + // Open file + $fileHandle = fopen($pFilename, 'w'); + if ($fileHandle === false) { + throw new WriterException("Could not open file $pFilename for writing."); + } + + // Set PDF + $this->isPdf = true; + // Build CSS + $this->buildCSS(true); + + return $fileHandle; + } + + /** + * Save PhpSpreadsheet to PDF file, post-save. + * + * @param resource $fileHandle + * + * @throws WriterException + */ + protected function restoreStateAfterSave($fileHandle) + { + // Close file + fclose($fileHandle); + + Calculation::setArrayReturnType($this->saveArrayReturnType); } } diff --git a/src/PhpSpreadsheet/Writer/Pdf/Core.php b/src/PhpSpreadsheet/Writer/Pdf/Core.php deleted file mode 100644 index 0f0a74c9..00000000 --- a/src/PhpSpreadsheet/Writer/Pdf/Core.php +++ /dev/null @@ -1,282 +0,0 @@ - 'LETTER', // (8.5 in. by 11 in.) - PageSetup::PAPERSIZE_LETTER_SMALL => 'LETTER', // (8.5 in. by 11 in.) - PageSetup::PAPERSIZE_TABLOID => [792.00, 1224.00], // (11 in. by 17 in.) - PageSetup::PAPERSIZE_LEDGER => [1224.00, 792.00], // (17 in. by 11 in.) - PageSetup::PAPERSIZE_LEGAL => 'LEGAL', // (8.5 in. by 14 in.) - PageSetup::PAPERSIZE_STATEMENT => [396.00, 612.00], // (5.5 in. by 8.5 in.) - PageSetup::PAPERSIZE_EXECUTIVE => 'EXECUTIVE', // (7.25 in. by 10.5 in.) - PageSetup::PAPERSIZE_A3 => 'A3', // (297 mm by 420 mm) - PageSetup::PAPERSIZE_A4 => 'A4', // (210 mm by 297 mm) - PageSetup::PAPERSIZE_A4_SMALL => 'A4', // (210 mm by 297 mm) - PageSetup::PAPERSIZE_A5 => 'A5', // (148 mm by 210 mm) - PageSetup::PAPERSIZE_B4 => 'B4', // (250 mm by 353 mm) - PageSetup::PAPERSIZE_B5 => 'B5', // (176 mm by 250 mm) - PageSetup::PAPERSIZE_FOLIO => 'FOLIO', // (8.5 in. by 13 in.) - PageSetup::PAPERSIZE_QUARTO => [609.45, 779.53], // (215 mm by 275 mm) - PageSetup::PAPERSIZE_STANDARD_1 => [720.00, 1008.00], // (10 in. by 14 in.) - PageSetup::PAPERSIZE_STANDARD_2 => [792.00, 1224.00], // (11 in. by 17 in.) - PageSetup::PAPERSIZE_NOTE => 'LETTER', // (8.5 in. by 11 in.) - PageSetup::PAPERSIZE_NO9_ENVELOPE => [279.00, 639.00], // (3.875 in. by 8.875 in.) - PageSetup::PAPERSIZE_NO10_ENVELOPE => [297.00, 684.00], // (4.125 in. by 9.5 in.) - PageSetup::PAPERSIZE_NO11_ENVELOPE => [324.00, 747.00], // (4.5 in. by 10.375 in.) - PageSetup::PAPERSIZE_NO12_ENVELOPE => [342.00, 792.00], // (4.75 in. by 11 in.) - PageSetup::PAPERSIZE_NO14_ENVELOPE => [360.00, 828.00], // (5 in. by 11.5 in.) - PageSetup::PAPERSIZE_C => [1224.00, 1584.00], // (17 in. by 22 in.) - PageSetup::PAPERSIZE_D => [1584.00, 2448.00], // (22 in. by 34 in.) - PageSetup::PAPERSIZE_E => [2448.00, 3168.00], // (34 in. by 44 in.) - PageSetup::PAPERSIZE_DL_ENVELOPE => [311.81, 623.62], // (110 mm by 220 mm) - PageSetup::PAPERSIZE_C5_ENVELOPE => 'C5', // (162 mm by 229 mm) - PageSetup::PAPERSIZE_C3_ENVELOPE => 'C3', // (324 mm by 458 mm) - PageSetup::PAPERSIZE_C4_ENVELOPE => 'C4', // (229 mm by 324 mm) - PageSetup::PAPERSIZE_C6_ENVELOPE => 'C6', // (114 mm by 162 mm) - PageSetup::PAPERSIZE_C65_ENVELOPE => [323.15, 649.13], // (114 mm by 229 mm) - PageSetup::PAPERSIZE_B4_ENVELOPE => 'B4', // (250 mm by 353 mm) - PageSetup::PAPERSIZE_B5_ENVELOPE => 'B5', // (176 mm by 250 mm) - PageSetup::PAPERSIZE_B6_ENVELOPE => [498.90, 354.33], // (176 mm by 125 mm) - PageSetup::PAPERSIZE_ITALY_ENVELOPE => [311.81, 651.97], // (110 mm by 230 mm) - PageSetup::PAPERSIZE_MONARCH_ENVELOPE => [279.00, 540.00], // (3.875 in. by 7.5 in.) - PageSetup::PAPERSIZE_6_3_4_ENVELOPE => [261.00, 468.00], // (3.625 in. by 6.5 in.) - PageSetup::PAPERSIZE_US_STANDARD_FANFOLD => [1071.00, 792.00], // (14.875 in. by 11 in.) - PageSetup::PAPERSIZE_GERMAN_STANDARD_FANFOLD => [612.00, 864.00], // (8.5 in. by 12 in.) - PageSetup::PAPERSIZE_GERMAN_LEGAL_FANFOLD => 'FOLIO', // (8.5 in. by 13 in.) - PageSetup::PAPERSIZE_ISO_B4 => 'B4', // (250 mm by 353 mm) - PageSetup::PAPERSIZE_JAPANESE_DOUBLE_POSTCARD => [566.93, 419.53], // (200 mm by 148 mm) - PageSetup::PAPERSIZE_STANDARD_PAPER_1 => [648.00, 792.00], // (9 in. by 11 in.) - PageSetup::PAPERSIZE_STANDARD_PAPER_2 => [720.00, 792.00], // (10 in. by 11 in.) - PageSetup::PAPERSIZE_STANDARD_PAPER_3 => [1080.00, 792.00], // (15 in. by 11 in.) - PageSetup::PAPERSIZE_INVITE_ENVELOPE => [623.62, 623.62], // (220 mm by 220 mm) - PageSetup::PAPERSIZE_LETTER_EXTRA_PAPER => [667.80, 864.00], // (9.275 in. by 12 in.) - PageSetup::PAPERSIZE_LEGAL_EXTRA_PAPER => [667.80, 1080.00], // (9.275 in. by 15 in.) - PageSetup::PAPERSIZE_TABLOID_EXTRA_PAPER => [841.68, 1296.00], // (11.69 in. by 18 in.) - PageSetup::PAPERSIZE_A4_EXTRA_PAPER => [668.98, 912.76], // (236 mm by 322 mm) - PageSetup::PAPERSIZE_LETTER_TRANSVERSE_PAPER => [595.80, 792.00], // (8.275 in. by 11 in.) - PageSetup::PAPERSIZE_A4_TRANSVERSE_PAPER => 'A4', // (210 mm by 297 mm) - PageSetup::PAPERSIZE_LETTER_EXTRA_TRANSVERSE_PAPER => [667.80, 864.00], // (9.275 in. by 12 in.) - PageSetup::PAPERSIZE_SUPERA_SUPERA_A4_PAPER => [643.46, 1009.13], // (227 mm by 356 mm) - PageSetup::PAPERSIZE_SUPERB_SUPERB_A3_PAPER => [864.57, 1380.47], // (305 mm by 487 mm) - PageSetup::PAPERSIZE_LETTER_PLUS_PAPER => [612.00, 913.68], // (8.5 in. by 12.69 in.) - PageSetup::PAPERSIZE_A4_PLUS_PAPER => [595.28, 935.43], // (210 mm by 330 mm) - PageSetup::PAPERSIZE_A5_TRANSVERSE_PAPER => 'A5', // (148 mm by 210 mm) - PageSetup::PAPERSIZE_JIS_B5_TRANSVERSE_PAPER => [515.91, 728.50], // (182 mm by 257 mm) - PageSetup::PAPERSIZE_A3_EXTRA_PAPER => [912.76, 1261.42], // (322 mm by 445 mm) - PageSetup::PAPERSIZE_A5_EXTRA_PAPER => [493.23, 666.14], // (174 mm by 235 mm) - PageSetup::PAPERSIZE_ISO_B5_EXTRA_PAPER => [569.76, 782.36], // (201 mm by 276 mm) - PageSetup::PAPERSIZE_A2_PAPER => 'A2', // (420 mm by 594 mm) - PageSetup::PAPERSIZE_A3_TRANSVERSE_PAPER => 'A3', // (297 mm by 420 mm) - PageSetup::PAPERSIZE_A3_EXTRA_TRANSVERSE_PAPER => [912.76, 1261.42], // (322 mm by 445 mm) - ]; - - /** - * Create a new PDF Writer instance. - * - * @param Spreadsheet $spreadsheet Spreadsheet object - */ - public function __construct(Spreadsheet $spreadsheet) - { - parent::__construct($spreadsheet); - $this->setUseInlineCss(true); - $this->tempDir = File::sysGetTempDir(); - } - - /** - * Get Font. - * - * @return string - */ - public function getFont() - { - return $this->font; - } - - /** - * Set font. Examples: - * 'arialunicid0-chinese-simplified' - * 'arialunicid0-chinese-traditional' - * 'arialunicid0-korean' - * 'arialunicid0-japanese'. - * - * @param string $fontName - */ - public function setFont($fontName) - { - $this->font = $fontName; - - return $this; - } - - /** - * Get Paper Size. - * - * @return int - */ - public function getPaperSize() - { - return $this->paperSize; - } - - /** - * Set Paper Size. - * - * @param string $pValue Paper size see PageSetup::PAPERSIZE_* - * - * @return self - */ - public function setPaperSize($pValue) - { - $this->paperSize = $pValue; - - return $this; - } - - /** - * Get Orientation. - * - * @return string - */ - public function getOrientation() - { - return $this->orientation; - } - - /** - * Set Orientation. - * - * @param string $pValue Page orientation see PageSetup::ORIENTATION_* - * - * @return self - */ - public function setOrientation($pValue) - { - $this->orientation = $pValue; - - return $this; - } - - /** - * Get temporary storage directory. - * - * @return string - */ - public function getTempDir() - { - return $this->tempDir; - } - - /** - * Set temporary storage directory. - * - * @param string $pValue Temporary storage directory - * - * @throws WriterException when directory does not exist - * - * @return self - */ - public function setTempDir($pValue) - { - if (is_dir($pValue)) { - $this->tempDir = $pValue; - } else { - throw new WriterException("Directory does not exist: $pValue"); - } - - return $this; - } - - /** - * Save Spreadsheet to PDF file, pre-save. - * - * @param string $pFilename Name of the file to save as - * - * @throws WriterException - */ - protected function prepareForSave($pFilename) - { - // garbage collect - $this->spreadsheet->garbageCollect(); - - $this->saveArrayReturnType = Calculation::getArrayReturnType(); - Calculation::setArrayReturnType(Calculation::RETURN_ARRAY_AS_VALUE); - - // Open file - $fileHandle = fopen($pFilename, 'w'); - if ($fileHandle === false) { - throw new WriterException("Could not open file $pFilename for writing."); - } - - // Set PDF - $this->isPdf = true; - // Build CSS - $this->buildCSS(true); - - return $fileHandle; - } - - /** - * Save PhpSpreadsheet to PDF file, post-save. - * - * @param resource $fileHandle - * - * @throws WriterException - */ - protected function restoreStateAfterSave($fileHandle) - { - // Close file - fclose($fileHandle); - - Calculation::setArrayReturnType($this->saveArrayReturnType); - } -} diff --git a/src/PhpSpreadsheet/Writer/Pdf/DomPDF.php b/src/PhpSpreadsheet/Writer/Pdf/DomPDF.php index 0c4b39e9..363dd127 100644 --- a/src/PhpSpreadsheet/Writer/Pdf/DomPDF.php +++ b/src/PhpSpreadsheet/Writer/Pdf/DomPDF.php @@ -4,8 +4,9 @@ namespace PhpOffice\PhpSpreadsheet\Writer\Pdf; use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup; use PhpOffice\PhpSpreadsheet\Writer\IWriter; +use PhpOffice\PhpSpreadsheet\Writer\Pdf; -class DomPDF extends Core implements IWriter +class DomPDF extends Pdf implements IWriter { /** * Save Spreadsheet to file. diff --git a/src/PhpSpreadsheet/Writer/Pdf/MPDF.php b/src/PhpSpreadsheet/Writer/Pdf/MPDF.php index c97197bb..385eab6a 100644 --- a/src/PhpSpreadsheet/Writer/Pdf/MPDF.php +++ b/src/PhpSpreadsheet/Writer/Pdf/MPDF.php @@ -5,8 +5,9 @@ namespace PhpOffice\PhpSpreadsheet\Writer\Pdf; use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException; use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup; use PhpOffice\PhpSpreadsheet\Writer\IWriter; +use PhpOffice\PhpSpreadsheet\Writer\Pdf; -class MPDF extends Core implements IWriter +class MPDF extends Pdf implements IWriter { /** * Save Spreadsheet to file. diff --git a/src/PhpSpreadsheet/Writer/Pdf/TcPDF.php b/src/PhpSpreadsheet/Writer/Pdf/TcPDF.php index 42f577ed..e5e9d2e1 100644 --- a/src/PhpSpreadsheet/Writer/Pdf/TcPDF.php +++ b/src/PhpSpreadsheet/Writer/Pdf/TcPDF.php @@ -4,8 +4,9 @@ namespace PhpOffice\PhpSpreadsheet\Writer\Pdf; use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup; use PhpOffice\PhpSpreadsheet\Writer\IWriter; +use PhpOffice\PhpSpreadsheet\Writer\Pdf; -class TcPDF extends Core implements IWriter +class TcPDF extends Pdf implements IWriter { /** * Save Spreadsheet to file.