Comment puis-je envoyer un document à l’imprimante et l’imprimer?

Voici le principe de base:

Mon utilisateur clique sur certains gadgets et un fichier PDF est recraché sur son bureau. Existe-t-il un moyen d’envoyer ce fichier dans la queue d’impression et de l’imprimer sur l’imprimante connectée localement?

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

Il fera ce processus plusieurs fois. Pour chaque élève d’une classe, il doit imprimer un petit bulletin. Donc, je génère un PDF pour chaque étudiant et je voudrais automatiser le processus d’impression au lieu de générer des fichiers PDF, imprimer, générer des fichiers PDF, imprimer, générer des fichiers PDF, imprimer.

Des suggestions sur la manière d’aborder cette question? J’utilise Windows XP avec Windows Forms .NET 4.

J’ai trouvé cette question StackOverflow où la réponse acceptée suggère:

Une fois que vous avez créé vos fichiers, vous pouvez les imprimer via une ligne de commande (vous pouvez utiliser la classe de commande trouvée dans l’espace de noms System.Diagnostics pour cela)

Comment pourrais-je accomplir cela?

Vous pouvez indiquer à Acrobat Reader d’imprimer le fichier en utilisant (comme quelqu’un l’a déjà mentionné ici) le verbe «imprimer». Vous devrez également fermer Acrobat Reader par programmation après cela:

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

Cela ouvre Acrobat Reader et lui indique d’envoyer le PDF à l’imprimante par défaut, puis ferme Acrobat après trois secondes.

Si vous souhaitez expédier d’autres produits avec votre application, vous pouvez utiliser GhostScript (gratuit) ou une imprimante PDF de ligne de commande telle que http://www.commandlinepdf.com/ (commerciale).

Remarque: l’exemple de code ouvre le fichier PDF dans l’application actuellement enregistrée pour imprimer les fichiers PDF , qui est le lecteur Adobe Acrobat sur la plupart des ordinateurs. Cependant, il est possible qu’ils utilisent un lecteur PDF différent tel que Foxit ( http://www.foxitsoftware.com/pdf/reader/ ). L’exemple de code devrait toujours fonctionner, cependant.

L’ajout d’une nouvelle réponse à la question de l’impression de fichiers PDF dans .net existe depuis longtemps et la plupart des réponses datent d’avant la bibliothèque Google Pdfium, qui dispose désormais d’un wrapper .net. Pour moi, je cherchais moi-même ce problème et continuais à me débrouiller, essayant de faire des solutions de piratage telles que la création d’Acrobat ou d’autres lecteurs PDF, ou de courir dans des bibliothèques commerciales coûteuses et avec des termes de licence peu compatibles. Mais la bibliothèque Google Pdfium et le wrapper PdfiumViewer .net sont Open Source, ce qui en fait une excellente solution pour beaucoup de développeurs, y compris moi-même. PdfiumViewer est sous licence Apache 2.0.

Vous pouvez obtenir le package NuGet ici:

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

et vous pouvez trouver le code source ici:

https://github.com/pvginkel/PdfiumViewer

Voici un code simple qui imprimera en silence n’importe quel nombre de copies d’un fichier PDF à partir de son nom de fichier. Vous pouvez également charger des fichiers PDF depuis un stream (ce que nous faisons normalement), et vous pouvez facilement comprendre cela en regardant le code ou des exemples. Il existe également une vue de fichier PDF WinForm pour que vous puissiez également afficher les fichiers PDF dans une vue ou effectuer un aperçu avant impression. Pour nous, j’avais simplement besoin d’un moyen d’imprimer en silence le fichier PDF sur une imprimante spécifique à la demande.

 public bool PrintPDF( ssortingng printer, ssortingng paperName, ssortingng 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; } } 

Je sais que le tag dit Windows Forms … mais, si quelqu’un est intéressé par une méthode d’application WPF , System.Printing fonctionne comme un charme.

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

N’oubliez pas d’inclure la référence System.Printing , si elle n’est pas déjà incluse. Maintenant, cette méthode ne fonctionne pas bien avec ASP.NET ou Windows Service . Il ne doit pas être utilisé avec Windows Forms , car il a System.Drawing.Printing . Je n’ai pas un seul problème avec mon impression PDF en utilisant le code ci-dessus.

Je devrais mentionner toutefois que si votre imprimante ne prend pas en charge l’impression directe pour le format de fichier PDF, vous n’avez pas de chance avec cette méthode.

C’est une solution légèrement modifiée. Le processus sera tué quand il était inactif pendant au moins 1 seconde. Vous devriez peut-être append une durée de X secondes et appeler la fonction à partir d’un thread séparé.

 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 peut être utilisé pour imprimer un document. Définissez UseShellExecute sur True et définissez le verbe sur «print».

L’extrait de code suivant est une adaptation du code de Kendall Bennett pour l’impression de fichiers pdf à l’aide de la bibliothèque PdfiumViewer. La principale différence est qu’un stream est utilisé plutôt qu’un fichier.

bool public PrintPDF (imprimante de chaîne, ssortingng paperName, copies int, stream Stream) {try {// Crée les parameters de l’imprimante pour notre imprimante var printerSettings = new PrinterSettings {PrinterName = printer, Copies = (courtes) 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 = 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; } } 

Dans mon cas, je génère le fichier PDF en utilisant une bibliothèque appelée PdfSharp, puis en enregistrant le document dans un stream comme ceci:

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

Une chose que je veux souligner, qui pourrait être utile aux autres développeurs, est que je devais installer la version 32 bits de la DLL native pdfuim pour que l’impression fonctionne même si j’utilise Windows 10 64 bits. J’ai installé les deux packages NuGet suivants à l’aide du gestionnaire de packages NuGet dans Visual Studio:

  • PdfiumViewer
  • PdfiumViewer.Native.x86.v8-xfa

Vous pouvez essayer avec GhostScript comme dans cet article:

Comment imprimer un fichier PDF sur une imprimante réseau par défaut à l’aide de la commande shell GhostScript (gswin32c.exe)

Le moyen facile:

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

il s’agit d’une réponse tardive, mais vous pouvez également utiliser la méthode File.Copy de l’espace de noms System.IO pour envoyer un fichier à l’imprimante:

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

Cela fonctionne bien

Je sais qu’Edwin y a répondu ci-dessus mais que son seul document est imprimé. J’utilise ce code pour imprimer tous les fichiers d’un répertoire donné.

 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 ssortingng[] allFiles = System.IO.Directory.GetFiles(Directory); foreach (ssortingng 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"); } 

Il parcourt essentiellement chaque fichier de la variable de répertoire donnée Directory -> pour moi c’était @ “C: \ Users \ Owner \ Documents \ SalesVaultTesting \” et imprime ces fichiers sur votre imprimante par défaut .

Vous pouvez utiliser la méthode DevExpress PdfDocumentProcessor.Print (PdfPrinterSettings) .

 public void Print(ssortingng pdfFilePath) { if (!File.Exists(pdfFilePath)) throw new FileNotFoundException("No such file exists!", pdfFilePath); // Create a Pdf Document Processor instance and load a PDF into it. PdfDocumentProcessor documentProcessor = new PdfDocumentProcessor(); documentProcessor.LoadDocument(pdfFilePath); if (documentProcessor != null) { PrinterSettings settings = new PrinterSettings(); //var paperSizes = settings.PaperSizes.Cast().ToList(); //PaperSize sizeCustom = paperSizes.FirstOrDefault(size => size.Kind == PaperKind.Custom); // finding paper size settings.DefaultPageSettings.PaperSize = new PaperSize("Label", 400, 600); // Print pdf documentProcessor.Print(settings); } }