Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Some Pdf Problems #2960

Merged
merged 3 commits into from
Jul 29, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 4 additions & 6 deletions samples/Basic/26_Utf8.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,10 @@
// 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');
Expand Down
24 changes: 10 additions & 14 deletions samples/Pdf/21b_Pdf.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,24 +32,20 @@ function replaceBody(string $html): string
$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);
$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);
15 changes: 15 additions & 0 deletions src/PhpSpreadsheet/Writer/Html.php
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*
Expand Down Expand Up @@ -1003,6 +1010,14 @@ private function createCSSStyleAlignment(Alignment $alignment)
$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;
}
Expand Down
3 changes: 3 additions & 0 deletions src/PhpSpreadsheet/Writer/Pdf/Dompdf.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ public function save($filename, int $flags = 0): void
$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';

Expand Down
3 changes: 3 additions & 0 deletions src/PhpSpreadsheet/Writer/Pdf/Mpdf.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@

class Mpdf extends Pdf
{
/** @var bool */
protected $isMPdf = true;

/**
* Gets the implementation of external PDF library that should be used.
*
Expand Down
3 changes: 2 additions & 1 deletion tests/PhpSpreadsheetTests/Functional/StreamTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,13 @@ public function providerFormats(): array
['Csv'],
['Html'],
['Mpdf'],
['Dompdf'],
];

if (\PHP_VERSION_ID < 80000) {
$providerFormats = array_merge(
$providerFormats,
[['Tcpdf'], ['Dompdf']]
[['Tcpdf']]
);
}

Expand Down
65 changes: 65 additions & 0 deletions tests/PhpSpreadsheetTests/Writer/Dompdf/PaperSizeArrayTest.php
Original file line number Diff line number Diff line change
@@ -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);
}
}
24 changes: 24 additions & 0 deletions tests/PhpSpreadsheetTests/Writer/Dompdf/TextRotationTest.php
Original file line number Diff line number Diff line change
@@ -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);
}
}
24 changes: 24 additions & 0 deletions tests/PhpSpreadsheetTests/Writer/Html/TextRotationTest.php
Original file line number Diff line number Diff line change
@@ -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);
}
}
24 changes: 24 additions & 0 deletions tests/PhpSpreadsheetTests/Writer/Mpdf/TextRotationTest.php
Original file line number Diff line number Diff line change
@@ -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);
}
}