wkhtmltopdf跨系统非英文文件名处理问题及参数空格规范咨询
解决wkhtmltopdf非英文文件名参数丢失及命令选项间距问题
一、非英文文件名丢失问题(Ubuntu服务器)
针对Japan日本.xml被截断为Japan.xml的问题,结合Ubuntu环境特性,可尝试以下方案:
强制命令执行环境为UTF-8
在执行wkhtmltopdf前,先设置LC_ALL和LANG环境变量,确保命令行环境编码解析正确:// 在执行命令前添加环境变量设置 $output = shell_exec('LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 "' . $WKHTMLTOPDF . '" ' . $options_string);改用proc_open替代shell_exec
shell_exec对特殊字符的处理依赖系统环境,proc_open能更精准控制参数和环境,避免编码解析异常:<?php $WKHTMLTOPDF = $wkhtmltopdf_path; $cmdArgs = [ $WKHTMLTOPDF, '--dump-outline', '/usr/local/apache2/htdocs/Japan日本.xml', $input_file_path, $output_file_path ]; // 统一转义参数 array_walk($cmdArgs, function(&$arg) { $arg = escapeshellarg($arg); }); $descriptorspec = [ 0 => ['pipe', 'r'], 1 => ['pipe', 'w'], 2 => ['pipe', 'w'] ]; // 指定UTF-8环境执行 $process = proc_open(implode(' ', $cmdArgs), $descriptorspec, $pipes, null, ['LC_ALL' => 'en_US.UTF-8', 'LANG' => 'en_US.UTF-8']); $output = stream_get_contents($pipes[1]); $errors = stream_get_contents($pipes[2]); fclose($pipes[0]); fclose($pipes[1]); fclose($pipes[2]); proc_close($process); ?>升级wkhtmltopdf版本
类似的非英文文件名截断问题已在后续版本中修复,建议升级到最新稳定版:sudo apt update && sudo apt upgrade wkhtmltopdf
二、确保命令选项与值的正确间距
为避免忘记在选项和值之间加空格,推荐两种规范写法:
拆分选项与值为数组独立元素
将每个选项和对应的值拆分为数组的两个元素,再用空格拼接,从根源避免间距缺失:$_options = [ '--dump-outline', escapeshellarg('/usr/local/apache2/htdocs/Japan日本.xml'), $input_file_path, $output_file_path ]; $options_string = implode(' ', $_options);封装选项生成函数
编写简单函数统一处理选项拼接,确保格式规范:function buildWkhtmlOptions($options) { $parts = []; foreach ($options as $key => $value) { $parts[] = $key; $parts[] = escapeshellarg($value); } return implode(' ', $parts); } // 使用示例 $options = [ '--dump-outline' => '/usr/local/apache2/htdocs/Japan日本.xml' ]; $options_string = buildWkhtmlOptions($options) . ' ' . escapeshellarg($input_file_path) . ' ' . escapeshellarg($output_file_path);
内容的提问来源于stack exchange,提问作者user5005768-hd
相关产品推荐
相关产品推荐

