web-dev-qa-db-fra.com

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

Voici le principe de base:

Mon utilisateur clique sur quelques gizmos et un fichier PDF est envoyé sur son bureau. Puis-je envoyer ce fichier dans la file d’imprimantes et l’imprimer sur l’imprimante connectée localement?

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

Il fera ce processus plusieurs fois. Dans chaque classe, il doit imprimer un petit bulletin. Je génère donc un PDF pour chaque élève, et j'aimerais automatiser le processus d'impression au lieu de laisser les utilisateurs générer des PDF, imprimer, générer des pdf, imprimer, générer des pdf, imprimer.

Des suggestions sur la façon d'aborder cela? J'utilise Windows XP avec Windows Forms .NET 4.

J'ai trouvé ceci 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 pouvez utiliser la classe Command située dans l'espace de noms System.Diagnostics pour that)

Comment pourrais-je accomplir ceci?

58

Vous pouvez dire à Acrobat Reader d'imprimer le fichier en utilisant (comme quelqu'un l'a déjà mentionné ici) le verbe 'print'. Après cela, vous devrez également fermer Acrobat Reader par programme:

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 dit d’envoyer le PDF à l’imprimante par défaut, puis d’arrêter Acrobat après trois secondes.

Si vous souhaitez envoyer d'autres produits avec votre application, vous pouvez utiliser GhostScript (gratuit) ou une imprimante PDF à ligne de commande, telle que http://www.commandlinepdf.com/ (commercial). .

Remarque: l'exemple de code ouvre le PDF dans l'application actuellement enregistrée pour imprimer les fichiers PDF, qui est Adobe Acrobat Reader sur la plupart des ordinateurs. Cependant, il est possible qu’ils utilisent un autre visualiseur PDF tel que Foxit ( http://www.foxitsoftware.com/pdf/reader/ ). Le code exemple devrait quand même fonctionner.

58

L'ajout d'une nouvelle réponse à cette question, comme la question de l'impression de fichiers PDF au format .net, existe depuis longtemps et la plupart des réponses sont antérieures à la bibliothèque Google Pdfium, qui dispose désormais d'un wrapper .net. Pour moi, je faisais moi-même des recherches sur ce problème et je n'arrêtais pas de chercher, d'essayer de résoudre des problèmes tels que la création d'Acrobat ou d'autres lecteurs PDF, ou de courir dans des bibliothèques commerciales coûteuses et dont les conditions de licence étaient peu compatibles. Mais la bibliothèque Pdfium de Google et l'encapsuleur .net PdfiumViewer sont des logiciels Open Source. Ils constituent donc une excellente solution pour de nombreux 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 silencieusement un nombre quelconque de copies d’un fichier PDF à partir de son nom de fichier. Vous pouvez également charger des PDF à partir d'un flux (comme nous le faisons normalement), et vous pouvez facilement le comprendre en consultant le code ou des exemples. Il existe également une vue de fichier WinForm PDF qui vous permet également de restituer les fichiers PDF dans une vue ou d’avoir un aperçu avant impression. Pour nous, il me fallait simplement un moyen d’imprimer en silence le fichier PDF sur une imprimante spécifique à la 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;
    }
}
42
Kendall Bennett

Je sais que la balise indique Windows Forms... mais si quelqu'un est intéressé par une méthode d'application WPF, System.Printing fonctionne à merveille.

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 ce n'est déjà fait. Maintenant, cette méthode ne fonctionne pas bien avec ASP.NET ou Windows Service. Il ne devrait pas être utilisé avec Windows Forms, car il a System.Drawing.Printing. Je n'ai pas un seul problème avec mon PDF imprimer en utilisant le code ci-dessus.

Je devrais toutefois mentionner 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.

25
B.K.

Ceci est une solution légèrement modifiée. Le processus sera tué s'il était inactif pendant au moins 1 seconde. Peut-être devriez-vous ajouter 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();
}
9
user1027167

System.Diagnostics.Process.Start peut être utilisé pour imprimer un document. Définissez UseShellExecute sur True et définissez le verbe sur "print".

3
Neil
2
danyolgiax

Le moyen le plus simple:

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

Je sais que Edwin a répondu à la question ci-dessus mais il n’imprime qu’un seul document. 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 parcourt essentiellement chaque fichier du répertoire donné Variable -> pour moi c’est @ "C:\Utilisateurs\Propriétaire\Documents\SalesVaultTesting \" et imprime ces fichiers sur votre imprimante par défaut .

2
iato

c'est 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

2
Our Man in Bananas

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

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
stomy