Rahul Soni's blog

Never assume the obvious is true!

4 ways to send a PDF file to the IE Client in ASP.NET 2.0

4 ways to send a PDF file to the IE Client in ASP.NET 2.0

Rate This
  • Comments 42

In this pick, I am sharing a project using which you can send PDF files to the IE Client in four different ways. You may download the project by clicking here.

Create a new C# Website. While creating the following pages ensure that you DON'T have "Place code in Seperate file" checkbox as checked. You need to create 4 pages called "Way1.aspx", "Way2.aspx", "Way3.aspx" and "PDFContainer.aspx" without a code behind.

So the four different ways which I was talking about is as follows...

1) You hit a button on a page and the page refreshes itself with a PDF file in the same instance of the IE Browser. You are not prompted to Open/Save/Cancel by the IE Client at all. The code for this page is as follows

Way1.aspx

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
    protected void Button1_Click(object sender, EventArgs e)
    {
        Response.ContentType = "application/pdf";
        Response.Clear();
        Response.TransmitFile("UML.pdf");
        Response.End();
    }
</script>
<html xmlns="
http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Way 1</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Send PDF" /><br />
        <br />
        This page will refresh itself with a PDF file opened in the same instance of IE itself.
        Users will not get prompted to Save/Open/Cancel the PDF file.</div>
    </form>
</body>
</html>

2) You hit a button on a page and the page throws a Dialogbox saying Open/Save/Cancel. You click on Save and the FileName is populated is the document is according to your taste (meaning you have to supply it explicitly).

3) Verify similar to 2 above, but the filename in the Dialogbox is the name of the Page (meaning, if you don't the supply name, the Dialogbox takes the name of the aspx file as the PDF file name).

The code for this page is as follows...

Way2.aspx

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
    protected void Button1_Click(object sender, EventArgs e)
    {
        Response.ClearHeaders();
        Response.ContentType = "application/pdf";
        Response.Clear();
        Response.AppendHeader("Content-Disposition", "attachment;Filename=UML.pdf");
        Response.TransmitFile("UML.pdf");
        Response.End();
    }
    protected void Button2_Click(object sender, EventArgs e)
    {
        Response.ClearHeaders();
        Response.ContentType = "application/pdf";
        Response.Clear();
        Response.AppendHeader("Content-Disposition", "attachment");
        Response.TransmitFile("UML.pdf");
        Response.End();
    }
    </script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Way 2</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Send PDF" /><br /><br />
        This button will do a postback and the Client will be prompted with a Dialog Box to Save/Open/Cancel the PDF file transmission. The thing to be noticed here is that the FileName in the Dialogbox will be automatically set as UML.pdf <br /><br />
        <asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="Send PDF without FileName" /><br /><br />
        This button will do a postback and the Client will be prompted with a Dialog Box to Save/Open/Cancel the PDF file transmission. The thing to be noticed here is that the FileName in the Dialogbox (Way2.pdf) is set as the Page Name, which is Way2.aspx</div>
    </form>
</body>
</html>

4) You hit a button on a page and the page opens a new instance of Internet Explorer and loads the PDF file in the IE Client itself without prompting to Open/Save/Cancel. The code for these pages Way3.aspx & PDFContainer.aspx are as follows...

Way3.aspx

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script  language=vbscript>
sub OpenInNewWindow()
    window.open("PDFContainer.aspx")
end sub
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Way 3</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <input type=button OnClick="OpenInNewWindow()"  value="Open in New Window"/>
        <br /><br />
        This time, we will open a new Internet Explorer Window and Show the PDF File directly in the IE
    </div>
    </form>
</body>
</html>

PDFContainer.aspx

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.ContentType = "application/pdf";
        Response.Clear();
        Response.TransmitFile("C:\\umlclass.pdf");
        Response.End();       
    }
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>PDF File</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>   
    </div>
    </form>
</body>
</html>

UPDATE:By the way, I just found out... these ways will not work with Adobe Reader 6.0 or below. We upgraded to Adobe Reader 7.0 and everything works as expected.

Hope that helps!

-Rahul Soni

Attachment: SendPDF.zip
  • Trackback from dotnetkicks.com
  • good
  • Is there any way to write a pdf from an HTML string rendered in the code behind without using a third component like ITextsharp??


    Regards
    Bhaskar
  • Hy.I am using VB.NET.I have a little problem.I want to show a pdf on a new page, using JavaScript (Window.Open(url...)).In my page i write in codebehind:
    With Response
                   .ClearContent()
                   .ClearHeaders()
                   .ContentType= "application/pdf"                .Buffer = True
                   .BinaryWrite(myStream)
                   .End()
               End With

    where myStream is a stream of bytes (array of byte) I am sure that my stream is ok... but i don't see anything unless I use other types of files (jpeg for example).But with pdf is not working
  • HI
    i want the same application to do in vb.net but in windows application.
    can u plz help me how to do that

    Regards
    shalini
  • good
  • I am getting an error after downloading a pdf file using this method (with transmitfile).

    "There was an error opening this document. The file is damaged and could not be repaired"

    When I view the file in notepad, I see that there is a bunch of HTML from the web page appeneded. Shouldn't Response.End() prevent this?
  • Yes Paul, Response.End should take care of this. Can you tell me which way among the 4 you used and what version of Adobe Reader and Operating System you are using?

    Does it happen with all the PDF files, or the ones which are greater than specific size?
  • I am trying to transmit a zip file using the Response.Transmitfile method. Its sending the file and also appending the aspx page's html to it. Am I missing anything here? Below is the code I am using

    Response.ContentType = "application/x-zip-compressed"
    Response.AddHeader("Content-Disposition", "attachment;filename=" + sFileName)
    Response.TransmitFile("C:\test.zip")

    I even tried using octet-stream instead of x-zip-compressed. I checked the IIS Server's mime-type and x-zip-compressed has been mapped to .zip file.

    If I use Response.End then I don't get Open/Save dialog window. Technique used to display is

    Search.aspx - To search files to be downloaded
    Results.aspx - displays matched files with a check box against each of them. At the bottom of the page I have a button "Download checked File". On clicking this button, the button click event triggers the download code

    Regards
    Krish
  • I am getting the error "Not a valid Virtual Path". My path is "http://www.mysite.com/pdfs/12345ab.pdf".
    I had been trying to stream the file in ASP.net 2.0 which does not work in IE (http://support.microsoft.com/default.aspx?scid=kb;en-us;Q305153).
  • I have found a solution for all the above queries...
    please google for "Itextsharp". You will find a gr8 API provided by them to CONVERT HTML-2-PDF,ASPX-2-PDF,XLS-2-2PDF.

    Regards
    Bhaskar Tripathi
  • How come the Page Load event code for PDFContainer.aspx it works, but does not work when I put in the same code in the code behind file PDFContainer.aspx.cs?

    It works as it is in this demonstration but when I cut that Page Load code and put it in the code behind file I get a blank page.
  • Great post. Needed to save an xls file to the client computer and this post helped me do it in no time.

    Great work!
  • Hi Rahul,

    It is so nice to see your beautiful Anika growing and developing well.  
    I wonder if you think this concept can be extended to downloading images to an image control.  I have several thumbnail images that are not contained in the web root or a subfolder of the web root.  I do not want my users knowledge of the physical path of my images.  

    Regards,
    Neil Gorin
  • Hi Dr. Neil,

    Nice to see your entry here! :o)

    Regarding the same concept being extended for the image control, I would say, it is possible to ensure that "I do not want my users knowledge of the physical path of my images". But if you follow the above methods, u will not be able to get the desired affect.

    I would rather suggest streaming down the image files from the database using response.binarywrite. Although, personally I would rather refrain myself from doing it because of the performance hit.

    If the main task is to ensure that no-one is able to go the folder where you have kept all your graphics, creating a web.config and denying access in some way might be a better solution!!

    You can also probably opt for URL Rewriting. Involves a little bit of coding, but probably the best!

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/urlrewriting.asp

    Thanks,
    Rahul
Page 1 of 3 (42 items) 123
Leave a Comment
  • Please add 4 and 8 and type the answer here:
  • Post