نمایش یک فایل PDF پویا در یک iframe در ASP.NET
جمعه 20 اردیبهشت 1392نمایش یک فایل PDF پویا در یک iframe در ASP.NET <br/> عموما در برنامههای وب برای نمایش فایلهای پویای باینری تولید شده، یا ابتدا آنها را بر روی سخت دیسک ذخیره کرده و مسیر نهایی را به نحوی به کاربر نمایش میدهند
عموما در برنامههای وب برای نمایش فایلهای پویای باینری تولید شده، یا ابتدا آنها را بر روی سخت دیسک ذخیره کرده و مسیر نهایی را به نحوی به کاربر نمایش میدهند و یا فایل را بدون ذخیره سازی، در مرورگر کاربر اصطلاحا Flush میکنند. حالت Flush سبب نمایش صفحه دیالوگ ذخیره سازی فایل گردیده و در همینجا Response خاتمه خواهد یافت.
برای نمونه در اینجا توسط متد inMemoryFile، یک فایل PDF در حافظه تشکیل شده و سپس به صورت یک Byte Array بازگشت داده میشود. در ادامه کار، این اطلاعات در مرورگر کاربر Flush خواهد شد:
و برای نمایش آن در یک iframe در صفحه:
نتیجه کار، نمایش صفحه دیالوگ ذخیره سازی فایل به کاربر است:
سؤال: فرض کنید Adobe reader بر روی سیستم نصب است و مرورگر با استفاده از Active-X آن میتواند این نوع فایلها را نمایش دهد. آیا راهی وجود دارد تا بجای نمایش save popup dialog، این فایل توسط مرورگر نمایش داده شود؟
پاسخ: بلی. در کدهای فوق تنها کافی است یک سطر آن تغییر کند:
در اینجا تنها نحوه مقدار دهی content-disposition تفاوت کرده است. حالت attachment سبب نمایش save popup dialog میشود و مقدار inline، فایل را در مرورگر نمایش خواهد داد.
اینبار اگر برنامه را اجرا کنیم، iframe ایی که به PdfHandler.ashx اشاره میکند، فایل PDF را در صفحه نمایش میدهد.
برای نمونه در اینجا توسط متد inMemoryFile، یک فایل PDF در حافظه تشکیل شده و سپس به صورت یک Byte Array بازگشت داده میشود. در ادامه کار، این اطلاعات در مرورگر کاربر Flush خواهد شد:
using System.IO; using System.Net.Mime; using System.Web; namespace WebApplication { public class PdfHandler : IHttpHandler { private static byte[] inMemoryFile() { //تولید پویای فایل در حافظه و یا حتی خواندن از یک نمونه موجود return File.ReadAllBytes(@"D:\path\DynamicCrosstabSampleRpt.pdf"); } public void ProcessRequest(HttpContext context) { var pdf = inMemoryFile(); context.Response.Cache.SetCacheability(HttpCacheability.NoCache); context.Response.ContentType = MediaTypeNames.Application.Pdf; context.Response.AddHeader("Content-Length", pdf.Length.ToString()); context.Response.AddHeader("content-disposition", "attachment;filename=test.pdf"); context.Response.Buffer = true; context.Response.Clear(); context.Response.OutputStream.Write(pdf, 0, pdf.Length); context.Response.OutputStream.Flush(); context.Response.OutputStream.Close(); context.Response.End(); } public bool IsReusable { get { return false; } } } }
<iframe width="100%" src="PdfHandler.ashx" height="200px"></iframe>
سؤال: فرض کنید Adobe reader بر روی سیستم نصب است و مرورگر با استفاده از Active-X آن میتواند این نوع فایلها را نمایش دهد. آیا راهی وجود دارد تا بجای نمایش save popup dialog، این فایل توسط مرورگر نمایش داده شود؟
پاسخ: بلی. در کدهای فوق تنها کافی است یک سطر آن تغییر کند:
Response.AddHeader("content-disposition", "inline;filename=test.pdf");
اینبار اگر برنامه را اجرا کنیم، iframe ایی که به PdfHandler.ashx اشاره میکند، فایل PDF را در صفحه نمایش میدهد.
- ASP.net
- 2k بازدید
- 0 تشکر