Показать PDF в веб-приложении

Я искал это, искал это, просматривал SO и другие сайты (я пытался читать по этой проблеме часами сейчас), но я все еще не могу найти удовлетворительное решение того, что, кажется, простая, общая проблема программирования.

Позвольте мне установить сцену:

  •   
  • У меня есть веб-сайт/веб-приложение, которое позволяет пользователю выполнять поиск в библиотеке SQL Server.  
  • Большинство документов, связанных с результатами поиска, являются файлами PDF.  
  • Файлы PDF хранятся внутри базы данных SQL Server BLOB.  
  • Я хочу иметь возможность динамически извлекать PDF из базы данных и отображать его пользователю.  
  • Чтобы сохранить ход поиска пользователя, я бы хотел открыть файл в другом окне/вкладке браузера  
  • Я выяснил, как сохранить PDF файл на сервере в указанном каталоге.  
  • я НЕ хочет, чтобы пользователь увидел путь к файлу.  
  • По причине, я хочу решение, которое работает во всех основных браузерах:  
    •       
    • Internet Explorer      
    • FireFox      
    • Chrome      
    • Safari (в том числе iPhone Safari Mobile Safari)  
      
  • Я бы предпочел не покупать сторонний компонент, но я готов пойти по этому маршруту, если это необходимо.  
  • Я не думаю, что хочу отправить файл в качестве загружаемого файла (что, я думаю, я понял, как это сделать), потому что это не сработает на iPhone/iPad?

Каждое решение, которое я пробовал до сих пор, содержит некоторые основные проблемы:

  •   
  • Использование iFrames, похоже, терпит неудачу на iPhone/iPad  
  • Использование Server.Transfer(я использую ASP.NET) показывает тарабарщину вместо PDF  
  • Я пробовал пару демо-решений сторонних разработчиков, но они тоже воняют!

Я не могу понять это! Я действительно разработчик настольных компьютеров, и это было EASY в Windows! Почему это так сложно с Интернетом?

Неужели я глуп, и это действительно легкое упражнение, или эта основная задача действительно такая сложная?

Пожалуйста, помогите указать мне в правильном направлении!

Спасибо!!!

5 ответов

Эта ссылка может быть вам полезна,

http://nilangshah.wordpress.com/2007/05/28/successfully-stream-a-pdf-to-browser-through-https/

Вы можете открыть PDF на новой вкладке, указав target = "_ blank" для ссылки. ByteArray, упомянутый в блоге, - это ваш BLOB из БД. Надеюсь, это поможет.


Вы пробовали добавить заголовок http с помощью content-disposition-inline? Также вы можете записать результат непосредственно в ответ на выход, а не сохранять его. Это гарантирует, что фактический путь к файлам не будет отображаться, поскольку вы пишете его непосредственно в ответ.

Например,

Response.ContentType = "application/pdf";
Response.AddHeader("Content-disposition","inline");
Response.BinaryWrite(myfilestream.ToArray());

Где myfilestream - это поток памяти или если у вас уже есть массив байтов из вашего блоба, вы можете записать его непосредственно в ответ без toarray


ASP.Net имеет серверный элемент ReportViewer, который может использоваться для отображения файлов PDF.

Значительная часть документации об этой функции заключается в том, как создавать отчет и экспортировать его в PDF. MSDN действительно не очень полезно. Я полагаю, все полагаются на Adobe Reader и не ищут альтернативы?

Но можно также импортировать и отображать PDF. Этот код, похоже, работал для этого пользователя:

public static void RenderToPdf(ReportViewer reportViewer, Boolean forceDownload)
{
 string path = (string.IsNullOrEmpty(reportViewer.LocalReport.ReportPath)) ? reportViewer.ServerReport.ReportPath : reportViewer.LocalReport.ReportPath;
 RenderToPdf(reportViewer, forceDownload, System.IO.Path.GetFileNameWithoutExtension(path));
}
public static void RenderToPdf(ReportViewer reportViewer, Boolean forceDownload, string fileNameWithoutExtension)
{
 HttpContext context = HttpContext.Current;
 if (!context.Response.Buffer)
 {
 return; //can not clear the buffer, so exit
 }
 //define out properties
 Warning[] warnings;
 string mimeType, encoding, fileNameExtension;
 string[] streams;
 //get pdf content
 Byte[] pdfContent = reportViewer.LocalReport.Render("PDF", null, out mimeType, out encoding, out fileNameExtension, out streams, out warnings);
 //cancel and clear the existing output!
 context.Response.Clear();
 context.Response.ContentType = "application/pdf";
 //add a header so that the user can save the target as a downloaded file
 if (forceDownload)
 {
 context.Response.AddHeader("Content-disposition", string.Format("attachment; filename={0}.pdf", fileNameWithoutExtension));
 }
 context.Response.BinaryWrite(pdfContent);
 context.Response.End();
}


Если вы ищете клиентский клиент pdf-клиента, вы можете посмотреть PDF.js, что может отображать любой PDF с включенным программой просмотра по умолчанию (вам придется преобразовать viewer.html в представление, если в MVC, но это довольно просто). Это с открытым исходным кодом и живой. Мне пришлось немного его адаптировать, чтобы показать pdf-аннотации на iphone (цифровые подписи), комментируя некоторые строки в js.


Вот как я делаю, чтобы открыть PDF-документ в браузере с страницы ASP.NET(aspx). На странице OnLoad:

this.Response.Clear();
 this.Response.Buffer = true;
 this.Response.ContentType = "application/pdf";
 this.Response.AddHeader("content-length", pdfReportStream.Length.ToString());
 this.Response.BinaryWrite(pdfReportStream.ToByteArray());
 this.Response.End();

licensed under cc by-sa 3.0 with attribution.