Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET:如何在不打开文件的情况下打印文件_.net_File_Printing - Fatal编程技术网

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

.NET:如何在不打开文件的情况下打印文件,.net,file,printing,.net,File,Printing,我们有一个基本上存档文件的应用程序,我们给用户打印这些文件的可能性。它们可以是.txt、.doc、.pdf、.jpg,没什么特别的。 有没有一种.NET方法可以将这些文件发送到打印机而不必进一步处理(即打开它们) 我已经尝试使用StartInfo.Verb=“print”创建一个进程 它仍然会打开我不想要的文件。有人能帮忙吗 任何帮助都将不胜感激。 Tobi您建议Windows如何在不将文件发送到知道如何处理文件的应用程序的情况下打印文件 我认为没有办法做到这一点,因为Windows不知道什么是

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

我已经尝试使用StartInfo.Verb=“print”创建一个进程

它仍然会打开我不想要的文件。有人能帮忙吗

任何帮助都将不胜感激。
Tobi

您建议Windows如何在不将文件发送到知道如何处理文件的应用程序的情况下打印文件

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


我担心你要么坚持现有的格式,要么在应用程序中为希望打印的每种格式包含一个库。

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

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

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

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

这是一个打印Word文档而不打开Word并显示文档的类。虽然我通常用C#编写代码,但我很久以前就知道,用VB.NET以外的任何东西编写任何办公自动化软件都是彻头彻尾的愚蠢(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

这其实非常非常简单

使用

按照链接中的例子,或者只使用这里的代码(我从每天使用的打印自动化中摘录)

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


我不得不同意其他的答案,你不能不打开它就打印出来

我认为您可能能够绕过此问题的唯一方法是使用一个直接的postscript文件和一个直接连接的postscript兼容打印机


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

某些打印机支持使用命令行
LPR
将文件发送到打印机。我们有一台复印机。这实际上根本无法打开计算机上的文件。它将文件发送到打印机,打印机对其进行解释并打印

LPR -S <Server Name> -P <Printer Name> -o l "C:\Temp\Sample.PDF"
LPR-S-P-ol“C:\Temp\Sample.PDF”
我们用PostScript和PDF文件成功地实现了这一点。不知道它是否适用于其他文件类型;检查打印机文档

对于最新版本的Windows,您需要启用“LPR端口监视器”。 控制面板>程序和功能>打开或关闭Windows功能> 打印和文档服务/LPR端口监视器


说得好,谢谢。那么,有没有一种方法可以真正做到这一点呢?我想你需要一些库来帮助你,并为每种格式实现你自己的打印代码。。。txt和jpg对于.NET Framework本身来说不会太糟糕,但至少您需要PDF和doc(x?)的库。您可能不希望在标题中使用random一词,因为它意味着使用与random类相关联的函数。我会把它改成“.NET:如何在不打开各种文件类型的情况下打开它们”之类的。Jedenfalls für JPEG。Tobias评论的Babelfish翻译:“看起来不错。无论如何,对于JPEG”,如果您查看链接,您将看到几个如何打印其他类型文档的示例,所有这些都使用同一类。根据你的问题,这正是你想要的,不是吗?对“JPEG”来说很简单。但是很抱歉,对于PDF或更复杂类型的文档没有那么容易。这可能不会显示文档,但肯定会打开它。它也不能在多线程环境中工作,因为Office API用于桌面自动化(更不用说许可问题了)。我不知道这对OP是否重要,但只是为了记录在案。这是一个很好的区别,约翰。我对“open”这个词的使用是草率的。这是一个很好的区别,但在Excel文件中,我怎么能做同样的事情呢。
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);
    }
}
LPR -S <Server Name> -P <Printer Name> -o l "C:\Temp\Sample.PDF"