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

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

Здесь основное предположение:

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

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

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

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

Я нашел этот qaru.site/info/114124/... вопрос, на котором предлагается принятый ответ:

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

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

4b9b3361

Ответ 1

Вы можете сообщить 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/). Код примера все равно должен работать.

Ответ 2

Я знаю, что тег говорит 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, вам не повезло с этим методом.

Ответ 3

Добавление нового ответа на этот вопрос, поскольку вопрос о печати 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 из него filename. Вы также можете загружать PDF из потока (как это обычно делается), и вы можете легко понять это, глядя на код или примеры. Существует также представление в формате 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;
    }
}

Ответ 4

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

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();
}

Ответ 5

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

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

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

Ответ 6

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

Ответ 8

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

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 \" и отпечатывает эти файлы на вашем принтере по умолчанию.

Ответ 9

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

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