Сделать отображение PDF встроенным, а не отдельным окном Acrobat Reader

У меня есть класс ASP.NET ashx, который извлекает данные из базы данных, создает PDF-файл с помощью iTextSharp и передает PDF-файл в браузер. Браузер (по крайней мере, IE и Firefox) запускает Acrobat Reader как отдельное окно для открытия файла. Я хотел бы, чтобы он отображался встроенным в браузере.

Это то, что я могу полностью контролировать со стороны сервера? Я уже установил для заголовка Content-Type значение application/pdf и попытался установить Content-Disposition и Content-Length. Пока ничего не сработало.

Есть ли еще один заголовок, который мне не хватает? Есть ли в самом PDF-файле что-то, что сообщает браузеру, как его отображать? Любые другие идеи?


person John M Gant    schedule 13.05.2009    source источник
comment
Нет, нет, нет, это мой браузер, и я буду просматривать PDF-файлы там, где захочу. Хорошо, я уверен, что это для внутреннего корпоративного веб-сайта. Тем не менее, я нахожу это раздражающим.   -  person jmucchiello    schedule 13.05.2009


Ответы (8)


Установка заголовков content-disposition и content-type должна сделать это, но вам также может понадобиться вызвать Response.ClearHeaders(), чтобы очистить другие установленные заголовки.

Кроме того, попробуйте использовать Fiddler, чтобы просмотреть фактические заголовки и содержимое ответа и сравнить их с данными из сайт, который работает так, как вы хотите.

person tspauld    schedule 13.05.2009

Если вы используете ashx (веб-обработчик), попробуйте следующее:

context.Response.AddHeader("content-disposition", "inline; filename=Something.pdf")
person Christopher Edwards    schedule 13.05.2009
comment
Я тоже думал, что это сработает, но не тут-то было. Я также попытался установить длину содержимого. - person John M Gant; 13.05.2009
comment
У меня работает на IIS6, IE7, ASP.NET3.5. Хммм... Вы пробовали минимальный регистр в нескольких браузерах? Если это так, я добавлю свой полный источник к ответу. - person Christopher Edwards; 13.05.2009
comment
Кристофер, это сработало бы для вас из-за ваших настроек на стороне клиента для Adobe или любого другого средства просмотра PDF, которое вы используете. Если у вас другая версия или отключено отображение в браузере, это не сработает. - person Serapth; 13.05.2009
comment
Если вы показываете в браузере, отключенном в Adobe Reader или чем-то еще, он явно не будет учитывать заголовок содержимого с веб-сервера. В противном случае он должен. - person Christopher Edwards; 14.05.2009

Хорошо, оказывается, это был глупый вопрос, но я рад, что задал его, потому что я никогда не слышал о Fiddler (что привело меня к ответу, поэтому я принимаю ответ tspauld). PDF-файл создается веб-службой, которая передает файл на несколько различных внешних сайтов. Я устанавливал расположение контента в сервисе на inline, но это не имело значения, потому что браузер никогда не получал этот заголовок; он получил заголовок с внешнего сайта (который был attachment). Я изменил его на внешнем сайте, и это исправило его.

Итак, ответ в том, что у вас должны быть Content-Type=application/pdf и Content-Disposition=inline; filename=Something.pdf, как говорили другие.

person John M Gant    schedule 13.05.2009

Попробуйте создать их на своей странице с помощью html OBJECT.

<OBJECT WIDTH=640 HEIGHT=480>
    <PARAM NAME="SRC" VALUE="<%=filePath%>"> 
    <EMBED SRC=<%=filename.pdf%> WIDTH=1000 HEIGHT=680> 
        <NOEMBED> PDF should have displayed here!</NOEMBED> 
        </EMBED>
</OBJECT>

Если вам нужно передать ответ с помощью ashx вместо того, чтобы возвращать aspx, я думаю, вам может не повезти.

В противном случае, я считаю, что настройки, отображаемые в браузере или нет, полностью зависят от клиента и не зависят от вас.

person Serapth    schedule 13.05.2009
comment
Спасибо за предложение. Я хочу, чтобы у них была возможность сохранить PDF. Подойдет ли для этого встраивание? - person John M Gant; 13.05.2009
comment
@jmgant - когда PDF-файл встроен, Acrobat ActiveX имеет значок «Сохранить» на панели инструментов. - person ichiban; 13.05.2009
comment
Честно говоря, я не уверен без тестирования. Тем не менее, даже если это не так, вы можете легко добавить ссылку или кнопку «Скачать» на свою страницу. - person Serapth; 13.05.2009

Итак, у меня есть образец в одной из моих работ, это то, что вам нужно:

<cc1:ShowPdf ID="ShowPdf1" runat="server" BorderStyle="None"  BorderWidth="0px"
        Height="750px" Style="z-index: 103; "
        Width="750px"/>

и на стороне сервера:

  ShowPdf1.FilePath = String.Format("~/Handlers/Pdf.ashx?id={0}#view=FitH&page=1&pagemode=none&navpanes=1", myPublicationId);

Я размещаю здесь также некоторый код из моего обработчика PDF:

Response.ContentType = "application/pdf";
    byte[] bytes = YourBinaryContent;

    using (BinaryWriter writer = new BinaryWriter(context.Response.OutputStream))
    {
        writer.Write(bytes, 0, bytes.Length);
    }

В любом случае, если мой пост не кажется вам ясным, взгляните на этот образец Как отображать PDF-документы с помощью ASP.NET

person Iralda Mitro    schedule 13.05.2009
comment
Является ли ShowPdf пользовательским элементом управления? Что делает установка его свойства FilePath? - person John M Gant; 13.05.2009
comment
да. FilePath инструктирует мой контроль, какой PDF-файл (сохраненный в базе данных) отображать и как отображать его, передавая необходимые параметры. - person Iralda Mitro; 14.05.2009

Я думаю, что этот заголовок будет делать то, что вы хотите

Content-type: application/pdf

Поскольку вы говорите, что это не работает, я подозреваю, что это параметр конфигурации на стороне клиента.

Проверьте установленную версию Adobe Acrobat. В настройках есть параметр «Интернет» и флажок «Отображать PDF в браузере».

--
бмб

person bmb    schedule 13.05.2009
comment
Спасибо за ответ. Я настроил свой Acrobat Reader на встроенное отображение, но это, похоже, не имеет значения. Я был на других страницах PDF, которые отображаются в моем браузере, но та, которую я обслуживаю, этого не делает. Так что я не думаю, что это строго проблема клиента. - person John M Gant; 13.05.2009

Вот статья об использовании для этого тега embed:http://blogs.adobe.com/pdfdevjunkie/2007/08/using_the_html_embed_tag_to_di.html

person Fermin    schedule 13.05.2009

Если у вас есть бюджет, моя компания продает набор продуктов, который включает в себя на основе AJAX. средство просмотра изображений, которое позволит вам просматривать страницы PDF в очереди вообще без Acrobat. В своей простейшей форме это просто просмотрщик, но вы можете наслаивать интерактивность по мере необходимости.

person plinth    schedule 13.05.2009