我们有一个基本上存档文件的应用程序,我们为用户提供打印这些文件的可能性。它们可以是.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();
它仍会打开我不想要的文件。有人可以帮忙吗?
任何帮助将不胜感激。 托比
答案 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端口监视器