如何从代码隐藏页面打印现有PDF?

时间:2009-08-03 17:26:31

标签: c# asp.net pdf printing

我在SO周围看过几个这样的问题,但找不到任何适合我的东西。我想发生的一系列事件如下:

  1. 用户单击ASP.NET按钮控件
  2. 这会触发该按钮的onclick事件,这是C#codebehind中的函数foo()
  3. foo()调用一些其他(不重要的)函数,该函数创建一个最终保存到服务器磁盘的PDF。该函数返回PDF的路径
  4. 在没有任何其他用户交互的情况下,生成PDF后,将在用户的浏览器中打开打印对话框以打印该PDF
  5. 完成第4步需要做什么?理想情况下,我可以在foo()中调用它,将路径传递给PDF,这将触发用户浏览器中的打印对话框(打印PDF而不是onclick触发的页面)。 / p>

    我认为我可以转发到PDF文档的URL,并在PDF中嵌入一些自动打印它的Javascript,但我不愿意 - 我不一定每次都要打印PDF它已打开(在浏览器中)。还有其他好方法吗?

5 个答案:

答案 0 :(得分:1)

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

其中ms =包含文件的内存流(您不必将其写入中间的磁盘。)

否则,如果您必须处理来自硬盘的问题,请使用:

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

答案 1 :(得分: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();

答案 2 :(得分:0)

我没试过,但这是一个想法:

如果您可以在PDF中嵌入的javascript中读取查询字符串参数,则嵌入javascript,并使打印函数以javascript参数为条件。

这样,如果您重定向到例如yourpdf.pdf?print,它将打印,如果在没有print参数的情况下打开它,它的行为就像任何其他正常的PDF一样。

答案 3 :(得分:0)

如果您想在打开它的同时沿着打印道路前进:

有一个标志可以插入到PDF中,一旦打开PDF,就会强制它打开打印对话框。我在很久以前使用经典ASP中的abcpdf组件做了这个,代码看起来像:

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

显然,根据您使用的PDF创建工具,代码看起来会有所不同......

答案 4 :(得分: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”的Session变量传递到页面。所以,我必须设置该变量,然后调用Response.Redirect("BinaryData.aspx")

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