php使用tcpdf导出pdf文件无法使用中文名称的解决办法

原文链接 https://www.whongbin.cn/article-detail/149.html

前言

吐槽下这两天做的一个项目,大致就是做的一个面向公众的涂鸦作品(拍照上传)收集的H5,这个H5有生成证书的功能,还有生成海报的功能,在海报那个地方遇到了不小的挫折,今天不说这个了,说下另外一个问题,TCPDF

问题

项目进入维护期了,客户想要把当时收集用户信息时签订的线上协议导出来,协议这种东西,最好的存档格式就是PDF了,因为之前也用过TCPDF,所以决定还是用它,项目是基于laravel6.0开发的,本来是有compposer库可用的,但是无奈啊,库需要的PHP版本 PHP7.3+ ......艹艹艹艹,不用了.

下载代码->写方法->写页面->导出.一切正常,没有问题了,可以交付了吧,但是我突然发现,文件居然是用的时间戳命名的,这肯定不合适啊...然后就想着换成用户名称+协议名称.pdf就好了啊,但是万万没想到,导出时只剩.pdf了 那我的文件名呢???

解决

满世界找了一圈方法,后来发现TCPDF确实是存在这种问题的,那就把我找到的方法分享下吧

找到tcpdf源码目录下的 tcpdf.php,修改其中的一些代码(仅修改Output()方法)就ok了

  • 删除或注释过滤操作

下面这段代码会把所有中文字符都替换成空字符,作为首要的罪魁祸首,果断注释

if ($dest[0] != 'F') {
    $name = preg_replace('/[\s]+/', '_', $name);
    $name = preg_replace('/[^a-zA-Z0-9_\.-]/', '', $name);
}
  • 修改header

去掉以下代码中的basename()函数,说实话我不知道为啥要去掉...附上basename()函数的解释吧 https://www.runoob.com/php/func-filesystem-basename.html

header('Content-Disposition: attachment; filename="'.basename($name).'"'); //注释这行

换成

header('Content-Disposition: attachment; filename="'.$name.'"'); //换成这行

最后

就这样了,没啥说的,反正是可以正常导出了

你可能感兴趣的:(php使用tcpdf导出pdf文件无法使用中文名称的解决办法)