2

以下适用于 Chrome,但 iframe 内容在 Firefox 15 和 IE 9 中为空白。

<html>
  <head></head>
  <body>
    <p>this n that</p>
    <iframe type="application/pdf"
            width="95%"
            height="95%"
            src="data:application/pdf;base64,<?php echo base64_encode(file_get_contents('memlist.pdf'));?>">
      Oops, you have no support for iframes.
    </iframe>
    <p>this n that</p>
  </body>
</html>

问题似乎是dataurl。如果我将它更改为简单的 src="memlist.pdf" 那么它可以在任何地方工作。PDF 大小为 75kb。

dataurl 是否存在一些(当前)浏览器限制?

(由于某些身份验证复杂性,我试图避免使用 http url 回调服务器)

4

1 回答 1

1

我刚刚逐字复制了您的源代码,将 php 输出编码 pdf 的部分替换为我从在线编码器返回的字符串。

原始 pdf 文件为 141kb,编码后的字符串为 194,065 字节——和 url 一样大。

它在 Chrome 中工作得很好,就像它对你一样。同样,Opera 也没有它。

因此,我从 iframe 标记中删除了 type='application/pdf' 属性。现在 Chrome 和 Opera 都会显示该文件,而 IE9 仍然拒绝。

我尝试通过 javascript 更改 src(以防万一),通过 Opera/Chrome 没有问题,但仍然无法使用 IE。

过去,我使用 php 即时创建 pdf,只需将 iframe 的 src 设置为 php 文件的 url,并使用 GET 参数完成。这在 IE6 上运行得很好(以及 Opera、chrome 和 ff - 从未在移动设备上尝试过,那是 5 年前的事了)

一些旧的示例代码,我希望会有所帮助:

(1) 插入 iframe 的 Javascript

function  showPdfTt(studentId)
{
    var url, tgt;
    title = byId("popupTitle");
    title.innerHTML = "Timetable for " + studentId;
    tgt = byId("popupContent");
    url = "pdftimetable.php?";
    url += "id="+studentId;
    url += "&type=Student";
    tgt.innerHTML = "<iframe onload=\"centerElem(byId('box'))\" src='"+url+"' width=\"700px\" height=\"500px\"></iframe>";
}

pdfTimetable.php 的输出部分

$pdfStr = $pdf->output();
$myFile = fopen("lastRequested.pdf", "wb");  // just here for debugging purposes
fwrite($myFile, $pdfStr);
fclose($myFile);

$pdf->ezStream();   // send output to stdout (the browser) - uses fpdf for generation
exit;

fpdf的输出部分

        if(php_sapi_name()!='cli')
        {
            //We send to a browser
            header('Content-Type: application/pdf');
            if(headers_sent())
                $this->Error('Some data has already been output, can\'t send PDF file');
            header('Content-Length: '.strlen($this->buffer));
            header('Content-Disposition: inline; filename="'.$name.'"');
            header('Cache-Control: private, max-age=0, must-revalidate');
            header('Pragma: public');
            ini_set('zlib.output_compression','0');
        }
        echo $this->buffer;
        break;
于 2012-10-11T23:28:49.747 回答