我使用mPDF库从HTML页面生成PDF文件。它在firefox中工作得很好,但它不是在chrome浏览器中显示PDF文件。
我在Chrome中生成PDF时遇到以下错误。
以下是我使用mPDF生成PDF的代码
ob_clean();
header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="' . $yourFileName . '"');
header('Content-Transfer-Encoding: binary');
header('Accept-Ranges: bytes');
$mpdf = new PDF( 'c','A4','','',15, 15,10,14,0,0);
$mpdf->useOnlyCoreFonts = false;
$mpdf->SetDisplayMode('real');
$mpdf->list_indent_first_level = 0; // 1 or 0 - whether to indent the first level of a list
$stylesheet = file_get_contents(APPPATH . 'third_party/mpdf/style.css');
$mpdf->WriteHTML($stylesheet,1);
$mpdf->WriteHTML($html);
$mpdf->Output();
答案 0 :(得分:5)
这可能是生成的pdf的问题。 如果它适用于Firefox,请下载该文件并尝试打开它。如果你电脑中的pdf查看器输出 损坏的pdf ,那么你可能需要调整你的代码。我面临同样的问题。由于pdf损坏,Chrome无法打开它。
希望我的回答能让您进入调试之旅。 干杯。 :d
答案 1 :(得分:3)
在我的情况下,当前页面的html是在pdf中发送的(我用简单的文本编辑器打开pdf时会看到它。)
在发送标题
之前,我flush + ob_clean的解决方案ob_clean();
flush();
header("Content-type:application/pdf");
header("Content-Disposition:attachment;filename='downloaded.pdf'");
echo $result;
exit;
答案 2 :(得分:1)
当您使用html到PDF库(例如mPDF)时,也会发生这种情况,并且在发送文件之前,您会以某种方式将HTML发送到浏览器。许多读者在阅读PDF标记之前忽略了HTML - Chrome没有。
例如,在PHP中,在将数据发送到mPDF之前清除输出缓冲区:ob_clean()
。
答案 3 :(得分:0)
对于使用MemoryStream在浏览器pdf中打开Chrome的情况,以下代码块在C#中为我完成了工作:
MemoryStream ms;
ms = new MemoryStream(result.ResponseData[0].Report);
HttpContext context = HttpContext.Current;
HttpContext context = HttpContext.Current;
context.Response.Clear();
context.Response.ClearContent();
context.Response.ClearHeaders();
context.Response.ContentType = "application/pdf";
context.Response.AddHeader("Content-Disposition", "inline;filename=" + Guid.NewGuid().ToString() + "." + _exportType);
context.Response.AddHeader("Content-Length", ms.Length.ToString());
context.Response.BinaryWrite(ms.ToArray());
context.Response.Flush();
context.Response.Close();
context.Response.End();
答案 4 :(得分:0)
在Asp.net Core 2.10中,这对我来说很好用。
MemoryStream ms1;
ms1 = new MemoryStream(res);
HttpContext context = _httpContextAccessor.HttpContext;
context.Response.Clear();
context.Response.ContentType = "application/pdf";
context.Response.Headers.Add("Content-Disposition", "inline;filename=" + Guid.NewGuid().ToString() + "." + "pdf");
context.Response.Headers.Add("Content-Length", ms1.Length.ToString());
context.Response.Body.Write(ms1.ToArray());
context.Response.Body.Flush();
context.Response.Body.Close();
希望这会有所帮助。
答案 5 :(得分:0)
您可能会发现Chrome的标题标题为Content-Type
值:charset=utf-8
有问题。删除响应标头值为我修复了它。 (原始post)
答案 6 :(得分:0)
同意@SébastienGicquel,但是,对于我来说,我需要在标题之后但在@readfile之前放置flush + ob_clean。
仅供参考,我的Chrome版本是9.0.3945.79,在Firefox和IE中无需ob_clean和flush即可很好地运行代码。
header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="' .$file. '"');
header('Content-Transfer-Encoding: binary');
header('Accept-Ranges: bytes');
ob_clean();
flush();
@readfile($file);
答案 7 :(得分:0)
我也遇到了同样的“加载 PDF 文档失败”问题,但正在申请
ob_clean();
在发送标头之前解决了错误
因为这个函数会丢弃输出缓冲区的内容
答案 8 :(得分:-1)
这是人们在较旧版本的Chrome上遇到的问题。如果您仍然看到此问题,请执行以下操作
在谷歌浏览器中,您有2个选项可以查看PDF文件。您可以使用Chrome pdf查看器(默认),也可以使用Adobe Reader
您可以查看chrome:// plugins(在地址栏中输入)吗?只需启用它即可切换到其他PDF查看器(Chrome / Adobe)!