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

voici le principe de base:

mon utilisateur clique quelques gizmos et un fichier PDF est recraché sur son bureau. Est-il un moyen pour moi d'envoyer ce fichier à la file d'attente d'impression et imprimer à l'imprimante connectée localement?

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

il va faire 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 ayant généré par l'utilisateur pdf, imprimer, générer un pdf, imprimer, générer un pdf, imprimer.

des suggestions sur la façon d'aborder ceci? J'exécute sur Windows XP avec Windows Forms. net 4.

j'ai trouvé cette StackOverflow question 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 peut utiliser la classe de commande trouvée dans le Système.Espace de noms pour les Diagnostics that)

Comment faire?

57
demandé sur Community 2011-05-24 02:22:56

11 réponses

vous pouvez dire à Acrobat Reader d'imprimer le fichier en utilisant (comme quelqu'un l'a déjà mentionné ici) le verbe "imprimer". Vous aurez besoin de fermer Acrobat Reader programmatically après cela, aussi:

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

ouvre Acrobat Reader et lui dit d'envoyer le PDF à l'imprimante par défaut, puis éteint Acrobat après trois secondes.

si vous souhaitez expédier d'autres produits avec votre application, vous pouvez utiliser GhostScript (gratuit), ou un imprimante PDF en ligne de commande telle que http://www.commandlinepdf.com / (commercial).

Note: le code d'exemple ouvre le PDF dans l'application courante enregistrée pour imprimer PDFs , qui est le lecteur Adobe Acrobat sur les machines de la plupart des gens. Cependant, il est possible qu'ils utilisent un lecteur PDF différent tel que Foxit ( http://www.foxitsoftware.com/pdf/reader / ). Le code de l'échantillon doivent encore travailler.

57
répondu Edwin Groenendaal 2013-12-19 22:15:29

ajouter une nouvelle réponse à cette que la question de l'impression de PDF dans .net a été autour depuis longtemps et la plupart des réponses pré-date de la Bibliothèque Google Pdfium, qui a maintenant un enveloppeur .net. Pour moi, je faisais moi-même des recherches sur ce problème et je n'arrêtais pas de revenir en arrière, essayant de faire des solutions hacky comme le frai D'acrobate ou d'autres lecteurs PDF, ou courant dans les bibliothèques commerciales qui sont coûteux et n'ont pas de conditions de licence très compatibles. Mais la Bibliothèque Google Pdfium et le PdfiumViewer. wrapper sont Open Source donc sont une excellente solution pour un grand nombre de développeurs, moi-même inclus. PdfiumViewer est sous licence Apache 2.0.

vous pouvez obtenir le paquet 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 silencieusement n'importe quel nombre de copies D'un fichier PDF à partir de son nom de fichier. Vous pouvez également charger des PDF à partir d'un flux (ce qui est la façon dont nous le faisons normalement), et vous pouvez facilement le comprendre en regardant le code ou les exemples. Il y a aussi une vue de fichier PDF de WinForm de sorte que vous pouvez également rendre les fichiers PDF dans une vue ou faire la prévisualisation d'impression sur eux. Pour nous, j'avais simplement besoin d'un moyen d'imprimer silencieusement le fichier PDF à une imprimante spécifique sur demande.

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;
    }
}
38
répondu Kendall Bennett 2017-01-19 20:34:20

je sais que l'étiquette dit Windows Forms ... mais, si quelqu'un est intéressé par une WPF méthode d'application, 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 dois mentionner, cependant, que si votre imprimante ne supporte pas L'impression directe pour le format de fichier PDF, vous n'avez pas de chance avec cette méthode.

25
répondu B.K. 2017-05-10 03:17:37

il s'agit d'une solution légèrement modifiée. Le processus sera tué quand il était inactif pendant au moins 1 seconde. Peut-être devriez-vous ajouter un temps 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();
}
9
répondu user1027167 2014-09-12 11:09:25

du Système.Diagnostic.Processus.Le début peut être utilisé pour imprimer un document. Définissez UseShellExecute à True et définissez le verbe à "imprimer".

3
répondu Neil 2011-05-23 22:29:11

l'extrait de code suivant est une adaptation de de Kendall Bennett code pour imprimer des fichiers pdf en utilisant la bibliothèque PdfiumViewer. La principale différence est qu'un Flux est utilisé plutôt qu'un fichier.

public bool PrintPDF(
    string printer,
    string paperName,
    int copies, Stream stream)
        {
            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 = 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 je sauvegarde le document dans un flux 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 tiens à souligner cela pourrait être utile à d'autres développeurs est que j'ai dû installer la version 32 bits de la dll natif pdfuim afin que l'impression fonctionne, même si je suis en cours D'exécution Windows 10 64 bit. J'ai installé les deux paquets NuGet suivants en utilisant le gestionnaire de paquets NuGet dans Visual Studio:

  • PdfiumViewer
  • PdfiumViewer.Natif.x86.v8-xfa
3
répondu Casper Kjær 2018-09-28 01:19:56
2
répondu danyolgiax 2017-05-23 10:31:30

la voie de La facilité:

var pi=new ProcessStartInfo("C:\file.docx");
pi.UseShellExecute = true;
pi.Verb = "print";
var process =  System.Diagnostics.Process.Start(pi);
2
répondu RolandoCC 2014-12-26 15:33:53

c'est une réponse tardive, mais vous pouvez également utiliser le Fichier.Méthode de copie du système.IO namespace haut envoyer un fichier à l'imprimante:

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

Cela fonctionne bien

2
répondu Our Man in Bananas 2015-10-21 13:11:23

Je sais que Edwin a répondu plus haut, mais 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
    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");
}

il tourne essentiellement à travers chaque fichier dans le répertoire variable de répertoire donné - > pour moi il était @"C:\Users\Owner\Documents\SalesVaultTesting\" et imprime ces fichiers sur votre imprimante par défaut .

2
répondu iato 2017-07-11 18:54:52

vous pouvez utiliser le processeur Pdfdocumentpress de DevExpress.Print (PdfPrinterSettings) Method.

public void Print(string 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<PaperSize>().ToList();
          //PaperSize sizeCustom = paperSizes.FirstOrDefault<PaperSize>(size => size.Kind == PaperKind.Custom); // finding paper size

          settings.DefaultPageSettings.PaperSize = new PaperSize("Label", 400, 600);

          // Print pdf
          documentProcessor.Print(settings);
      }
}
0
répondu stomy 2018-09-05 22:14:48