2009-08-03 69 views
3

我见过像这样围绕这么几个问题,但找不到任何最适合我的。我想发生的一连串事件如下:如何从代码隐藏页面打印现有PDF?

  1. 用户点击ASP.NET按钮控制
  2. 此触发该按钮的onclick事件,这是一个函数foo()在C#代码隐藏
  3. FOO()调用其他一些(不重要)函数创建这最终保存到服务器上的磁盘上的PDF。一旦生成PDF该函数返回的路径,PDF
  4. 没有任何其他用户交互,打印对话框中的用户的浏览器打开打印PDF

什么我需要做什么来完成步骤4?理想情况下,它会是这样,我可以在foo中调用(),传递路径PDF,将触发在用户的浏览器的打印对话框(打印PDF,而不是页面的从其中的onclick解雇)。

我认为我可以转发到PDF文档的URL,并在PDF中嵌入一些自动打印它的Javascript,但我宁愿不 - 我不一定要打印PDF它打开的时间(在浏览器中)。任何其他好的方法来做到这一点?

回答

0

我到达的解决方案是这样的:

创建一个新的ASP.NET Web窗体(我叫雷为BinaryData.aspx)作为对PDF的占位符。在后面的代码,唯一的方法应该是Page_Load中,它看起来像:

protected void Page_Load(object sender, System.EventArgs e) 
{ 
    //Set the appropriate ContentType. 
    Response.ContentType = "Application/pdf"; 
    Response.AppendHeader("Pragma", "no-cache"); 
    Response.AppendHeader("Cache-Control", "no-cache"); 
    //Get the physical path to the file. 
    string FilePath = (string)Session["fileLocation"]; 
    if (FilePath != null)   
    { 
     string FileName = Path.GetFileName(FilePath); 

     Response.AppendHeader("Content-Disposition", "attachment; filename="+FileName); 

     //Write the file directly to the HTTP content output stream. 
     Response.WriteFile(FilePath); 
     Response.End(); 
    } 
} 

的PDF在页面通过名为“fileLocation”会话变量传递。所以,我必须设置该变量,然后致电Response.Redirect("BinaryData.aspx")

它不会自动打印,但会触发下载PDF而不离开当前页面(这对我来说已经足够了)。

0

我没有尝试这一点,但它是一个想法:

如果你的查询字符串中嵌入PDF JavaScript的参数,然后嵌入的JavaScript,使打印功能是在JavaScript参数条件。

这样一来,如果你重定向到,例如,yourpdf.pdf?打印,将打印,并且如果它没有打印参数打开,它表现为任何其他正常的PDF会做。

+0

这听起来像它将会在更加复杂的方向 - 它当然可以工作,但我宁愿保持独立的PDF网页的行为。 – 2009-08-03 17:33:40

0

如果你想下去,只要打开它打印出来的路径:

还有就是你能尽快插入,迫使它来打开打印对话框中的PDF作为一个标志PDF已打开。我这样做是很久以前使用传统的ASP的abcpdf组件,代码看起来是这样的:

Set oDoc = Server.CreateObject("ABCpdf4.Doc") 
oDoc.SetInfo oDoc.Root, "/OpenAction", "<< /Type /Action /S /Named /N /Print >>" 

显然,代码将取决于哪个PDF创建工具,使用的是不同的看...

+0

我是否会告诉用户的浏览器在通过调用Response.Redirect(“[url to PDF]”)生成后打开PDF? – 2009-08-03 18:48:26

+0

是的,或者您可以响应.writefile并设置页面的所有Response.ContentType和其他标题以提供PDF。 – Vdex 2009-08-03 19:55:20

1
Response.Clear() 
Response.AddHeader("Content-Disposition", "attachment; filename=myfilename.pdf") 
Response.ContentType = "application/pdf" 
Response.BinaryWrite(ms.ToArray()) 

其中Ms =包含文件一个MemoryStream(您不必将其写入到磁盘之间)。

否则,如果你绝对要对付从硬盘,使用未来:

Response.WriteFile("c:\pathtofile.pdf") 
1

感谢您的回答Vdex。这里是iText/C#版本。

PdfAction action = new PdfAction(); 
action.Put(new PdfName("Type"), new PdfName("Action")); 
action.Put(new PdfName("S"), new PdfName("Named")); 
action.Put(new PdfName("N"), new PdfName("Print")); 

PdfReader reader = new PdfReader(ReportFile.FullFilePath(reportFile.FilePath)); 

PdfStamper stamper = new PdfStamper(reader, Response.OutputStream); 
stamper.Writer.CloseStream = false; 
stamper.Writer.SetOpenAction(action); 
stamper.Close();