.NET:如何在不打开文件的情况下打印文件

时间:2009-06-19 14:06:21

标签: .net file printing

我们有一个基本上存档文件的应用程序,我们为用户提供打印这些文件的可能性。它们可以是.txt,.doc,.pdf,.jpg没什么特别的。 是否有.NET方法将这些文件发送到打印机而不进一步处理它们,即打开它们?

我已经尝试使用StartInfo.Verb =“print”

创建一个进程
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.FileName = fileName;
p.StartInfo.Verb = "print"
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden

p.Start();

它仍会打开我不想要的文件。有人可以帮忙吗?

任何帮助将不胜感激。 托比

6 个答案:

答案 0 :(得分:6)

我的理解是,大多数应用程序会在您打印时打开(甚至是短暂的)。尝试右键单击MS Word文档并点击打印。你会看到Word打开,打印和关闭。

但是,您可能希望将其添加到代码中以保持进程隐藏并在完成时关闭:

p.Start();
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
if (p.HasExited == false)
{
   p.WaitForExit(10000);
}

p.EnableRaisingEvents = true;
p.CloseMainWindow();
p.Close();

答案 1 :(得分:6)

实际上非常非常容易。

使用System.Drawing.Printing.PrintDocument

按照该链接中的示例,或者只使用此处的代码(我摘自我每天都在使用打印自动化的内容)。

例如,打印一个.jpg(顺便说一句,这不会打开任何编辑应用程序;它会在后台打印到打印机)

public void SetupPrintHandler()
{
    PrintDocument printDoc = new PrintDocument();
    printDoc.PrintPage += new PrintPageEventHandler(OnPrintPage);

    printDoc.Print();
}

private void OnPrintPage(object sender, PrintPageEventArgs args)
{
    using (Image image = Image.FromFile(@"C:\file.jpg"))
    {
        Graphics g = args.Graphics;
        g.DrawImage(image, 0, 0);
    }
}

答案 2 :(得分:2)

您如何建议Windows管理打印文件而不将其发送给知道如何处理它的应用程序?

我认为没有办法做到这一点,因为Windows不知道pdf是什么(或doc,甚至是jpg)。< / p>

我担心你对你想要打印的每种格式都有你所拥有的,或者在你的应用程序中包含一个库。

答案 3 :(得分:1)

这是一个在不打开Word并显示文档的情况下打印Word文档的类。虽然我通常使用C#编写代码,但我很久以前就知道用VB.NET编写任何Office自动化代码都是彻头彻尾的愚蠢(C#4.0即将推出的一些功能可能会改变这一点)。

这仅适用于Word,但Excel文档将以类似的方式完成。对于文本文档,您可以非常轻松地使用System.Drawing.Printing。

Imports System.IO 
Imports System.Windows.Forms 
Imports System.Drawing

Namespace rp.OfficeHelpers

    Public Enum PrintStatus
        Success
        FileNotFound
        FailedToOpenDocument
        FailedToPrintDocument
    End Enum

    Public Class Word

        Public Shared Function PrintDocument( DocumentName As String,_ 
                               PrinterName As String ) As PrintStatus 
            Dim wordApp As Microsoft.Office.Interop.Word.Application = _ 
                           new Microsoft.Office.Interop.Word.Application()
            Dim wordDoc As Microsoft.Office.Interop.Word.Document
            Dim copies  As Object = 1
            Dim CurrentPrinter As String = wordApp.ActivePrinter

            If ( Not File.Exists( DocumentName ) )
                Return PrintStatus.FileNotFound    
            End If

            wordApp.Visible = false

            wordApp.ActivePrinter = PrinterName

            ' Document name must be provided as an object, not a string.
            Try 
                wordDoc = wordApp.Documents.Open( CType( DocumentName, Object ) )
            Catch WordError as System.Exception 
                Return PrintStatus.FailedToOpenDocument
            End Try  

            Try 
                wordDoc.PrintOut( Copies := copies, Background:= false )
            Catch WordError as System.Exception 
                Return PrintStatus.FailedToPrintDocument
            End Try  

            wordApp.ActivePrinter = CurrentPrinter

            wordApp.Quit( SaveChanges := false )

            Return PrintStatus.Success        
        End Function

    End Class

End Namespace

答案 4 :(得分:1)

我必须同意其他答案,因为如果不打开它就无法打印出来。

我认为你可以解决这个问题的唯一方法就是你有一个直接的postscript文件和一个直接附加的postscript兼容的打印机。

在这种情况下,您可以将.ps文件转储到LPT端口,打印机将正确处理它。

答案 5 :(得分:0)

某些打印机支持使用命令行LPR将文件发送到打印机。我们有一台复印机可以做到这一点。这真的无法在计算机上打开文件。它将文件发送到打印机,打印机将其解释并打印出来。

LPR -S <Server Name> -P <Printer Name> -o l "C:\Temp\Sample.PDF"

我们使用PostScript和PDF文件取得了巨大成功。不知道它是否适用于其他文件类型;检查打印机文档。

对于最新版本的Windows,您需要启用“LPR端口监视器”。 控制面板&gt;节目和特征&gt;打开或关闭Windows功能&gt; 打印和文件服务/ LPR端口监视器

TechNet LPR Command Line