diff --git a/lib/tcpdf/readme_moodle.txt b/lib/tcpdf/readme_moodle.txt
index 23832673775..433bbe520b0 100644
--- a/lib/tcpdf/readme_moodle.txt
+++ b/lib/tcpdf/readme_moodle.txt
@@ -8,6 +8,7 @@ Description of TCPDF library import
* modify getTCPDFProducer lib/tcpdf/include/tcpdf_static.php to remove the version number
* Check the status of https://github.com/tecnickcom/TCPDF/pull/548 , apply if it is still
not included or delete this entry
+* modify `TCPDF::Output` method for multi-byte character filename support (see https://github.com/tecnickcom/TCPDF/pull/562)
Important
---------
diff --git a/lib/tcpdf/tcpdf.php b/lib/tcpdf/tcpdf.php
index d38525afd93..b3ef83d3383 100644
--- a/lib/tcpdf/tcpdf.php
+++ b/lib/tcpdf/tcpdf.php
@@ -7619,7 +7619,7 @@ class TCPDF {
* Send the document to a given destination: string, local file or browser.
* In the last case, the plug-in may be used (if present) or a download ("Save as" dialog box) may be forced.
* The method first calls Close() if necessary to terminate the document.
- * @param string $name The name of the file when saved. Note that special characters are removed and blanks characters are replaced with the underscore character.
+ * @param string $name The name of the file when saved
* @param string $dest Destination where to send the document. It can take one of the following values:
- I: send the file inline to the browser (default). The plug-in is used if available. The name given by name is used when one selects the "Save as" option on the link generating the PDF.
- D: send to the browser and force a file download with the name given by name.
- F: save to a local server file with the name given by name.
- S: return the document as a string (name is ignored).
- FI: equivalent to F + I option
- FD: equivalent to F + D option
- E: return the document as base64 mime multi-part email attachment (RFC 2045)
* @return string
* @public
@@ -7637,10 +7637,7 @@ class TCPDF {
$dest = $dest ? 'D' : 'F';
}
$dest = strtoupper($dest);
- if ($dest[0] != 'F' && $name !== null) {
- $name = preg_replace('/[\s]+/', '_', $name);
- $name = preg_replace('/[^a-zA-Z0-9_\.-]/', '', $name);
- }
+
if ($this->sign) {
// *** apply digital signature to the document ***
// get the document content
@@ -7711,7 +7708,8 @@ class TCPDF {
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
- header('Content-Disposition: inline; filename="'.basename($name).'"');
+ header('Content-Disposition: inline; filename="' . rawurlencode(basename($name)) . '"; ' .
+ 'filename*=UTF-8\'\'' . rawurlencode(basename($name)));
TCPDF_STATIC::sendOutputData($this->getBuffer(), $this->bufferlen);
} else {
echo $this->getBuffer();
@@ -7742,7 +7740,8 @@ class TCPDF {
header('Content-Type: application/pdf');
}
// use the Content-Disposition header to supply a recommended filename
- header('Content-Disposition: attachment; filename="'.basename($name).'"');
+ header('Content-Disposition: attachment; filename="' . rawurlencode(basename($name)) . '"; ' .
+ 'filename*=UTF-8\'\'' . rawurlencode(basename($name)));
header('Content-Transfer-Encoding: binary');
TCPDF_STATIC::sendOutputData($this->getBuffer(), $this->bufferlen);
break;