Показать PDF в веб-приложении - PullRequest
4 голосов
/ 10 марта 2012

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

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

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

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

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

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

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

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

Спасибо !!!

Ответы [ 5 ]

7 голосов
/ 10 марта 2012

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

Например,

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

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

5 голосов
/ 10 марта 2012

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

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

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

1 голос
/ 10 марта 2012

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();
}
0 голосов
/ 06 ноября 2015

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

0 голосов
/ 09 апреля 2013

Так я могу открыть 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...