.NET: Как распечатать файлы без их открытия - PullRequest
5 голосов
/ 19 июня 2009

У нас есть приложение, которое в основном архивирует файлы, и мы даем пользователю возможность распечатать эти файлы. Они могут быть .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();

Он по-прежнему открывает файл, который мне не нужен. Может кто-нибудь помочь?

Любая помощь будет оценена. Tobi

Ответы [ 6 ]

6 голосов
/ 19 июня 2009

Это на самом деле очень, очень легко.

Использовать 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);
    }
}
6 голосов
/ 19 июня 2009

Насколько я понимаю, большинство приложений открывается (даже на короткое время) при печати. Попробуйте щелкнуть правой кнопкой мыши документ 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 голосов
/ 19 июня 2009

Как вы предлагаете Windows распечатать файл, не отправляя его в приложение, которое знает, как с ним работать?

Я не думаю, что есть способ сделать это просто потому, что Windows не знает, что такое pdf (или doc, или даже jpg).

Боюсь, вы застряли либо с тем, что у вас есть, либо с включением библиотеки в свое приложение для каждого формата, который вы хотите напечатать.

1 голос
/ 19 июня 2009

Я должен согласиться с другими ответами в том, что вы не можете распечатать его, не открывая его.

Единственный способ, которым, я думаю, вы сможете обойти это, - это если у вас есть прямой файл postscript и напрямую подключенный postscript-совместимый принтер.

В этом случае вы можете просто выгрузить файл .ps в порт LPT, и принтер обработает его правильно.

1 голос
/ 19 июня 2009

Вот класс, который печатает документ Word, не открывая Word и не показывая документ. Хотя я обычно пишу код на C #, я давно узнал, что кодировать любую автоматизацию Office с помощью чего-либо, кроме 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
0 голосов
/ 16 сентября 2015

Некоторые принтеры поддерживают отправку файла на принтер с помощью командной строки LPR. У нас есть копир, который делает это. Это действительно не открывает файл на компьютере вообще. Он отправляет файл на принтер, и принтер интерпретирует его и печатает.

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

Мы делаем это с файлами PostScript и PDF с большим успехом. Не знаю, работает ли он для других типов файлов; проверьте документацию к принтеру.

Для последних версий Windows вам необходимо включить «LPR Port Monitor». Панель управления> Программы и компоненты> Включить или выключить функции Windows> Службы печати и документов / LPR Port Monitor

Командная строка TechNet LPR

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...