【问题标题】:.NET: How to print files w/o opening them.NET:如何在不打开文件的情况下打印文件
【发布时间】:2010-11-04 07:48:27
【问题描述】:

我们有一个基本上归档文件的应用程序,我们让用户可以打印这些文件。它们可以是 .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();

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

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

【问题讨论】:

  • 您可能不希望标题中出现随机一词,因为它暗示使用与 Random 类关联的函数。我会将它改写为“.NET:如何在不打开它们的情况下打开各种文件类型”。或类似的东西。

标签: .net file printing


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    其实非常非常简单。

    使用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);
        }
    }
    

    【讨论】:

    • Das sieht gut aus. Jedenfalls für jpegs。
    • Tobias 评论的 Babelfish 翻译:“看起来不错。无论如何都是 jpeg”
    • 如果您查看链接,您将看到几个如何打印其他类型文档的示例,它们都使用相同的类。根据您的问题,哪一个正是您想要的,不是吗?
    • “JPEG”很容易。但是很抱歉,对于 PDF 或更复杂类型的文档来说,这并不容易。
    【解决方案3】:

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

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

    恐怕您会被现有的东西所困扰,或者为您希望打印的每种格式在应用程序中包含一个库。

    【讨论】:

    • 好点,谢谢。那么有没有办法做到真正隐藏呢?
    • 我认为您将需要一些库来帮助您并为每种格式实现您自己的打印代码... txt 和 jpg 对于 .NET Framework 本身来说不会太糟糕,但在至少你需要 PDF 和 doc(x?) 的库
    【解决方案4】:

    这是一个无需打开 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
    

    【讨论】:

    • 这可能不会显示文档,但它肯定会打开它。它也不能在多线程环境中工作,因为 Office API 是用于桌面自动化的(更不用说许可问题了)。不知道这对 OP 是否重要,但只是为了将其记录在案。
    • 这是一个很好的区别,约翰。我对“开放”这个词的使用是草率的。
    • 这是一个很好的区别,但在 Excel 文件的情况下,我怎么能做同样的事情。
    【解决方案5】:

    我必须同意其他答案,因为您必须打开它才能打印它。

    我认为您可能能够解决此问题的唯一方法是,如果您有一个直接的 postscript 文件,以及一个直接连接的 postscript 兼容打印机。

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

    【讨论】:

      【解决方案6】:

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

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

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

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

      TechNet LPR Command Line

      【讨论】:

        猜你喜欢
        • 2020-11-09
        • 1970-01-01
        • 2023-03-11
        • 2015-08-08
        • 2017-07-18
        • 1970-01-01
        • 1970-01-01
        • 2015-08-06
        • 2020-08-27
        相关资源
        最近更新 更多