You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

wkhtmltopdf跨系统非英文文件名处理问题及参数空格规范咨询

解决wkhtmltopdf非英文文件名参数丢失及命令选项间距问题

一、非英文文件名丢失问题(Ubuntu服务器)

针对Japan日本.xml被截断为Japan.xml的问题,结合Ubuntu环境特性,可尝试以下方案:

  1. 强制命令执行环境为UTF-8
    在执行wkhtmltopdf前,先设置LC_ALL和LANG环境变量,确保命令行环境编码解析正确:

    // 在执行命令前添加环境变量设置
    $output = shell_exec('LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 "' . $WKHTMLTOPDF . '" ' . $options_string);
    
  2. 改用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);
    ?>
    
  3. 升级wkhtmltopdf版本
    类似的非英文文件名截断问题已在后续版本中修复,建议升级到最新稳定版:

    sudo apt update && sudo apt upgrade wkhtmltopdf
    

二、确保命令选项与值的正确间距

为避免忘记在选项和值之间加空格,推荐两种规范写法:

  1. 拆分选项与值为数组独立元素
    将每个选项和对应的值拆分为数组的两个元素,再用空格拼接,从根源避免间距缺失:

    $_options = [
        '--dump-outline',
        escapeshellarg('/usr/local/apache2/htdocs/Japan日本.xml'),
        $input_file_path,
        $output_file_path
    ];
    $options_string = implode(' ', $_options);
    
  2. 封装选项生成函数
    编写简单函数统一处理选项拼接,确保格式规范:

    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 08:47:25