symfony html2pdf 不呈现 pdf 的问题
issue with symfony html2pdf not rendering pdf
在我的 symfony 项目中,我使用的是 Html2pdf 库,我的控制器中有以下代码:
$html = $this->render('MyBundle:MyFolder:myPDF.html.twig', array('slug' => $slug));
$html->getContent();
try {
$html2pdf = new \Html2Pdf_Html2Pdf('P', 'A4', 'fr', true, 'UTF-8');
$html2pdf->pdf->SetAuthor('....');
$html2pdf->pdf->SetDisplayMode('real');
$html2pdf->writeHTML($html);
$html2pdf->Output('Bill.pdf');
$response = new Response();
$response->headers->set('Content-type', 'application/pdf');
return $response;
} catch(HTML2PDF_exception $e) {
die($e);
}
这里没有错误发生,但它呈现给我:
因此,控制器 return 不是正确的 pdf 文件。
为什么 html PDF 渲染输出是这样的?
这是我想以 pdf 格式呈现的视图:
<!DOCTYPE html>
<html lang="fr">
<head>
<meta name="description" content="Bill">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<table>
<thead>
<tr>
<th>test</th>
</tr>
</thead>
<tbody>
<tr>
<td>test</td>
</tr>
</tbody>
</table>
</body>
这是我浏览器中的 headers 响应 return:
HTTP/1.1 500 Internal Server Error
Date: Thu, 18 Feb 2016 13:05:16 GMT
Server: Apache/2.4.9 (Win64) PHP/5.5.12
x-powered-by: PHP/5.5.12
Cache-Control: public, must-revalidate, max-age=0, no-cache
Pragma: public
Expires: Sat, 26 Jul 1997 05:00:00 GMT
Last-Modified: Thu, 18 Feb 2016 13:05:17 GMT
Content-Length: 2198
Content-Disposition: inline; filename="Bill.pdf";
X-Debug-Token: 5e207b
X-Debug-Token-Link: /symfony/web/app_dev.php/_profiler/5e207b
Connection: close
Content-Type: text/html; charset=UTF-8
如您所见,内容类型也不是 application/pdf。
我认为你应该return特殊回复类型
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
....
$response = new BinaryFileResponse('/file/path/file.pdf');
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_INLINE,
'file.pdf',
iconv('UTF-8', 'ASCII//TRANSLIT', 'file.pdf')
);
return $response;
我遇到了同样的问题,因为我的文件是用带有 BOM 的 UTF-8 编码的。
如果你有记事本++,只需打开你的 PHP 文件并查看编码。
然后选择convert to UTF-8 without BOM.
这是一个特殊字符,包含在您的 PHP 文件的顶部。
在我的 symfony 项目中,我使用的是 Html2pdf 库,我的控制器中有以下代码:
$html = $this->render('MyBundle:MyFolder:myPDF.html.twig', array('slug' => $slug));
$html->getContent();
try {
$html2pdf = new \Html2Pdf_Html2Pdf('P', 'A4', 'fr', true, 'UTF-8');
$html2pdf->pdf->SetAuthor('....');
$html2pdf->pdf->SetDisplayMode('real');
$html2pdf->writeHTML($html);
$html2pdf->Output('Bill.pdf');
$response = new Response();
$response->headers->set('Content-type', 'application/pdf');
return $response;
} catch(HTML2PDF_exception $e) {
die($e);
}
这里没有错误发生,但它呈现给我:
因此,控制器 return 不是正确的 pdf 文件。
为什么 html PDF 渲染输出是这样的?
这是我想以 pdf 格式呈现的视图:
<!DOCTYPE html>
<html lang="fr">
<head>
<meta name="description" content="Bill">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<table>
<thead>
<tr>
<th>test</th>
</tr>
</thead>
<tbody>
<tr>
<td>test</td>
</tr>
</tbody>
</table>
</body>
这是我浏览器中的 headers 响应 return:
HTTP/1.1 500 Internal Server Error Date: Thu, 18 Feb 2016 13:05:16 GMT Server: Apache/2.4.9 (Win64) PHP/5.5.12 x-powered-by: PHP/5.5.12 Cache-Control: public, must-revalidate, max-age=0, no-cache Pragma: public Expires: Sat, 26 Jul 1997 05:00:00 GMT Last-Modified: Thu, 18 Feb 2016 13:05:17 GMT Content-Length: 2198 Content-Disposition: inline; filename="Bill.pdf"; X-Debug-Token: 5e207b X-Debug-Token-Link: /symfony/web/app_dev.php/_profiler/5e207b Connection: close Content-Type: text/html; charset=UTF-8
如您所见,内容类型也不是 application/pdf。
我认为你应该return特殊回复类型
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
....
$response = new BinaryFileResponse('/file/path/file.pdf');
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_INLINE,
'file.pdf',
iconv('UTF-8', 'ASCII//TRANSLIT', 'file.pdf')
);
return $response;
我遇到了同样的问题,因为我的文件是用带有 BOM 的 UTF-8 编码的。 如果你有记事本++,只需打开你的 PHP 文件并查看编码。 然后选择convert to UTF-8 without BOM.
这是一个特殊字符,包含在您的 PHP 文件的顶部。