I have a file that is in .pdf format for my website.
If you left click on the link, it will open the Adobe Reader and open the file.
What I want to do is when you left click, it opens a dialogue box that asks you where you want
to save the file.
I know you can do this by right clicking and choosing save as,
but is there any way by just
one simple left click to downlaod it?
Im sure there is some sort of hack to accomplish this but this is the feature that is installed with the browser when Adobe Reader is installed on the machine. Keeping this consistent for all users is the best approach. Do not bother with trying to make the left click open a save dialog. Users are accustomed to this behavior and will know how to save the PDF to thier local hard disk
Consistency is the key here.
two parts, you have to convert the pdf to a byte stream and add a content-disposition header to the html response.
first get the file and stream to a byte array
public byte[] GetDocument(string filePath)
{
return File.ReadAllBytes(filePath);
}
Then send it - as the very first thing in the Page_Load event - you'll need to pass the path to the file through session or query string to a new page, as you can't change the content type on an existing page you have already viewed in the browser.
Byte[] fileData = GetDocument(filePath);
Response.Clear();
Response.ClearHeaders();
Response.ClearContent();
Response.ContentType = "application/pdf";
// prompt to download
Response.AppendHeader("content-disposition", "attachment; filename=declarations.pdf");
Response.AppendHeader("content-length", fileData.Length.ToString());
Response.BinaryWrite(fileData);
Response.Flush();
Response.Close();
Add the pdf to a zip folder and add a link to the zip folder
Remove the pdf location from the href part of your link, and code an onClick method instead.
<a href="#" onClick="$:openSaveDialog">
<script>
function openSaveDialog() {
//Write a JavaScript function to prompt the user with a Save Dialog Box.
}
</script>
Related
On site (ASP.NET) i have table with items. Every item has link to specific pdf. This pdf i generate from binary data that are saved in database. So realy, i don't have path to pdf file.
When i click on link, i want to download file. And this functionallity work fine.
But i download file to default location that use browser (By default it's C:\Users\Admin\Documents)
What should i do to make browser show save dialog where user can chose destination path for pdf?
Code to generate pdf file :
private void ProcessFile(byte[] file, string fileName)
{
Response.Clear();
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition",
string.Format("attachment;filename=\"{0}\"", fileName));
Response.BinaryWrite(file);
Response.Flush();
Response.End();
}
About my code : i'm going to rewrite a bit it according to this post
i have a problem that i can restrict user to download pdf,i only view the pdf document to user
in a browser my code is below:
string filepath = Server.MapPath(dt.Rows[0]["FilePath"].ToString());
WebClient client = new WebClient();
Byte[] buffer = client.DownloadData(filepath);
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "inline;filename=data.pdf#toolbar=0&navpanes=0");
Response.AddHeader("content-length", buffer.Length.ToString());
Response.BinaryWrite(buffer);
but the above code can't hide the toolbar in browser..please help
What you ask cannot be achieved on every browser with every PDF reader plugin. You do not have control over which PDF reader your users may use, for example.
If the user can view the PDF, they can download it. There is nothing you can do to prevent this. The only way to prevent them from saving it locally is not to let them view it in the first place.
And even if you were able to prevent the system from allowing the file to be saved, you cannot protect against the analog hole. The user could simply take a photo of his monitor, for example, or retype the contents into a new document.
If the user can view it, then they can print it.
Hiding the Save or Print button does not secure the PDF file, if you need protection in PDF, consider securing the PDF.
Abobe.com : PDF File Protection
I have a aspx page containing an iframe which shows a pdf ( i have ashx handler to display pdf in iframe), I also have a download button which onclick stream's a different pdf to the browser as an attachment.
download to browser code: (this is in ashx handler)
byte[] bytes = // get byte array from table
Response.Buffer = false;
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "application/pdf";
// [optional]
Response.AddHeader(
"Content-Disposition",
string.Format("attachment; filename={0}", attachmentName)
);
Response.OutputStream.Write(bytes, 0, bytes.Length);
Response.End();
This code works fine however after sending this response to the browser my iframe goes blank and I have to refresh the page in order to see it again. I tried most of the solutions
http://adamyoung.net/IE-Blocking-iFrame-Cookies
http://forums.asp.net/p/1036628/1433536.aspx
but none of them is working. iframe behaves fine in chrome & FF.
Note: if i do downloading stuff using asp:hyperlink to my ashx and setting target="_blank" it works fine in IE but i need some server side processing to do therefore i cant use this method.
While Chrome and FF leave the page there, this does actually make sense.
You are posting back to the server, then clearing your whole output, placing a file in the stream and sending that. Technically I would say IE is right in blanking out the page.
This is assuming your download button is in the iframe?
The solution I would try is putting that download link in another iFrame or have another page that downloads it and when you press a link it opens the new page which just outputs a file. So the window flashes up but then it disappears and a save dialog button appears. However popup blockers might try to stop this.
I have a gridview in which I have provided an option for the user to download the pdf files. When they click on the pdf icon sometimes it open the pdf file in a new tab and sometimes it starts downloading. How can i make it download always?
You need to add a button (image button, linknbutton or button) and handle the RowCommand event of GridView. In RowCommand handler you may write code to download a file.
You may use Response object's method.
string filepath=MapPath("~/files/file.pdf");
byte []bytes=System.IO.File.ReadAllBytes(filepath);
Response.Clear();
Response.ClearHeaders();
Response.AddHeader("Content-Type", "application/octet-stream");
Response.AddHeader("Content-Length", bytes.Length.ToString());
Response.AddHeader("Content-Disposition","attachment; filename=file.pdf");
Response.BinaryWrite(bytes);
Response.Flush();
Response.End();
In order to always force a download you need to add the Content-Disposition header as AVD showed; however, I find this totally unnecessary; I think it would suffice to have the link to the PDF open in a new window. In other words, have target="_blank" defined. Example:
invoice
Then, is up to the user whether he wants to save the file locally or just see it on the screen. I think the important thing is that this won't interfere with the current page the user is looking at.
I want to generate a PDF file on server side, and then in response want to send that file (buffer,fileName- whatever may work) and show a print dialog to ask user to print the generated PDF file.
I tried something like below. But it does not trigger window.print() dialog.
public static void ForcedPrint(HttpResponse response, byte[] buffer, string fileName, string fileExtension) {
response.Clear();
response.Buffer=true;
response.Write("<script>window.print();</script>");
response.Charset="";
response.Cache.SetCacheability(HttpCacheability.NoCache);
response.ContentType="application/pdf";
response.BinaryWrite(buffer);
response.Flush();
response.End();
}
Can someone please help me with this?
The feature i am looking for is that i should be able to create PDF file on server, and in response user should get a dialog to print the generated file.
Thanks in advance.
As far as I'm aware you cannot generate a print command to the browser on the server. The most you can do is generate the javascript which will make it pop up with a print dialog (window.print()) but that wouldnt help you with what you're trying to do.
Just speculating but you may try generating a page with an iframe that points to the PDF file, and in the base page have the javascript that tells the iframe to print?
Hope this helps,
Darko
You need to embed the PDF in the HTML document, say in a div called thePDF and in JavaScript code in the document, you need to invoke
thePDF.printWithDialog()
The dialog that appears will be the Adobe Reader plugin's print dialog rather than the browser's print dialog; this will allow selection of pages etc. before printing.