Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I send a file document to the printer and have it print?

Here's the basic premise:

My user clicks some gizmos and a PDF file is spit out to his desktop. Is there some way for me to send this file to the printer queue and have it print to the locally connected printer?

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

He will do this process many times. For each student in a classroom he has to print a small report card. So I generate a PDF for each student, and I'd like to automate the printing process instead of having the user generated pdf, print, generate pdf, print, generate pdf, print.

Any suggestions on how to approach this? I'm running on Windows XP with Windows Forms .NET 4.

I've found this StackOverflow question where the accepted answer suggests:

Once you have created your files, you can print them via a command line (you can using the Command class found in the System.Diagnostics namespace for that)

How would I accomplish this?

like image 756
Only Bolivian Here Avatar asked May 23 '11 22:05

Only Bolivian Here


People also ask

Where can I send a file to be printed?

The UPS Store offers a wide variety of printing and finishing services, including electronic file access (e.g., emails, CDs, USB drives), color and black-and-white digital printing, black-and-white copies, binding, collating and laminating.

Can I email documents to be printed?

Email message attachments can be printed without opening the file. Attachments can be printed from an open message window or from the Reading Pane. If a message has multiple attachments, you can choose to print one or all of the attachments.


2 Answers

Adding a new answer to this as the question of printing PDF's in .net has been around for a long time and most of the answers pre-date the Google Pdfium library, which now has a .net wrapper. For me I was researching this problem myself and kept coming up blank, trying to do hacky solutions like spawning Acrobat or other PDF readers, or running into commercial libraries that are expensive and have not very compatible licensing terms. But the Google Pdfium library and the PdfiumViewer .net wrapper are Open Source so are a great solution for a lot of developers, myself included. PdfiumViewer is licensed under the Apache 2.0 license.

You can get the NuGet package here:

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

and you can find the source code here:

https://github.com/pvginkel/PdfiumViewer

Here is some simple code that will silently print any number of copies of a PDF file from it's filename. You can load PDF's from a stream also (which is how we normally do it), and you can easily figure that out looking at the code or examples. There is also a WinForm PDF file view so you can also render the PDF files into a view or do print preview on them. For us I simply needed a way to silently print the PDF file to a specific printer on demand.

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;     } } 
like image 184
Kendall Bennett Avatar answered Sep 21 '22 07:09

Kendall Bennett


You can tell Acrobat Reader to print the file using (as someone's already mentioned here) the 'print' verb. You will need to close Acrobat Reader programmatically after that, too:

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

This opens Acrobat Reader and tells it to send the PDF to the default printer, and then shuts down Acrobat after three seconds.

If you are willing to ship other products with your application then you could use GhostScript (free), or a command-line PDF printer such as http://www.commandlinepdf.com/ (commercial).

Note: the sample code opens the PDF in the application current registered to print PDFs, which is the Adobe Acrobat Reader on most people's machines. However, it is possible that they use a different PDF viewer such as Foxit (http://www.foxitsoftware.com/pdf/reader/). The sample code should still work, though.

like image 21
Edwin Groenendaal Avatar answered Sep 20 '22 07:09

Edwin Groenendaal