Creo que lo que ocurre es que estás mandando unas header http (las normales para una acciòn) en tu primera request, y luego mandas las pdf y el animalico se queja de que tiene demasiadas headers.
Te dejo un ejemplo. Este código presenta en pdf un modelo (un artículo, en este caso) y luego busca una serie de campos extra para listarlo (usando un dataprovider) así que con un poco de apaño creo que te servirá o te dará una idea:
public function actionPdf($id) {
// buscamos el modelo a "imprimir"
$model = $this->findModel($id);
// bucamos la lista de campos extra para un artículo y usamos un ArrayDataProvider, por ejemplo
$providerArticleExtraField = new \yii\data\ArrayDataProvider([
'allModels' => $model->articleExtraFields,
]);
// usamos una view llamada _pdf para presentar el contenido
$content = $this->renderAjax('_pdf', [
'model' => $model,
'providerArticleExtraField' => $providerArticleExtraField,
]);
// ahora configuramos el pdf en sí. Ten en cuenta que $content ya lleva la plantilla
$pdf = new \kartik\mpdf\Pdf([
'mode' => \kartik\mpdf\Pdf::MODE_CORE,
'format' => \kartik\mpdf\Pdf::FORMAT_A4,
'orientation' => \kartik\mpdf\Pdf::ORIENT_PORTRAIT,
'destination' => \kartik\mpdf\Pdf::DEST_BROWSER,
'content' => $content,
'cssFile' => '@vendor/kartik-v/yii2-mpdf/assets/kv-mpdf-bootstrap.min.css',
'cssInline' => '.kv-heading-1{font-size:18px}',
'options' => ['title' => \Yii::$app->name],
'methods' => [
'SetHeader' => [\Yii::$app->name],
'SetFooter' => ['{PAGENO}'],
]
]);
// y devolvemos el render
return $pdf->render();
}
Para la plantilla _pdf, sería algo así:
<?php
use yii\helpers\Html;
use yii\widgets\DetailView;
use kartik\grid\GridView;
/* @var $this yii\web\View */
/* @var $model backend\models\Layout */
$this->title = $model->name;
$this->params['breadcrumbs'][] = ['label' => 'Layout', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="layout-view">
<div class="row">
<div class="col-sm-9">
<h2><?= 'Layout'.' '. Html::encode($this->title) ?></h2>
</div>
</div>
<div class="row">
<?php
$gridColumn = [
['attribute' => 'id', 'visible' => false],
'name',
'internal_ref',
'notes:ntext',
'description:ntext',
'email_answer:ntext',
'youtube_video_id',
'featured',
[
'attribute' => 'category.name',
'label' => 'Category'
],
[
'attribute' => 'supplier.name',
'label' => 'Supplier'
],
];
echo DetailView::widget([
'model' => $model,
'attributes' => $gridColumn
]);
?>
</div>
<div class="row">
<?php
if($providerArticleLayout->totalCount){
$gridColumnArticleLayout = [
['class' => 'yii\grid\SerialColumn'],
[
'attribute' => 'article.name',
'label' => 'Article'
],
'quantity',
];
echo Gridview::widget([
'dataProvider' => $providerArticleLayout,
'panel' => [
'type' => GridView::TYPE_PRIMARY,
'heading' => Html::encode('Article Layout'),
],
'panelHeadingTemplate' => '<h4>{heading}</h4>{summary}',
'toggleData' => false,
'columns' => $gridColumnArticleLayout
]);
}
?>
</div>
</div>
Cualquier cosa me dices. A ver si te sirve. Ten en cuenta que tendrás que cambiar cosas para que quede como quieras, y que es un ejemplo e igual hay algún error de comas, comillas o algo.
EDITO: Para aclarar, lo que hago es usar _pdf no como plantilla, sino como layout. Así no carga el layout general y evitas el problema de la doble header. Hay otras formas de hacerlo, claro.