Динамически создаваемый PDF без встроенного / рендеринга в 64-битном окне IE9 - PullRequest
2 голосов
/ 09 декабря 2011

Мы используем службы Reporting Services для создания отчета в формате PDF, и нам нужно, чтобы он был представлен в окне браузера И встроен в браузер. Мы занимались этим долгое время, и это всегда работало ... до IE9.

В IE6, IE7 и IE8 мы генерируем байтовый массив из служб Reporting Services, который представляет отчет в формате PDF, а двоичный файл записывает его в браузер, и все отлично работает. PDF-дисплеи встроены в браузер.

В IE9 мы пытаемся сделать то же самое, и PDF НЕ внедряется в окно браузера. Окно браузера остается открытым и пустым / пустым, а PDF открывается в Adobe Reader в отдельном окне.

Вот фрагмент нашего кода:

try 
{ 
    // Set all the Reporting Services variables and parameters and render the report 
    // ... 
    byte[] result = rs.Render(format, devInfo, out extension, out mimeType, out encoding, out warnings, out streamIDs); 

    // Force the render out of the report to the browser 
    Response.Clear(); 
    Response.ClearContent(); 
    Response.ClearHeaders(); 
    Response.AppendHeader("content-length", result.Length.ToString()); 
    Response.AppendHeader("Pragma", "cache"); 
    Response.AppendHeader("Expires", "3600"); 
    Response.Buffer = true; 
    Response.Cache.SetCacheability(HttpCacheability.Private); 
    Response.CacheControl = "private"; 
    Response.Charset = System.Text.UTF8Encoding.UTF8.WebName; 
    Response.ContentEncoding = System.Text.UTF8Encoding.UTF8; 

    switch (outputformat) 
    { 
        case "PDF": 
            Response.AppendHeader("content-disposition", "inline; filename=report.pdf"); 
            Response.ContentType = "application/pdf"; 
            break; 
        default: 
            break; 
    } 

    Response.BinaryWrite(result); 
    Response.Flush(); 
    Response.Close(); 
    Response.End(); 
} 
catch (System.Exception ex) 
{ 
    // ... 
} 

Что мы можем сделать, чтобы PDF-файл отображался и встраивался в окно браузера IE9?

Спасибо!

Ответы [ 5 ]

3 голосов
/ 15 августа 2012

надеюсь, что это может помочь другим, я нашел что-то вроде хака / обходного пути, используя jquery

function MyFunction(someprams) {
    if (navigator.userAgent.indexOf("x64") == -1) {
        window.open("yourpage2.aspx?PramName=PramVal, 'winowname', 'window opions here')
    } else {
        $.get("yourpage1.aspx", { PramName1: PramVal1, PramName1: PramVal1 },
          function(data) {
              $('#divid').html(data);
          });
    }
 }

, поэтому просто добавьте div на страницу:

yourpage1 это страница, чтовызывает и транслирует pdf и устанавливает заголовки кэша

, затем yourpage2 является страницей aspx, на которой есть ифрам, который я динамически устанавливаю src: iframeid.Attributes.Add ("src", "yourpage1.aspx?"pram1 =" & Request.QueryString ("PramVal1")) обратите внимание на то, что ifram нужен запуск на серверном теге, так как вы, вероятно, хотите, чтобы он загружал высоту ifram 100%, что вы можете сделать css:

html { height: 100%;}
body { height: 100%;}

html:

<iframe id="iframeid"  runat="server" scrolling="no" marginwidth="0" marginheight="0"
        frameborder="0" vspace="0" hspace="0" style="overflow: visible; width: 100%;
        height: 100%;"></iframe>

что это за доза, если пользователь является 32-битным IE, тогда откроется новое окно, в котором будет показан pdf (фактически в кадре, но вы не можете сказать) или если это IE 64затем вообще пропустите использование окна и загрузите страницу, которая передает pdf-файл прямо на нашу страницу, что заставляет Adobe-PDF открываться не в окне браузера, а непосредственно как PDF-файл, так что в целом все работает и выглядит хорошо как в 64, так и в 32 IE.

я нашел потоковые ридеры cвозникающие проблемы, но это хорошо работает,

Dim oWebClient As System.Net.WebClient = Nothing
Dim data() As Byte
try
 oWebClient = New System.Net.WebClient
 data = oWebClient.DownloadData(pdfurl)
//add Response.AddHeader stuff here e.g.
 Response.AddHeader("Content-Length", data.Length.ToString)
 Response.BinaryWrite(data)
2 голосов
/ 11 декабря 2011

Internet Explorer 64bit может запускать только 64-битные плагины.Плагин Adobe PDF является 32-битным и не может работать в 64-битном IE.

1 голос
/ 09 декабря 2011

Важно отметить, что отображение встроенного PDF-файла на самом деле можно контролировать с помощью настроек Acrobat Reader.

В меню Edit > Preferences... выберите Internet в левой навигационной панели и убедитесь, что установлен флажок Display PDF in browser.

1 голос
/ 09 декабря 2011

Взгляните на это сообщение на форуме: http://forums.adobe.com/message/3331557#3331557#3331557

Кроме того, весь этот поток рассказывает о различных исправлениях, заставляющих работать разные версии IE. Есть несколько причин, которые могут вызвать эту проблему.

http://forums.adobe.com/thread/758489

Один читатель также отметил, что он ДОЛЖЕН заканчиваться в PDF, что выглядит так, как будто вы делаете.

Имейте в виду, что если вы использовали разные версии Acrobat Reader, эта проблема может быть связана с изменениями в Reader, а не IE.


В своем комментарии вы отметили 64-битную проблему. Проверьте этот SO ответ re IE8 / 64bit Vista:
Невозможно отобразить PDF из HTTPS в IE 8 (в 64-битной Vista)

Похоже, что вы уже делаете все, что, по его словам, ему нужно было сделать, в своем окончательном ответе (а именно, установить для элемента управления Cache значение private, а не , установить Pragma: no-cache.)

Интересно отметить, что различные ответы прошли путь ручного добавления заголовка через:

response.setHeader("Cache-Control","private");

Вместо звонка

Response.Cache.SetCacheability(HttpCacheability.Private);  
Response.CacheControl = "private";

Не уверен, что есть разница, но, возможно, стоит попробовать.

0 голосов
/ 04 февраля 2014

Похоже, что есть ошибка в 64-битном IE9;если расширение файла, используемое для outputStream отображаемого файла PDF, находится в верхнем регистре, например, myFile.PDF, а не в нижнем регистре, например, myFile.pdf, mimeType outputStream не распознается как application / pdf.Вместо этого по умолчанию используется текст mimeType.Страницы такого типа не отображаются вообще, или частично, или отображаются нечитаемым шрифтом.Попробуйте использовать расширение файла .pdf в нижнем регистре, если оно в верхнем регистре.Удачи!

...