Вопрос по file, .net – .NET: Как распечатать файлы без их открытия

5

У нас есть приложение, которое в основном архивирует файлы, и мы даем пользователю возможность распечатать эти файлы. Они могут быть .txt, .doc, .pdf, .jpg ничего особенного. Есть ли способ .NET отправить эти файлы на принтер, не обрабатывая их дальше, т.е. открывая их?

Я уже пытался создать процесс с помощью StartInfo.Verb = & quot; print & quot;

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

Вы, вероятно, не хотите использовать слово random в названии, поскольку это подразумевает использование функций, связанных с классом Random. Я бы перефразировал это как & quot; .NET: Как открыть файлы различных типов, не открывая их. & Quot; или что-то типа того. Nathan Koop

Ваш Ответ

6   ответов
1

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

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

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

2

не отправляя его в приложение, которое знает, как с ним работать?

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

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

Я думаю, что вам понадобятся некоторые библиотеки, чтобы помочь вам и реализовать свой собственный код печати для каждого формата ... txt и jpg не будут слишком плохими с самим .NET Framework, но, по крайней мере, вам понадобятся библиотеки для PDF и документ (х?)
Хороший вопрос, спасибо. Есть ли способ сделать это действительно скрытым? Tobias
0

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

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

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

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

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

1

Вот класс, который печатает документ 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
Это хорошее различие, Джон. Мое употребление слова "открыть" был небрежным
Это хорошее различие, но в случае с файлом Excel я могу сделать что-то подобное.
Это может неshow документ, но он, безусловно, открывает его. Он также не будет работать в многопоточной среде, поскольку API-интерфейсы Office предназначены для автоматизации настольных систем (не говоря уже о проблемах лицензирования). Не знаю, имеет ли это значение для ФП, но просто чтобы записать это в протокол.
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);
    }
}
Легко для "JPEG". Но извините, не так просто для PDF или более сложных типов документов.
Перевод Babelfish комментария Тобиаса: «Это выглядит хорошо. Во всяком случае для JPEG & quot;
Das sieht gut aus. Jedenfalls f & # xFC; r jpegs. Tobias
извините, случайно перешел на немецкий ... Tobias
Если вы посмотрите на ссылку, вы увидите несколько примеров того, как печатать документы других типов, используя один и тот же класс. Что, по вашему вопросу, именно то, что вы хотели, нет?
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();

Похожие вопросы