0

我一直在研究一种从我的网络服务器提交打印作业的方法。
我想要做的是向 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似乎是正确的 但我怀疑在打印机假脱机完成之前删除数据存在问题。

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

4

1 回答 1

1

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

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

或者,这篇文章建议最简单的打印方法是通过带有“打印”动词的外壳,例如:

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

请注意,Acrobat Reader 也可以从命令行打印文件

于 2013-04-12T06:51:38.943 回答