Fix Some Pdf Problems (#2960)

* Fix Some Pdf Problems

Fix #1747. No support for text rotation in Pdf. That issue actually has a decent workaround, but PhpSpreadsheet should handle it on its own. Mpdf requires the proprietary text-rotate css attribute; Html and Dompdf will use the CSS3 attribute transform:rotate.

Fix #1713. Some paper-size values in PhpSpreadsheet are strings, some are 2-element float arrays. Dompdf accepts strings or 4-element float arrays, where the first 2 elements are always 0. Convert the PhpSpreadsheet array accordingly before passing it to Dompdf.

Some tests had been disabled when Dompdf and Tcpdf were slow to achieve PHP8 compliance. They achieved it some time ago. Re-enable the tests.

* Remove Tcpdf From One Test

No problem with the other tests I added it in for.
This commit is contained in:
oleibman 2022-07-29 06:14:28 -07:00 committed by GitHub
parent e748ac7c03
commit 39df9c3bcc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 174 additions and 21 deletions

View File

@ -12,12 +12,10 @@ $spreadsheet = $reader->load(__DIR__ . '/../templates/26template.xlsx');
// at this point, we could do some manipulations with the template, but we skip this step
$helper->write($spreadsheet, __FILE__, ['Xlsx', 'Xls', 'Html']);
if (\PHP_VERSION_ID < 80000) {
// Export to PDF (.pdf)
$helper->log('Write to PDF format');
IOFactory::registerWriter('Pdf', \PhpOffice\PhpSpreadsheet\Writer\Pdf\Dompdf::class);
$helper->write($spreadsheet, __FILE__, ['Pdf']);
}
// Export to PDF (.pdf)
$helper->log('Write to PDF format');
IOFactory::registerWriter('Pdf', \PhpOffice\PhpSpreadsheet\Writer\Pdf\Dompdf::class);
$helper->write($spreadsheet, __FILE__, ['Pdf']);
// Remove first two rows with field headers before exporting to CSV
$helper->log('Removing first two heading rows for CSV export');

View File

@ -32,13 +32,11 @@ $spreadsheet->getActiveSheet()->setShowGridLines(false);
$helper->log('Set orientation to landscape');
$spreadsheet->getActiveSheet()->getPageSetup()->setOrientation(PageSetup::ORIENTATION_LANDSCAPE);
if (\PHP_VERSION_ID < 80000) {
$helper->log('Write to Dompdf');
$writer = new Dompdf($spreadsheet);
$filename = $helper->getFileName('21b_Pdf_dompdf.xlsx', 'pdf');
$writer->setEditHtmlCallback('replaceBody');
$writer->save($filename);
}
$helper->log('Write to Dompdf');
$writer = new Dompdf($spreadsheet);
$filename = $helper->getFileName('21b_Pdf_dompdf.xlsx', 'pdf');
$writer->setEditHtmlCallback('replaceBody');
$writer->save($filename);
$helper->log('Write to Mpdf');
$writer = new Mpdf($spreadsheet);
@ -46,10 +44,8 @@ $filename = $helper->getFileName('21b_Pdf_mpdf.xlsx', 'pdf');
$writer->setEditHtmlCallback('replaceBody');
$writer->save($filename);
if (\PHP_VERSION_ID < 80000) {
$helper->log('Write to Tcpdf');
$writer = new Tcpdf($spreadsheet);
$filename = $helper->getFileName('21b_Pdf_tcpdf.xlsx', 'pdf');
$writer->setEditHtmlCallback('replaceBody');
$writer->save($filename);
}
$helper->log('Write to Tcpdf');
$writer = new Tcpdf($spreadsheet);
$filename = $helper->getFileName('21b_Pdf_tcpdf.xlsx', 'pdf');
$writer->setEditHtmlCallback('replaceBody');
$writer->save($filename);

View File

@ -126,6 +126,13 @@ class Html extends BaseWriter
*/
protected $isPdf = false;
/**
* Is the current writer creating mPDF?
*
* @var bool
*/
protected $isMPdf = false;
/**
* Generate the Navigation block.
*
@ -1003,6 +1010,14 @@ class Html extends BaseWriter
$css['padding-' . $textAlign] = (string) ((int) $alignment->getIndent() * 9) . 'px';
}
}
$rotation = $alignment->getTextRotation();
if ($rotation !== 0 && $rotation !== Alignment::TEXTROTATION_STACK_PHPSPREADSHEET) {
if ($this->isMPdf) {
$css['text-rotate'] = "$rotation";
} else {
$css['transform'] = "rotate({$rotation}deg)";
}
}
return $css;
}

View File

@ -35,6 +35,9 @@ class Dompdf extends Pdf
$orientation = ($orientation === PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P';
$printPaperSize = $this->getPaperSize() ?? $setup->getPaperSize();
$paperSize = self::$paperSizes[$printPaperSize] ?? PageSetup::getPaperSizeDefault();
if (is_array($paperSize) && count($paperSize) === 2) {
$paperSize = [0.0, 0.0, $paperSize[0], $paperSize[1]];
}
$orientation = ($orientation == 'L') ? 'landscape' : 'portrait';

View File

@ -8,6 +8,9 @@ use PhpOffice\PhpSpreadsheet\Writer\Pdf;
class Mpdf extends Pdf
{
/** @var bool */
protected $isMPdf = true;
/**
* Gets the implementation of external PDF library that should be used.
*

View File

@ -17,12 +17,13 @@ class StreamTest extends TestCase
['Csv'],
['Html'],
['Mpdf'],
['Dompdf'],
];
if (\PHP_VERSION_ID < 80000) {
$providerFormats = array_merge(
$providerFormats,
[['Tcpdf'], ['Dompdf']]
[['Tcpdf']]
);
}

View File

@ -0,0 +1,65 @@
<?php
namespace PhpOffice\PhpSpreadsheetTests\Writer\Dompdf;
use PhpOffice\PhpSpreadsheet\Shared\File;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Dompdf;
use PHPUnit\Framework\TestCase;
class PaperSizeArrayTest extends TestCase
{
/** @var string */
private $outfile = '';
protected function tearDown(): void
{
if ($this->outfile !== '') {
unlink($this->outfile);
$this->outfile = '';
}
}
public function testPaperSizeArray(): void
{
// Issue 1713 - array in PhpSpreadsheet is 2 elements,
// but in Dompdf it is 4 elements, first 2 are zero.
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// TABLOID is a 2-element array in Writer/Pdf.php $paperSizes
$size = PageSetup::PAPERSIZE_TABLOID;
$sheet->getPageSetup()->setPaperSize($size);
$sheet->setPrintGridlines(true);
$sheet->getStyle('A7')->getAlignment()->setTextRotation(90);
$sheet->setCellValue('A7', 'Lorem Ipsum');
$writer = new Dompdf($spreadsheet);
$this->outfile = File::temporaryFilename();
$writer->save($this->outfile);
$spreadsheet->disconnectWorksheets();
unset($spreadsheet);
$contents = file_get_contents($this->outfile);
self::assertNotFalse($contents);
self::assertStringContainsString('/MediaBox [0.000 0.000 792.000 1224.000]', $contents);
}
public function testPaperSizeNotArray(): void
{
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// LETTER is a string in Writer/Pdf.php $paperSizes
$size = PageSetup::PAPERSIZE_LETTER;
$sheet->getPageSetup()->setPaperSize($size);
$sheet->setPrintGridlines(true);
$sheet->getStyle('A7')->getAlignment()->setTextRotation(90);
$sheet->setCellValue('A7', 'Lorem Ipsum');
$writer = new Dompdf($spreadsheet);
$this->outfile = File::temporaryFilename();
$writer->save($this->outfile);
$spreadsheet->disconnectWorksheets();
unset($spreadsheet);
$contents = file_get_contents($this->outfile);
self::assertNotFalse($contents);
self::assertStringContainsString('/MediaBox [0.000 0.000 612.000 792.000]', $contents);
}
}

View File

@ -0,0 +1,24 @@
<?php
namespace PhpOffice\PhpSpreadsheetTests\Writer\Dompdf;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Dompdf;
use PHPUnit\Framework\TestCase;
class TextRotationTest extends TestCase
{
public function testTextRotation(): void
{
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setPrintGridlines(true);
$sheet->getStyle('A7')->getAlignment()->setTextRotation(90);
$sheet->setCellValue('A7', 'Lorem Ipsum');
$writer = new Dompdf($spreadsheet);
$html = $writer->generateHtmlAll();
self::assertStringContainsString(' transform:rotate(90deg);', $html);
$spreadsheet->disconnectWorksheets();
unset($spreadsheet);
}
}

View File

@ -0,0 +1,24 @@
<?php
namespace PhpOffice\PhpSpreadsheetTests\Writer\Html;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Html;
use PHPUnit\Framework\TestCase;
class TextRotationTest extends TestCase
{
public function testTextRotation(): void
{
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setPrintGridlines(true);
$sheet->getStyle('A7')->getAlignment()->setTextRotation(90);
$sheet->setCellValue('A7', 'Lorem Ipsum');
$writer = new Html($spreadsheet);
$html = $writer->generateHtmlAll();
self::assertStringContainsString(' transform:rotate(90deg);', $html);
$spreadsheet->disconnectWorksheets();
unset($spreadsheet);
}
}

View File

@ -0,0 +1,24 @@
<?php
namespace PhpOffice\PhpSpreadsheetTests\Writer\Mpdf;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf;
use PHPUnit\Framework\TestCase;
class TextRotationTest extends TestCase
{
public function testTextRotation(): void
{
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setPrintGridlines(true);
$sheet->getStyle('A7')->getAlignment()->setTextRotation(90);
$sheet->setCellValue('A7', 'Lorem Ipsum');
$writer = new Mpdf($spreadsheet);
$html = $writer->generateHtmlAll();
self::assertStringContainsString(' text-rotate:90;', $html);
$spreadsheet->disconnectWorksheets();
unset($spreadsheet);
}
}