From 56e5dfdf23ff5c0984e820b62025650ce73c7c81 Mon Sep 17 00:00:00 2001 From: oleibman <10341515+oleibman@users.noreply.github.com> Date: Fri, 12 Aug 2022 00:25:26 -0700 Subject: [PATCH] GetCssBorderStyle Has Problem When !important Is Specified (#467) * GetCssBorderStyle Has Problem When !important Is Specified This is, in particular, a problem for PhpSpreadsheet. See https://github.com/PHPOffice/PhpSpreadsheet/issues/1164. TCPDF thinks that there can be 0, 1, 2, or 3 components to shorthand border style, but there can be more, e.g. !important. Logic is rearranged to allow for more than 3. A new example file is added to demonstrate that the fix works correctly. * Improved Example Better code coverage. Co-authored-by: Nicola Asuni --- examples/example_067.php | 220 +++++++++++++++++++++++++++++++++++++++ examples/index.php | 2 + tcpdf.php | 22 ++-- 3 files changed, 236 insertions(+), 8 deletions(-) create mode 100644 examples/example_067.php diff --git a/examples/example_067.php b/examples/example_067.php new file mode 100644 index 0000000..4b61744 --- /dev/null +++ b/examples/example_067.php @@ -0,0 +1,220 @@ +setCreator(PDF_CREATOR); +$pdf->setAuthor('Owen Leibman'); +$pdf->setTitle('TCPDF Example 067'); +$pdf->setSubject('TCPDF Tutorial'); +$pdf->setKeywords('TCPDF, PDF, example, test, guide'); + +// set default header data +$pdf->setHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 067', PDF_HEADER_STRING); + +// set header and footer fonts +$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN)); +$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA)); + +// set default monospaced font +$pdf->setDefaultMonospacedFont(PDF_FONT_MONOSPACED); + +// set margins +$pdf->setMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT); +$pdf->setHeaderMargin(PDF_MARGIN_HEADER); +$pdf->setFooterMargin(PDF_MARGIN_FOOTER); + +// set auto page breaks +$pdf->setAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM); + +// set image scale factor +$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO); + +// set some language-dependent strings (optional) +if (@file_exists(dirname(__FILE__).'/lang/eng.php')) { + require_once(dirname(__FILE__).'/lang/eng.php'); + $pdf->setLanguageArray($l); +} + +// --------------------------------------------------------- + +// set font +$pdf->setFont('helvetica', 'B', 20); + +// add a page +$pdf->AddPage(); + +$pdf->Write(0, 'Example of HTML tables', '', 0, 'L', true, 0, false, false, 0); + +$pdf->setFont('helvetica', '', 8); + +// ----------------------------------------------------------------------------- + +$tbl = << + + COL 1 - ROW 1
COLSPAN 3 + COL 2 - ROW 1 + COL 3 - ROW 1 + + + COL 2 - ROW 2 - COLSPAN 2
text line
text line
text line
text line + COL 3 - ROW 2 + + + COL 3 - ROW 3 + + + +EOD; + +$pdf->writeHTML($tbl, true, false, false, false, ''); + +// ----------------------------------------------------------------------------- + +$tbl = << + + COL 1 - ROW 1
COLSPAN 3 + COL 2 - ROW 1 + COL 3 - ROW 1 + + + COL 2 - ROW 2 - COLSPAN 2
text line
text line
text line
text line + COL 3 - ROW 2 + + + COL 3 - ROW 3 + + + +EOD; + +$pdf->writeHTML($tbl, true, false, false, false, ''); + +// ----------------------------------------------------------------------------- + +$tbl = << + + COL 1 - ROW 1
COLSPAN 3 + COL 2 - ROW 1 + COL 3 - ROW 1 + + + COL 2 - ROW 2 - COLSPAN 2
text line
text line
text line
text line + COL 3 - ROW 2 + + + COL 3 - ROW 3 + + + +EOD; + +$pdf->writeHTML($tbl, true, false, false, false, ''); + +// ----------------------------------------------------------------------------- + +$tbl = << + + COL 1 - ROW 1
COLSPAN 3 + COL 2 - ROW 1 + COL 3 - ROW 1 + + + COL 2 - ROW 2 - COLSPAN 2
text line
text line
text line
text line + COL 3 - ROW 2 + + + COL 3 - ROW 3 + + + +EOD; + +$pdf->writeHTML($tbl, true, false, false, false, ''); + +// ----------------------------------------------------------------------------- + +$tbl = << + + COL 1 - ROW 1
COLSPAN 3 + COL 2 - ROW 1 + COL 3 - ROW 1 + + + COL 2 - ROW 2 - COLSPAN 2
text line
text line
text line
text line + COL 3 - ROW 2 + + + COL 3 - ROW 3 + + + +EOD; + +$pdf->writeHTML($tbl, true, false, false, false, ''); + +// ----------------------------------------------------------------------------- + +// At medium thickness, which is what you get with only one +// setting for style, everything looks the same. +// Included just for completeness. +$tbl = << + + COL 1 - ROW 1
COLSPAN 3 + COL 2 - ROW 1 + COL 3 - ROW 1 + + + COL 2 - ROW 2 - COLSPAN 2
text line
text line
text line
text line + COL 3 - ROW 2 + + + COL 3 - ROW 3 + + + +EOD; + +$pdf->writeHTML($tbl, true, false, false, false, ''); +// ----------------------------------------------------------------------------- + +//Close and output PDF document +$pdf->Output('example_067.pdf', 'I'); + +//============================================================+ +// END OF FILE +//============================================================+ diff --git a/examples/index.php b/examples/index.php index 7512523..d865689 100644 --- a/examples/index.php +++ b/examples/index.php @@ -85,6 +85,8 @@ echo '<'.'?'.'xml version="1.0" encoding="UTF-8"'.'?'.'>';
  • Text stretching and spacing (tracking/kerning): [PDF]
  • No-write page regions: [PDF]
  • PDF/A-1b (ISO 19005-1:2005) document: [PDF]
  • +
  • Using WriteHTMLCell: [PDF]
  • +
  • Shorthand border styles including !important: [PDF]
  • Barcodes

    diff --git a/tcpdf.php b/tcpdf.php index 4004347..02f7aaa 100644 --- a/tcpdf.php +++ b/tcpdf.php @@ -16017,14 +16017,14 @@ class TCPDF { */ protected function getCSSBorderStyle($cssborder) { $bprop = preg_split('/[\s]+/', trim($cssborder)); + $count = count($bprop); + if ($count > 0 && $bprop[$count - 1] === '!important') { + unset($bprop[$count - 1]); + --$count; + } + $border = array(); // value to be returned - switch (count($bprop)) { - case 3: { - $width = $bprop[0]; - $style = $bprop[1]; - $color = $bprop[2]; - break; - } + switch ($count) { case 2: { $width = 'medium'; $style = $bprop[0]; @@ -16037,12 +16037,18 @@ class TCPDF { $color = 'black'; break; } - default: { + case 0: { $width = 'medium'; $style = 'solid'; $color = 'black'; break; } + default: { + $width = $bprop[0]; + $style = $bprop[1]; + $color = $bprop[2]; + break; + } } if ($style == 'none') { return array();