2012年4月27日

ASP.NET 網頁動態顯示PDF

這是一個很一般的問題,一般我們要把PDF檔嵌在頁面的一個位置,會有兩種方式,一種是iframe,另為一種是利用<Object>標籤,以下就介紹這兩種方法:

 

  1. iframe
    這種方法是無法跨網域。因此如果你的 PDF是放在另外一台主機,可利用網路芳鄰(參考我這篇)來作內部的傳輸,以下是其作法:
    a. 首先我們拉一個使用masterpage的網頁,命名為default.aspx,在content裡放一個iframe
    <%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master"
    AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="LiteralControlApp.Default" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">


    <div id="iframeOverviewDiv">
    <iframe width='400' height='600' id='ifPdf' src='getPdf.aspx'></iframe>
    </div>
    </asp:Content>



    iframe裡的src是一個getOdf.aspx,這程式會把我們要的pdf檔Response到client端




            protected void Page_Load(object sender, EventArgs e)
    {
    String filePath ="";
    //前端要顯示的檔案名稱
    filePath = Request["file"];
    if (filePath == "" || filePath == null) filePath = Server.MapPath("~/Pdf/test.pdf");

    FileInfo TheFile = new FileInfo(filePath);
    //建立HttpRespose物件
    HttpResponse response = this.Context.Response;
    //宣告Header 為pdf
    response.AddHeader("content-disposition", "application/pdf");

    response.Charset = "";

    //宣告ContentType 為pdf
    response.ContentType = "application/pdf";

    //將檔案傳向Client
    response.WriteFile(TheFile.FullName, false);
    response.Flush();
    response.End();
    }



    以上的範例如果你要搭配資料庫,可以把iframe那段用LiteralControl取代,在Server端寫iframe


    在default.aspx加入Literal元件,並加入一按鈕作為打開test2.pdf




    <table>
    <tr>
    <td>
    &nbsp;</td>
    <td>

    <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="PDF2" />
    </td>
    </tr>
    <tr>
    <td>
    <div id="iframeOverviewDiv">
    <iframe width='400' height='600' id='ifPdf' src='getPdf.aspx?file=~/pdf/test.pdf'></iframe>
    </div>
    </td>
    <td>

    <asp:Literal ID="Literal1" runat="server"></asp:Literal>
    </td>
    </tr>
    </table>



    在code-behind加入動態產生iframe




            protected void Button1_Click(object sender, EventArgs e)
    {
    string strIframeTag = "<iframe width='400' height='600' id='ifPdf2'
    src='getPdf.aspx?file={0}'></iframe>";
    strIframeTag = string.Format(strIframeTag, Server.UrlDecode("~/Pdf/test2.pdf"));
    this.Literal1.Text = strIframeTag;
    }



  2. <Object>標籤

    新增一個按鈕在content裡,並增加code behind以下程式




            protected void Button2_Click(object sender, EventArgs e)
    {
    // Objec標籤
    string pdfOcx = "<OBJECT id='pdf1' height='600' width='400' classid='{0}' VIEWASTEXT>\n";
    pdfOcx += "<PARAM NAME='_cx' VALUE='17648'>\n";
    pdfOcx += "<PARAM NAME='_cy' VALUE='12462'>\n";
    pdfOcx += "<param name='SRC' value='{1}'>";
    pdfOcx += "</OBJECT>\n";
    string strCLSID = "clsid:CA8A9780-280D-11CF-A24D-444553540000";//pdf clsid
    string fileName="http://localhost/pdf/test3.pdf"; //pdf檔案位置
    pdfOcx = string.Format(pdfOcx, strCLSID, fileName);
    this.Literal1.Text = pdfOcx;
    }



  3. pdfView元件

    請參考

1 則留言: