如何从代码后台页面打印现有的PDF文件?

3

我在SO上看到过一些类似的问题,但没有找到适合我的答案。我希望发生的事件顺序如下:

  1. 用户单击ASP.NET按钮控件
  2. 这将触发该按钮的onclick事件,其中包含C#后台代码中的函数foo()
  3. foo()调用一些其他不重要的函数,该函数创建一个PDF,最终保存到服务器的磁盘上。该函数返回PDF的路径。
  4. PDF生成后,无需其他用户交互,打印对话框框会在用户的浏览器中打开,以打印该PDF。

为了完成第四步,我需要做什么?理想情况下,它应该是我可以在foo()中调用的内容,同时传入PDF的路径,以触发用户浏览器中的打印对话框(打印PDF而不是从onclick触发的页面)。

我认为我可能能够转发到PDF文档的URL,并在PDF中嵌入一些JavaScript来自动打印它,但我宁愿不这样做-我不一定每次打开PDF(在浏览器中)都希望打印它。有没有其他好的方法来实现呢?

5个回答

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

如果 ms 是包含文件的 Memory Stream(在中间无需将其写入磁盘),则使用以下代码:

否则,如果你必须处理来自硬盘的文件,请使用以下代码:

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

我曾经使用过类似的东西,效果非常好,而且没有额外的文件也是一个优点。请确保使用上面显示的系统路径而不是本地Web路径。 - corymathews

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();

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的下载而不离开当前页面(这对我来说已经足够好了)。


0

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

如果您可以在嵌入PDF的JavaScript中读取查询字符串参数,那么嵌入JavaScript,并使打印函数基于JavaScript参数进行条件判断。

这样,如果您重定向到例如yourpdf.pdf?print,则会打印,如果没有打印参数打开它,则它的行为就像任何其他普通的PDF一样。


这听起来似乎朝着更加复杂的方向发展 - 当然可以实现,但我更愿意让PDF独立于网页的行为。 - Matt Ball

0
如果您想在打开PDF文件时立即进行打印,可以采用以下方法:
PDF文件中有一个标志,可以强制在打开PDF文件时立即打开打印对话框。我很久以前使用经典ASP中的abcpdf组件实现了这个功能,代码大致如下:
Set oDoc = Server.CreateObject("ABCpdf4.Doc")
oDoc.SetInfo oDoc.Root, "/OpenAction", "<< /Type /Action /S /Named /N /Print >>"

显然,代码的外观取决于您使用的PDF创建工具...


我可以通过调用Response.Redirect("[PDF的URL]")来告诉用户的浏览器在生成PDF后打开它吗? - Matt Ball
是的,你可以使用response.writefile来设置所有页面的Response.ContentType和其他头文件以提供PDF文档。 - Vdex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接