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

barryvdh/laravel-dompdf横向模式下Unicode字符显示异常求助

解决Laravel PDF横向模式下Unicode字符乱码问题

问题现象

Laravel项目生成PDF时,Unicode字符(例:柬埔寨语“ក្រុមហ៊ុន”)在纵向纸张模式下显示正常,切换为横向模式后出现乱码,实际显示为គោលបំណង。

项目环境

  • laravel: 10.0
  • php: 8.1.0
  • barryvdh/laravel-dompdf: 2.0.1
  • barryvdh/laravel-snappy: 1.0.2

生成PDF的核心代码

public function LogReportRender($id)
{
    $batchSize = 14;
    $offset = 0;
    $all_requests = [];
    $request_data = [];
    $log_report = ReportLog::find($id);
    $title = $log_report->name;
   
    
    do {
        $requests = AppRequest::where('form_id', $log_report->parent_id)
                    ->where('is_active', true)
                    ->where('main_status_id', MainStatusId::Complete)
                    ->skip($offset)
                    ->take($batchSize)
                    ->orderBy('request_date','asc')
                    ->get()
                    ->toArray();
        $all_requests[] = $requests;
        $offset += $batchSize;
    } while (!empty($requests));
    if (empty(end($all_requests))) {
        array_pop($all_requests);
    }
    $flattenedItems = array_merge(...$all_requests);
    $allIds = array_column($flattenedItems, 'id');
    if(count($all_requests) > 0){
        $request_data = RequestData::whereIn('request_id',$allIds)
                        ->where('is_active',true)
                        ->get();
    }
    if(count($all_requests) < 0){
        return back()->withInput()->with('export_msg', 'Report can not preview, input not yet complete');
    }
    $form_name = strtolower(str_replace('-', '_', $log_report->code));
    $view_path = 'layout.report.form.'.$form_name.'_all';
    $param = [
        'all_requests' => $all_requests,
        'request_data' => $request_data,
        'report' => $log_report,
    ];
    $pdf = PDF::loadView($view_path,$param)
            ->setPaper('a4')
            ->setOrientation('landscape')
            ->setOption('margin-bottom', 0);
    return $pdf->stream($title);
}

解决方案建议

  1. 指定支持Unicode的字体
    在PDF对应的视图CSS中设置包含目标字符集的字体,比如柬埔寨语可用Khmer OS System:
body {
    font-family: 'Khmer OS System', sans-serif;
}

确保服务器已安装该字体,或在项目中引入字体文件并通过CSS指定路径。

  1. 配置编码参数
  • 对于laravel-dompdf:在config/dompdf.php中设置字符集为UTF-8:
'charset' => 'UTF-8',
  • 对于laravel-snappy:添加编码选项到PDF生成代码:
$pdf->setOption('encoding', 'UTF-8');
  1. 调整纸张设置方式
    将纸张类型和方向合并设置,替代分开调用的方式,避免配置冲突:
$pdf->setPaper('a4', 'landscape');
  1. 检查视图文件编码
    确保生成PDF的视图文件保存为UTF-8无BOM格式,避免编码转换错误。

内容的提问来源于stack exchange,提问作者Veasna Khlot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:32:31