【问题标题】:Server side printing服务器端打印
【发布时间】:2013-04-04 13:41:49
【问题描述】:

我一直在研究一种从我的网络服务器提交打印作业的方法。
我想要做的是将一个动作呈现给 pdf,然后将 pdf 提交到服务器上的默认打印机。

这里的代码几乎可以工作

    public JsonResult Print(String JobName, String TargetAction, String TargetController)
    {
        var job = LocalPrintServer.GetDefaultPrintQueue().AddJob(JobName);
        var printStream = job.JobStream;
        try
        {
            var pdfResult = new UrlAsPdf(Url.Action(TargetAction, TargetController, ControllerContext.RouteData));
            var binary = pdfResult.BuildPdf(this.ControllerContext);


            printStream.Write(binary, 0, binary.Length);
            printStream.Close();
        }
        catch (Exception e)
        {
            return Json(new { Success = false, Message = e.Message });
        }
        return Json(new { Success = true });
    }

但只要调用 .Close,该作业就会从打印机队列中删除。我正在使用 Rotativa 生成 pdf。

根据此处http://msdn.microsoft.com/en-us/library/ms552913.aspx 的示例,这似乎是正确的 但我怀疑在打印机假脱机完成之前删除数据存在问题。

有人有建议或可行的解决方案吗?

【问题讨论】:

  • 你能解释一下如何打印视图吗?我有一个类似的场景,我需要使用默认打印机打印我的 MVC 视图并且不显示打印机设置窗口。

标签: c# asp.net asp.net-mvc-3 c#-4.0


【解决方案1】:

您的流似乎是 PDF,但链接中的规范表明您需要将特定于设备的数据写入 job.JobStream(EMF 或 XPS)。

要转换为 XPS,请查看此Stack Overflow post

另外,this post 建议最简单的打印方法是通过带有“打印”动词的外壳,例如:

ProcessStartInfo psi = new ProcessStartInfo("pdfFile.pdf") {Verb = "Print"};
Process.Start(psi);

请注意,Acrobat Reader 也可以print files from the commandline

【讨论】:

  • 感谢您缺少的知识。我现在正在使用 pdftron 使用他们的 api 打印 pdf :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
  • 2016-10-05
相关资源
最近更新 更多