diff --git a/.github/workflows/lint-docs.yml b/.github/workflows/lint-docs.yml index db0a86cf..fe3dcc9c 100644 --- a/.github/workflows/lint-docs.yml +++ b/.github/workflows/lint-docs.yml @@ -15,9 +15,9 @@ jobs: lint-docs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: lint php documentation - uses: sudo-bot/action-doctum@dev + uses: sudo-bot/action-doctum@v5 with: config-file: scripts/doctum.php method: "parse" diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index b406fd66..477e4bcd 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -22,7 +22,7 @@ jobs: strategy: fail-fast: false matrix: - php-version: ["7.1", "7.2", "7.3", "7.4", "8.0", "8.1", "8.2", "8.3"] + php-version: ["7.1", "7.2", "7.3", "7.4", "8.0", "8.1", "8.2", "8.3", "8.4"] os: [ubuntu-latest] experimental: [false] php-extensions: ["bcmath, curl, imagick, gd"] @@ -31,12 +31,12 @@ jobs: include: #- { php-version: '8.2', experimental: false, os: macos-latest, php-extensions: 'bcmath, curl, imagick, gd', coverage-extension: 'none' } - { php-version: '8.2', experimental: false, os: windows-latest, php-extensions: 'bcmath, curl, imagick, gd', coverage-extension: 'none' } - - { php-version: '8.4', experimental: true, os: ubuntu-latest, php-extensions: 'bcmath, curl, imagick, gd', coverage-extension: 'pcov' } + - { php-version: '8.5', experimental: true, os: ubuntu-latest, php-extensions: 'bcmath, curl, imagick, gd', coverage-extension: 'pcov' } - { php-version: 'nightly', experimental: true, os: ubuntu-latest, php-extensions: 'bcmath, curl, imagick, gd', coverage-extension: 'pcov' } env: PDFINFO_BINARY: ${{ (matrix.os == 'ubuntu-latest') && '/usr/bin/pdfinfo' || ((matrix.os == 'macos-latest') && '/usr/local/bin/pdfinfo' || 'C:\ProgramData\Chocolatey\bin\pdfinfo.exe') }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Install pdfinfo, pdftopng or pdftoppm uses: ConorMacBride/install-package@v1 with: @@ -90,7 +90,7 @@ jobs: # For debugging issues - name: Archive test results if: failure() - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: test-run-output-${{ matrix.php-version }}-${{ matrix.os }} retention-days: 1 @@ -100,7 +100,7 @@ jobs: name: Static Analysis runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Use php 8.2 uses: shivammathur/setup-php@v2 with: diff --git a/CHANGELOG.TXT b/CHANGELOG.TXT index 5d560d0a..2394117a 100644 --- a/CHANGELOG.TXT +++ b/CHANGELOG.TXT @@ -1,3 +1,11 @@ +6.10.1 (2025-11-21) + - cI: Add 8.5 to CI matrix - PR #836 + - Fix PHP 8.5 deprecation for xml_parser_free - PR #835 + - Fix bad text-align from HTML source - PR #833 + - Fix image on footer problems - PR #823 + - Preserving percentage gradient decimals and correctly clamp coordinates - PR #815 + - Enables compression for PDF/A - PR #820 + 6.10.0 (2025-05-27) - Embedded files support (Factur-X 1.07 / ZUGFeRD 2.3) #789 diff --git a/VERSION b/VERSION index cf79bf90..3094a4c6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -6.10.0 +6.10.1 diff --git a/composer.json b/composer.json index 8d779197..abf4d9b6 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "barcodes" ], "homepage": "http://www.tcpdf.org/", - "version": "6.10.0", + "version": "6.10.1", "license": "LGPL-3.0-or-later", "authors": [ { diff --git a/examples/example_001.php b/examples/example_001.php index 82555e6b..b97be8e9 100644 --- a/examples/example_001.php +++ b/examples/example_001.php @@ -92,7 +92,7 @@

Welcome to  TCPDF !

This is the first example of TCPDF library.

This text is printed using the writeHTMLCell() method but you can also use: Multicell(), writeHTML(), Write(), Cell() and Text().

-

Please check the source code documentation and other examples for further information.

+

Please check the source code documentation and other examples for further information.

TO IMPROVE AND EXPAND TCPDF I NEED YOUR SUPPORT, PLEASE MAKE A DONATION!

EOD; diff --git a/include/tcpdf_static.php b/include/tcpdf_static.php index efadc925..296e04dd 100644 --- a/include/tcpdf_static.php +++ b/include/tcpdf_static.php @@ -55,7 +55,7 @@ class TCPDF_STATIC { * Current TCPDF version. * @private static */ - private static $tcpdf_version = '6.10.0'; + private static $tcpdf_version = '6.10.1'; /** * String alias for total number of pages. diff --git a/tcpdf.php b/tcpdf.php index 42c425e9..2cbbc4d7 100644 --- a/tcpdf.php +++ b/tcpdf.php @@ -1,9 +1,9 @@ * @package com.tecnick.tcpdf * @author Nicola Asuni - * @version 6.10.0 + * @version 6.10.1 */ // TCPDF configuration @@ -128,7 +128,7 @@ * TCPDF project (http://www.tcpdf.org) has been originally derived in 2002 from the Public Domain FPDF class by Olivier Plathey (http://www.fpdf.org), but now is almost entirely rewritten.
* @package com.tecnick.tcpdf * @brief PHP class for generating PDF documents without requiring external extensions. - * @version 6.10.0 + * @version 6.10.1 * @author Nicola Asuni - info@tecnick.com * @IgnoreAnnotation("protected") * @IgnoreAnnotation("public") @@ -2910,9 +2910,7 @@ public function setCompression($compress=true) { $this->compress = false; if (function_exists('gzcompress')) { if ($compress) { - if ( !$this->pdfa_mode) { - $this->compress = true; - } + $this->compress = true; } } } @@ -5001,11 +4999,10 @@ protected function _putEmbeddedFiles() { $filter = ''; if ($this->compress) { $data = gzcompress($data); - $filter = ' /Filter /FlateDecode'; + $filter .= ' /Filter /FlateDecode'; } - if ($this->pdfa_version == 3) { - $filter = ' /Subtype /text#2Fxml'; + $filter .= ' /Subtype /text#2Fxml'; } $stream = $this->_getrawstream($data, $filedata['n']); @@ -6925,8 +6922,8 @@ protected function fitBlock($w, $h, $x, $y, $fitonpage=false) { // fallback to avoid division by zero $h = $h == 0 ? 1 : $h; $ratio_wh = ($w / $h); - if (($y + $h) > $this->PageBreakTrigger) { - $h = $this->PageBreakTrigger - $y; + if (($y + $h) > $this->PageBreakTrigger + $this->bMargin) { + $h = $this->PageBreakTrigger + $this->bMargin - $y; $w = ($h * $ratio_wh); } if ((!$this->rtl) AND (($x + $w) > ($this->w - $this->rMargin))) { @@ -16918,7 +16915,7 @@ protected function getHtmlDomArray($html) { $dom[$key]['height'] = $dom[$key]['style']['height']; } // check for text alignment - if (isset($dom[$key]['style']['text-align'])) { + if (isset($dom[$key]['style']['text-align'][0])) { $dom[$key]['align'] = strtoupper($dom[$key]['style']['text-align'][0]); } // check for CSS border properties @@ -23268,8 +23265,11 @@ public function ImageSVG($file, $x=null, $y=null, $w=0, $h=0, $link='', $align=' $error_message = sprintf('SVG Error: %s at line %d', xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser)); $this->Error($error_message); } - // free this XML parser - xml_parser_free($parser); + + // free this XML parser (does nothing in PHP >= 8.0) + if (function_exists('xml_parser_free') && PHP_VERSION_ID < 80000) { + xml_parser_free($parser); + } // >= PHP 7.0.0 "explicitly unset the reference to parser to avoid memory leaks" unset($parser); @@ -23500,7 +23500,8 @@ protected function setSVGStyles($svgstyle, $prevsvgstyle, $x=0, $y=0, $w=1, $h=1 $gradient['coords'][4] /= $w; } elseif ($gradient['mode'] == 'percentage') { foreach($gradient['coords'] as $key => $val) { - $gradient['coords'][$key] = (intval($val) / 100); + $val = floatval($val) / 100; + $gradient['coords'][$key] = $val; if ($val < 0) { $gradient['coords'][$key] = 0; } elseif ($val > 1) { @@ -24737,7 +24738,7 @@ protected function startSVGElementHandler($parser, $name, $attribs, $ctm=array() */ protected function endSVGElementHandler($parser, $name) { $name = $this->removeTagNamespace($name); - if ($this->svgdefsmode AND !in_array($name, array('defs', 'clipPath', 'linearGradient', 'radialGradient', 'stop'))) {; + if ($this->svgdefsmode AND !in_array($name, array('defs', 'clipPath', 'linearGradient', 'radialGradient', 'stop'))) { if (end($this->svgdefs) !== FALSE) { $last_svgdefs_id = key($this->svgdefs); if (isset($this->svgdefs[$last_svgdefs_id]['attribs']['child_elements'])) {