es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo establecer CSS para MPDF en yii2 al generar un archivo PDF

Estoy utilizando yii2 basic y necesito generar un archivo de informe en formato PDF que tenga estilos definidos en un archivo CSS. El PDF se genera correctamente, pero el CSS no se aplica en el archivo generado. Aquí está cómo lo he implementado.

En mi archivo “controller.php”:

public function actionPrintReport($student_id,$exam_id,$total_subjects,$exam_date){
    $model = new Results();
    $examReportData = $model->getExamReport($student_id,$exam_id,$exam_date);

    $htmlContent = $this->renderPartial('_report',
    [
        'model' => $model,
        'total_subjects' => $total_subjects,
        'examReportData' => $examReportData
    ]);
    $pathfile = "Student_exam_report";
    $mpdf = new \Mpdf\Mpdf([
        'tempDir' => Yii::getAlias('@runtime/') . 'mpdf2/tmp',
        'format' => 'A4-L',
        'margin_right' => 5,'margin_left' => 5,
        'defaultFont' => 'Calibri',
    ]);
    $stylesheet = '<head><link rel="stylesheet" type="text/css" href="'.Yii::getAlias('@web').'/css/exam_report.css'.'"></head>';
    $mpdf->WriteHTML($stylesheet, \Mpdf\HTMLParserMode::HEADER_CSS);
    $mpdf->WriteHTML($htmlContent, \Mpdf\HTMLParserMode::HTML_BODY);
    $mpdf->Output($pathfile, 'I');
}

El archivo “_report.php” está ubicado en “view/” con el siguiente código mínimo:

<?php
    use yii\helpers\Html;
?>

<div class="container" style="width: 100%">
   <div class="leftpan">Left Pan</div>
   <div class="rightpan">Right Pan</div>
</div>

Y el archivo CSS se encuentra en “project_folder/web/css/exam_report.css” con el siguiente código mínimo:

.rightleft{
    height: 150px;
    float: left;
    border-style: dotted dashed solid double;
}
.rightpan{
    height: 150px;
    float: right;
    border-style: dotted dashed solid double;
}

He estado bloqueado aquí por dos días :), agradecería su apoyo.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para resolver el problema de que el CSS no funcione en el archivo PDF generado, debes asegurarte de que el archivo CSS sea accesible por la biblioteca mPDF. En tu implementación actual, estás utilizando la función Yii::getAlias('@web') para acceder al archivo CSS, lo cual puede que no funcione como se espera.

    Una solución es utilizar la ruta absoluta del archivo CSS en su lugar. Puedes utilizar la constante __DIR__ para obtener la ruta absoluta del archivo actual y luego concatenar la ruta al archivo CSS.

    Así es como puedes modificar tu función actionPrintReport:

    public function actionPrintReport($student_id,$exam_id,$total_subjects,$exam_date)
    {
        $model = new Results();
        $examReportData = $model->getExamReport($student_id,$exam_id,$exam_date);
    
        $htmlContent = $this->renderPartial('_report',
        [
            'model' => $model,
            'total_subjects' => $total_subjects,
            'examReportData' => $examReportData
        ]);
    
        $pathfile = "Student_exam_report";
        $mpdf = new \Mpdf\Mpdf([
            'tempDir' => Yii::getAlias('@runtime/') . 'mpdf2/tmp',
            'format' => 'A4-L',
            'margin_right' => 5,
            'margin_left' => 5,
            'defaultFont' => 'Calibri',
        ]);
    
        // Utiliza la ruta absoluta del archivo CSS
        $cssFile = __DIR__ . '/../web/css/exam_report.css';
        $stylesheet = '<head><link rel="stylesheet" type="text/css" href="' . $cssFile . '"></head>';
    
        $mpdf->WriteHTML($stylesheet, \Mpdf\HTMLParserMode::HEADER_CSS);
        $mpdf->WriteHTML($htmlContent, \Mpdf\HTMLParserMode::HTML_BODY);
        $mpdf->Output($pathfile, 'I');
    }
    

    Al utilizar la ruta absoluta del archivo CSS, la biblioteca mPDF puede acceder al archivo y aplicar los estilos al archivo PDF generado.

Comments are closed.