4 ways to send a PDF file to the IE Client in ASP.NET 2.0
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" "https://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="https://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" "https://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="https://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" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script language=vbscript>
sub OpenInNewWindow()
window.open("PDFContainer.aspx")
end sub
</script>
<html xmlns="https://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" "https://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="https://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
Comments
Anonymous
March 24, 2006
Trackback from dotnetkicks.comAnonymous
March 31, 2006
goodAnonymous
April 06, 2006
The comment has been removedAnonymous
April 13, 2006
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 workingAnonymous
April 26, 2006
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
shaliniAnonymous
April 26, 2006
goodAnonymous
April 28, 2006
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?Anonymous
May 01, 2006
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?Anonymous
May 10, 2006
The comment has been removedAnonymous
May 18, 2006
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).Anonymous
May 26, 2006
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 TripathiAnonymous
June 27, 2006
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.Anonymous
September 15, 2006
Great post. Needed to save an xls file to the client computer and this post helped me do it in no time.
Great work!Anonymous
September 18, 2006
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 GorinAnonymous
September 18, 2006
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,
RahulAnonymous
November 02, 2006
I need to count the total number of pages in a pDF document using VB.NET. Is it possibleAnonymous
December 19, 2006
Hi, could you point out how to use adobe open parameters? trips when using something like: Response.TransmitFile(....SYS.PDF#page=71) SYSA.PDF#page=71' is not a valid virtual path. Response.Redirect is working for me either. Like to display different page numbers directly from code. Using acrobat 8 Thanks -SteveAnonymous
December 20, 2006
Hi Steve, Honestly speaking, I don't have the answer. I am not aware of the PDF DOM. RahulAnonymous
February 04, 2007
u hav given all the 4 ways for opening pdf file at button click.how could i do it at page load event.when i hav tried to do dats nothing appears on screen whereas at button click every thing goes rightAnonymous
February 13, 2007
Hi! Great help! :)Anonymous
February 13, 2007
Hi Ritu, If you notice, to make everything happen as we expect we work with headers. The problem with Page Load event is that if you have reached till Page_Load, your headers etc are already sent and you will not get the desirable effect. Hope that helps! RahulAnonymous
March 21, 2007
hi, how can i convert a .aspx file to pdf file on click of a button and save it to disk.Anonymous
April 09, 2007
Good job!Anonymous
May 02, 2007
The comment has been removedAnonymous
May 02, 2007
Hi Jim, AFAIK, The pop-up blocker is a client side setting and the server will unfortunately have no clue if the client is disabling that download. HTH, RahulAnonymous
May 31, 2007
I have a .aspx page and in that page's code behind, i will get data from database and write client script that would create basic HTML content based on the data from the database. Now I want this page to be displayed in pdf. Could you please help, Rahul. THe thing with your "four ways to send a pdf file is", you have to have pre-sepecified .pdf file. Mine is not like that. It has to create the pdf file on the fly. Could you please help. Thanks in Advance HymaAnonymous
July 09, 2007
TO MAKE IT WORK IN THE PAGE_LOAD IN THE CODE BEHIND !!! I had an issue where I couldn't load the PDF in the page load. I created the PDF in a memory stream and found that I had to add this to my code - Response.ClearHeaders(); After adding that, the page loads with the PDF.Anonymous
August 10, 2007
I want to show the PDF file in part of the IE window (like top half of the window) and show other information in the remaining part. How do we do this? Thanks.Anonymous
January 03, 2008
Henry, THANK YOU! I was having the same problem, and your solution worked!Anonymous
January 23, 2008
Hi.. I am having problem with Adobe version 6. The pdf file is not opening with Adobe 6 but the same code is working fine for Adobe 5. I am using the below code: Response.Clear() Response.ClearContent() Response.ClearHeaders() Response.Buffer=true Response.ContentType = "application/pdf" Response.BinaryWrite(Node.nodeTypedValue) Response.Flush() Response.Close() Response.End() Any help?? ThanksAnonymous
January 23, 2008
Hi Haritha, The sample here were tested against Adobe 7.0+. Unfortunately, I don't even have the Adobe reader 5.0/6.0. Anyways, you may try playing around with commenting out some statements and check if that makes a difference. HTH, RahulAnonymous
January 23, 2008
Hi Rahul, Thank you very much for your response. I have been trying to fix this. But unfortunately my code is in ASP and couldn't find any solution as of now. Seems like there is some problem with IE and Adobe Reader 6.0 versions as I am able to open the pdf file with the same code using FireFox and Adobe Reader 6.0 Will post here if I find any solution.Anonymous
January 24, 2008
Hello Haritha, You may try Fiddler Tool to analyze what's different. Although, even my gut feeling is saying that it is more likely an issue with IE+Adobe 6.0 combo which is causing it. Regards, RahulAnonymous
January 25, 2008
Hello Rahul, I am facing a new problem now. With the code provided everything is working fine for the first time but later when I am trying to create the pdf by submitting the form several times, I am getting error "There was an error opening this document. The file cannot be found". I am using Adobe version 7.0 and IE 6.0 Please let me know your thoughts. ThanksAnonymous
January 25, 2008
The comment has been removedAnonymous
August 12, 2008
The comment has been removedAnonymous
August 12, 2008
Hello Europhile, You need to change the ContentType to "application/vnd.ms-excel"... Try way2.aspx and modify the Button1_click event. protected void Button1_Click(object sender, EventArgs e) { Response.ClearHeaders(); Response.ContentType = "application/vnd.ms-excel"; Response.Clear(); Response.AppendHeader("Content-Disposition", "attachment;Filename=UML.xlsx"); Response.TransmitFile("UML.xlsx"); Response.End(); } Hope this helps, RahulAnonymous
August 14, 2008
Many thanks Rahul, handy new mime type! Unfortunately, this still opens in a new app window after the Open or Save dialogue. Have you tried it with an office doc? I changed your AppendHeader from attachment to inline but both do the same thing! Maybe this is where the bug is, it should be fairly generic code but office ignores the inline?Anonymous
August 14, 2008
Hello Europhile, I guess you are right. I tried the following code and got a security prompt. protected void Button1_Click(object sender, EventArgs e) { Response.ClearHeaders(); Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; Response.Clear(); Response.AppendHeader("Content-Disposition", "inline;Filename=UML.xlsx"); Response.TransmitFile("UML.xlsx"); Response.End(); } The following link explains this... http://blogs.msdn.com/vsofficedeveloper/pages/Excel-2007-Extension-Warning.aspxAnonymous
August 14, 2008
Also, you may refer to this page for a lot of other MIME types... http://blogs.msdn.com/vsofficedeveloper/pages/Office-2007-Open-XML-MIME-Types.aspxAnonymous
October 31, 2008
Hi, I'm trying to download html page with TransmitFile. It is opening in same browser. But I want open in new window. Can you help me on this.... RajasekharAnonymous
December 19, 2008
Does not work?? Always giving that the file is damaged or corrupted! Response.ClearHeaders(); Response.ContentType = "application/zip"; Response.Clear(); Response.AppendHeader("Content-Disposition", "attachment;Filename=UML.zip"); Response.TransmitFile("~/Files/"+"MyZipFolder.zip"); Response.End();