it-swarm.com.de

Wie kann ich ein Dateidokument an den Drucker senden und drucken lassen?

Hier ist die Grundvoraussetzung:

Mein Benutzer klickt auf einige Gizmos und eine PDF -Datei wird auf seinem Desktop ausgegeben. Gibt es eine Möglichkeit, diese Datei an die Druckerwarteschlange zu senden und auf dem lokal angeschlossenen Drucker drucken zu lassen?

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

Er wird diesen Prozess viele Male ausführen. Für jeden Schüler in einem Klassenzimmer muss er eine kleine Zeugniskarte ausdrucken. Also generiere ich für jeden Schüler ein PDF und ich möchte den Druckvorgang automatisieren, anstatt dass der Benutzer PDF generiert, druckt, PDF generiert, druckt, PDF erzeugt, druckt.

Irgendwelche Vorschläge, wie man dies angehen kann? Ich arbeite unter Windows XP mit Windows Forms .NET 4.

Ich habe diese StackOverflow -Frage gefunden, bei der die akzeptierte Antwort darauf hinweist:

Nachdem Sie Ihre Dateien erstellt haben, können Sie Sie können sie über eine Befehlszeile drucken (Sie kann die Befehlsklasse verwenden, die in dem System.Diagnostics-Namespace für das enthalten ist).

Wie würde ich das schaffen?

58

Sie können Acrobat Reader anweisen, die Datei mit dem "print" -Verb (wie bereits erwähnt) zu drucken. Sie müssen Acrobat Reader auch danach programmgesteuert schließen:

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

Dadurch wird Acrobat Reader geöffnet, und es wird angegeben, dass PDF an den Standarddrucker gesendet werden soll. Anschließend wird Acrobat nach drei Sekunden heruntergefahren.

Wenn Sie bereit sind, andere Produkte mit Ihrer Anwendung zu versenden, können Sie GhostScript (kostenlos) oder einen Befehlszeilen PDF Drucker wie http://www.commandlinepdf.com/ verwenden. kommerziell).

Hinweis: Mit dem Beispielcode wird der PDF in die aktuell zum Drucken von PDF-Dateien registrierte Anwendung geöffnet. Dies ist Adobe Acrobat Reader auf den meisten Computern. Es ist jedoch möglich, dass sie einen anderen PDF Viewer verwenden, z. B. Foxit ( http://www.foxitsoftware.com/pdf/reader/ ). Der Beispielcode sollte jedoch weiterhin funktionieren.

58

Das Hinzufügen einer neuen Antwort zu diesem Thema, da die Frage des Druckens von PDF-Dateien in .net bereits seit längerer Zeit besteht, und die meisten der Antworten sind älter als die Google Pdfium-Bibliothek, die jetzt einen .net-Wrapper enthält. Für mich habe ich selbst nach diesem Problem gesucht und bin immer wieder aufgedeckt worden. Ich habe versucht, hacklige Lösungen zu entwickeln, wie das Auftauchen von Acrobat oder anderen PDF -Lesern, oder das Durchlaufen kommerzieller Bibliotheken, die teuer sind und die Lizenzbedingungen nicht sehr gut vereinbaren. Die Google Pdfium-Bibliothek und der PdfiumViewer .net-Wrapper sind Open Source, also eine großartige Lösung für viele Entwickler, mich eingeschlossen. PdfiumViewer steht unter der Apache 2.0-Lizenz.

Das NuGet-Paket erhalten Sie hier:

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

und den Quellcode finden Sie hier:

https://github.com/pvginkel/PdfiumViewer

Hier ist ein einfacher Code, der unbegrenzt viele Kopien einer PDF -Datei aus dem Dateinamen druckt. Sie können PDF-Dateien auch aus einem Stream laden (wie es normalerweise üblich ist), und Sie können das anhand des Codes oder der Beispiele leicht herausfinden. Es gibt auch eine WinForm-Datei PDF, mit der Sie die PDF -Dateien auch in eine Ansicht rendern oder eine Druckvorschau darauf erstellen können. Für uns brauchte ich einfach eine Möglichkeit, die PDF -Datei bei Bedarf auf einem bestimmten Drucker zu drucken.

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

Ich weiß, dass das Tag Windows Forms... sagt, aber wenn jemand an einer WPF-Anwendungsmethode interessiert ist, funktioniert System.Printing wie ein Zauber.

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

Denken Sie daran, die System.Printing-Referenz einzuschließen, falls diese noch nicht enthalten ist. Nun kann diese Methode mit ASP.NET oder Windows Service nicht gut funktionieren. Es sollte nicht mit Windows Forms verwendet werden, da es System.Drawing.Printing hat. Beim Drucken von PDF mit dem obigen Code ist kein Problem aufgetreten.

Ich sollte jedoch erwähnen, dass, wenn Ihr Drucker Direct Print für das Dateiformat PDF nicht unterstützt, Sie mit dieser Methode kein Glück haben.

25
B.K.

Dies ist eine leicht modifizierte Lösung. Der Prozess wird abgebrochen, wenn er mindestens 1 Sekunde im Leerlauf war. Vielleicht sollten Sie eine Zeit von X Sekunden hinzufügen und die Funktion aus einem separaten Thread aufrufen.

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

Das folgende Code-Snippet ist eine Anpassung von Kendall Bennetts - Code zum Drucken von PDF-Dateien mithilfe der PdfiumViewer-Bibliothek. Der Hauptunterschied besteht darin, dass ein Stream anstelle einer Datei verwendet wird. 

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

In meinem Fall generiere ich die PDF -Datei mit einer Bibliothek namens PdfSharp und speichere das Dokument dann in einem Stream wie folgt:

        PdfDocument pdf = PdfGenerator.GeneratePdf(printRequest.html, PageSize.A4);
        pdf.AddPage();

        MemoryStream stream = new MemoryStream();
        pdf.Save(stream);
        MemoryStream stream2 = new MemoryStream(stream.ToArray());

Ich möchte darauf hinweisen, dass es für andere Entwickler möglicherweise hilfreich ist, dass ich die 32-Bit-Version der pdfuim-nativen DLL installieren musste, damit das Drucken funktioniert, obwohl Windows 10 64-Bit ausgeführt wird. Ich habe die folgenden zwei NuGet-Pakete mit dem NuGet-Paketmanager in Visual Studio installiert:

  • PdfiumViewer
  • PdfiumViewer.Native.x86.v8-xfa
6
Casper Kjær

System.Diagnostics.Process.Start kann zum Drucken eines Dokuments verwendet werden. Setzen Sie UseShellExecute auf True und das Verb auf "print".

3
Neil
2
danyolgiax

Der einfache Weg:

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

Ich weiß, dass Edwin oben geantwortet hat, aber er druckt nur ein Dokument. Ich verwende diesen Code, um alle Dateien eines bestimmten Verzeichnisses zu drucken.

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

Es durchläuft im Wesentlichen jede Datei in der angegebenen Verzeichnisvariablen Directory -> für mich war es "C:\Users\Owner\Documents\SalesVaultTesting \" und druckt diese Dateien auf Ihrem Standarddrucker aus.

2
iato

dies ist eine späte Antwort, aber Sie können auch die File.Copy-Methode des System.IO-Namespaces verwenden, um eine Datei an den Drucker zu senden:

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

Das funktioniert gut

2

Sie können die Methode DevExpress PdfDocumentProcessor.Print (PdfPrinterSettings) verwenden.

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