Как отправить документ на принтер и распечатать его?

Вот основная предпосылка:

Мой пользователь нажимает на некоторые вещицы, и файл PDF выплевывается на его рабочий стол. Есть ли способ отправить этот файл в очередь на принтер и распечатать его на локально подключенном принтере?

string filePath = "filepathisalreadysethere"; SendToPrinter(filePath); //Something like this? 

Он будет делать этот процесс много раз. Для каждого учащегося в classе он должен распечатать небольшую карточку отчета. Поэтому я создаю PDF-файл для каждого студента, и я бы хотел автоматизировать процесс печати вместо того, чтобы пользователь мог создавать PDF-файлы, печатать, создавать PDF-файлы, печатать, создавать pdf-файлы.

Любые предложения о том, как подойти к этому? Я работаю в Windows XP с Windows Forms .NET 4.

Я нашел этот вопрос StackOverflow, в котором принятый ответ подсказывает:

После того, как вы создали свои файлы, вы можете распечатать их через командную строку (вы можете использовать class Command, найденный в пространстве имен System.Diagnostics)

Как бы я это сделал?

Вы можете сообщить Acrobat Reader, чтобы напечатать файл, используя (как уже упоминалось, здесь) глагол «print». После этого вам также потребуется закрыть программу Acrobat Reader:

 private void SendToPrinter() { ProcessStartInfo info = new ProcessStartInfo(); info.Verb = "print"; info.FileName = @"c:\output.pdf"; info.CreateNoWindow = true; info.WindowStyle = ProcessWindowStyle.Hidden; Process p = new Process(); p.StartInfo = info; p.Start(); p.WaitForInputIdle(); System.Threading.Thread.Sleep(3000); if (false == p.CloseMainWindow()) p.Kill(); } 

Это откроет Acrobat Reader и предложит отправить PDF на принтер по умолчанию, а затем выключит Acrobat через три секунды.

Если вы готовы отправить другие продукты с вашим приложением, вы можете использовать GhostScript (бесплатно) или принтер в командной строке PDF, например http://www.commandlinepdf.com/ (коммерческий).

Примечание: код примера открывает PDF-файл в приложении, зарегистрированном для печати PDF-файлов , которое является Adobe Acrobat Reader на большинстве компьютеров людей. Однако возможно, что они используют другой просмотрщик PDF, такой как Foxit ( http://www.foxitsoftware.com/pdf/reader/ ). Однако пример кода должен работать.

Добавляя к этому новый ответ, поскольку вопрос о печати PDF-файлов в .net существует уже давно, и большинство ответов предшествует библиотеке Google Pdfium, которая теперь имеет обертку .net. Для меня я сам сам изучал эту проблему и старался делать взломанные решения, такие как нерест Acrobat или других читателей PDF, или работа в коммерческих библиотеках, которые являются дорогостоящими и не имеют очень совместимых условий лицензирования. Но библиотека Google Pdfium и обертка PdfiumViewer .net – это Open Source, поэтому это отличное решение для многих разработчиков, включая меня. PdfiumViewer лицензируется по лицензии Apache 2.0.

Вы можете получить пакет NuGet здесь:

https://www.nuget.org/packages/PdfiumViewer/

и здесь вы можете найти исходный код:

https://github.com/pvginkel/PdfiumViewer

Вот простой код, который будет тихо печатать любое количество копий файла PDF из его имени файла. Вы также можете загружать PDF-файлы из streamа (как это обычно делается), и вы можете легко понять это, глядя на код или примеры. Существует также представление в формате PDF WinForm, чтобы вы могли также отображать PDF-файлы в виде или делать предварительный просмотр на них. Для нас я просто нуждался в возможности тихо распечатывать файл PDF на конкретный принтер по требованию.

 public bool PrintPDF( string printer, string paperName, string filename, int copies) { try { // Create the printer settings for our printer var printerSettings = new PrinterSettings { PrinterName = printer, Copies = (short)copies, }; // Create our page settings for the paper size selected var pageSettings = new PageSettings(printerSettings) { Margins = new Margins(0, 0, 0, 0), }; foreach (PaperSize paperSize in printerSettings.PaperSizes) { if (paperSize.PaperName == paperName) { pageSettings.PaperSize = paperSize; break; } } // Now print the PDF document using (var document = PdfDocument.Load(filename)) { using (var printDocument = document.CreatePrintDocument()) { printDocument.PrinterSettings = printerSettings; printDocument.DefaultPageSettings = pageSettings; printDocument.PrintController = new StandardPrintController(); printDocument.Print(); } } return true; } catch { return false; } } 

Я знаю, что тег говорит Windows Forms … но, если кто-то заинтересован в методе WPF приложения, System.Printing работает как шарм.

 var file = File.ReadAllBytes(pdfFilePath); var printQueue = LocalPrintServer.GetDefaultPrintQueue(); using (var job = printQueue.AddJob()) using (var stream = job.JobStream) { stream.Write(file, 0, file.Length); } 

Не забудьте включить ссылку System.Printing , если она еще не включена. Теперь этот метод не очень хорошо работает с ASP.NET или Windows Service . Он не должен использоваться с Windows Forms , так как он имеет System.Drawing.Printing . У меня нет ни одной проблемы с моей печатью в формате PDF с использованием вышеуказанного кода.

Однако я должен упомянуть, что если ваш принтер не поддерживает формат Direct Print for PDF, вам не повезло с этим методом.

Это слегка измененное решение. Процесс будет убит, если он простаивает не менее 1 секунды. Возможно, вы должны добавить время в X секунд и вызвать функцию из отдельного streamа.

 private void SendToPrinter() { ProcessStartInfo info = new ProcessStartInfo(); info.Verb = "print"; info.FileName = @"c:\output.pdf"; info.CreateNoWindow = true; info.WindowStyle = ProcessWindowStyle.Hidden; Process p = new Process(); p.StartInfo = info; p.Start(); long ticks = -1; while (ticks != p.TotalProcessorTime.Ticks) { ticks = p.TotalProcessorTime.Ticks; Thread.Sleep(1000); } if (false == p.CloseMainWindow()) p.Kill(); } 

System.Diagnostics.Process.Start можно использовать для печати документа. Установите UseShellExecute в True и установите для Verb значение «print».

Следующий fragment кода – это адаптация кода Kendall Bennett для печати pdf-файлов с использованием библиотеки PdfiumViewer. Основное различие заключается в том, что используется Stream, а не файл.

public bool PrintPDF (строковый принтер, строка paperName, int копии, Stream stream) {try {// Создаем параметры принтера для нашего принтера var printerSettings = new PrinterSettings {PrinterName = printer, Copies = (short) копии,};

  // Create our page settings for the paper size selected var pageSettings = new PageSettings(printerSettings) { Margins = new Margins(0, 0, 0, 0), }; foreach (PaperSize paperSize in printerSettings.PaperSizes) { if (paperSize.PaperName == paperName) { pageSettings.PaperSize = paperSize; break; } } // Now print the PDF document using (var document = PdfiumViewer.PdfDocument.Load(stream)) { using (var printDocument = document.CreatePrintDocument()) { printDocument.PrinterSettings = printerSettings; printDocument.DefaultPageSettings = pageSettings; printDocument.PrintController = new StandardPrintController(); printDocument.Print(); } } return true; } catch (System.Exception e) { return false; } } 

В моем случае я создаю файл PDF, используя библиотеку под названием PdfSharp, а затем сохраняю документ в Stream следующим образом:

  PdfDocument pdf = PdfGenerator.GeneratePdf(printRequest.html, PageSize.A4); pdf.AddPage(); MemoryStream stream = new MemoryStream(); pdf.Save(stream); MemoryStream stream2 = new MemoryStream(stream.ToArray()); 

Одна вещь, которую я хочу отметить, которая может быть полезной для других разработчиков, заключается в том, что мне пришлось установить 32-разрядную версию родной dll pdfuim для того, чтобы печать работала, даже если я использую Windows 10 64 бит. Я установил следующие два пакета NuGet, используя диспетчер пакетов NuGet в Visual Studio:

  • PdfiumViewer
  • PdfiumViewer.Native.x86.v8-РФ

Вы можете попробовать с GhostScript, как в этом сообщении:

Как распечатать PDF на сетевом принтере по умолчанию с помощью команды оболочки GhostScript (gswin32c.exe)

Простой способ:

 var pi=new ProcessStartInfo("C:\file.docx"); pi.UseShellExecute = true; pi.Verb = "print"; var process = System.Diagnostics.Process.Start(pi); 

это поздний ответ, но вы также можете использовать метод File.Copy в пространстве имен System.IO, чтобы отправить файл на принтер:

 System.IO.File.Copy(filename, printerName); 

Это прекрасно работает

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

 public void PrintAllFiles() { System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo(); info.Verb = "print"; System.Diagnostics.Process p = new System.Diagnostics.Process(); //Load Files in Selected Folder string[] allFiles = System.IO.Directory.GetFiles(Directory); foreach (string file in allFiles) { info.FileName = @file; info.CreateNoWindow = true; info.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; p.StartInfo = info; p.Start(); } //p.Kill(); Can Create A Kill Statement Here... but I found I don't need one MessageBox.Show("Print Complete"); } 

Он сугубо циклически проходит через каждый файл в данной переменной каталога Directory -> для меня это было @ “C: \ Users \ Owner \ Documents \ SalesVaultTesting \” и отпечатывает эти файлы на вашем принтере по умолчанию .

  • icons загрузочных бутлетов Twitter отсутствуют в печати
  • Печать цветов фона в Chrome
  • Как показывать только определенные части с помощью CSS для печати?
  • Необходимо удалить значения href при печати в Chrome.
  • Печать WebBrowser без предварительного просмотра, т.е. печать с одним щелчком
  • Печать документа WPF FlowDocument
  • Хорошие правила для настройки print css?
  • Как распечатать PDF на сетевом принтере по умолчанию с помощью команды оболочки GhostScript (gswin32c.exe)
  • Как я могу использовать JavaPOS для печати reciepts с помощью принтера Epson?
  • Как создать метод println / print для пользовательского classа
  • Удалить верхний и нижний колонтитулы из windows .print ()
  • Давайте будем гением компьютера.