it-swarm.com.de

So drucken Sie ein PDF mit C #

Ich versuche dieses Problem seit fast 2 Tagen zu lösen. Es gibt viele mehr oder weniger gute Lösungen im Netz, aber keine einzige Lösung passt perfekt zu meiner Aufgabe.

Aufgabe:

  • Drucken Sie eine PDF programmgesteuert
  • Machen Sie es mit einem festen Drucker
  • Lassen Sie den Benutzer nicht mehr als einen Button_Click ausführen
  • Mach es still - je mehr, desto besser
  • Mach es auf der Client-Seite

Erste Lösungen:

Mach es mit einem Forms.WebBrowser

Wenn wir den Adobe Reader installiert haben, gibt es ein Plugin, um PDFs im Webbrowser anzuzeigen. Mit dieser Lösung haben wir eine Nice-Vorschau, und mit webbrowserControlName.Print () können wir das Steuerelement auslösen, um den Inhalt zu drucken.

Problem - wir haben immer noch einen PrintDialog.


Starten Sie die AcroRd32.exe mit den Startargumenten

Mit dem folgenden CMD-Befehl können Sie unser PDF mit Adobe Reader drucken.

InsertPathTo ..\AcroRd32.exe/t "C:\sample.pdf" "\ druckerNetzwerk\druckername"

Probleme - wir brauchen den absoluten Pfad zu AcroRd32.exe | Es öffnet sich ein Adobe Reader-Fenster, das geöffnet werden muss, bis der Druckauftrag fertig ist. 


Windows-Voreinstellungen verwenden

Process process = new Process();

process.StartInfo.FileName = pathToPdf; 
process.StartInfo.Verb = "printto";
process.StartInfo.Arguments = "\"" + printerName + "\""; 
process.Start();

process.WaitForInputIdle();
process.Kill();

Problem - es wird immer noch ein Adobe Reader-Fenster angezeigt, aber nach Abschluss des Druckvorgangs schließt es sich normalerweise selbst.

Lösung - überzeugen Sie den Client, Foxit Reader zu verwenden (verwenden Sie die letzten beiden Codezeilen nicht).


Konvertieren Sie PDF Seiten in Drawing.Image

Ich habe keine Ahnung, wie man das mit Code macht, aber wenn ich damit fertig bin, ist der Rest ein Kinderspiel. Printing.PrintDocument kann alle Anforderungen erfüllen. 


Wer hat eine Idee, ein paar Drawing.Images aus diesen PDFs herauszuholen oder einen anderen Ansatz, wie man das macht?

Beste Grüße, Max

20
Mx.

Die flexibelste, einfachste und leistungsfähigste Methode, die ich finden konnte, war GhostScript. Es kann direkt nach dem Druckernamen auf Windows-Druckern gedruckt werden.

"C:\Programme\gs\gs9.07\bin\gswin64c.exe" -dPrinted -dBATCH -dNOPAUSE -sDEVICE = mswinpr2 -dNoCancel -sOutputFile = "% printer% Druckername " " pdfdocument. pdf "

Fügen Sie diese Schalter hinzu, um das Dokument auf eine A4-Seite zu verkleinern.

-sPAPERSIZE = a4 -dPDFFitPage

Wenn eine kommerzielle Bibliothek eine Option ist, können Sie es mit Amyuni PDF Creator versuchen. Netz.

Direktes Drucken mit der Bibliothek:
Zum Öffnen einer PDF -Datei und zum direkten Senden zum Drucken können Sie die Methode IacDocument.Print verwenden. Der Code in C # wird folgendermaßen aussehen:

// Open PDF document from file<br>
FileStream file1 = new FileStream ("test.pdf", FileMode.Open, FileAccess.Read);
IacDocument doc1 = new IacDocument (null);
doc1.Open (file1, "" );
// print document to a specified printer with no Prompt
doc1.Print ("My Laser Printer", false);

Exportieren in Bilder (ggf. Drucken):
Wahlmöglichkeit 1: Sie können die Methode IacDocument.ExportToJPeg verwenden, um alle Seiten in einem PDF in JPG-Bilder umzuwandeln, die Sie mit Drawing.Image drucken oder anzeigen können

Möglichkeit 2: Sie können jede Seite mit der Methode IacDocument.DrawCurrentPage mit der Methode System.Drawing.Graphics.FromImage in eine Bitmap zeichnen. Der Code in C # sollte folgendermaßen aussehen:

FileStream myFile = new FileStream ("test.pdf", FileMode.Open, FileAccess.Read);
IacDocument doc = new IacDocument(null);
doc.Open(myFile);
doc.CurrentPage = 1;
Image img = new Bitmap(100,100);
Graphics gph = Graphics.FromImage(img);
IntPtr hdc = gph.GetHDC();
doc.DrawCurrentPage(hdc, false);
gph.ReleaseHdc( hdc );

Haftungsausschluss: Ich arbeite für Amyuni Technologies

3
yms

Ein anderer Ansatz wäre die Verwendung der Spooler-Funktion in .NET, um die vorformatierten Druckerdaten an einen Drucker zu senden. Aber leider müssen Sie mit der Win32-Spooler-API arbeiten 

sie können unter schauen, wie Rohdaten mithilfe von Visual C # .NET an einen Drucker gesendet werden.

sie können diesen Ansatz nur verwenden, wenn der Drucker PDF nativ unterstützt.

3
Turbot

Ich habe eine etwas andere Version Ihres Codes gefunden, die das printto-Verb verwendet. Ich habe es nicht probiert, aber vielleicht hilft es Ihnen:

http://vbcity.com/forums/t/149141.aspx

1
Hinek

Ich weiß, dass das Tag Windows Forms hat; Aufgrund des allgemeinen Titels fragen sich manche Leute jedoch, ob sie diesen Namespace möglicherweise mit einer WPF-Anwendung verwenden.

Hier ist der Code:

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

Dieser Namespace muss nun mit einer WPF-Anwendung verwendet werden. Es funktioniert nicht gut mit ASP.NET oder Windows Service. 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.

Wenn Ihr Drucker den Direktdruck für PDF - Dateien nicht unterstützt, funktioniert dies nicht.

1
B.K.

Sie können ghostscript verwenden, um PDF in Bildformate zu konvertieren. 

Das folgende Beispiel konvertiert eine einzelne PDF in eine Sequenz von PNG-Dateien:

private static void ExecuteGhostscript(string input, string tempDirectory)
{
    // %d will be replaced by ghostscript with a number for each page
    string filename = Path.GetFileNameWithoutExtension(input) + "-%d.png";
    string output = Path.Combine(tempDirectory, filename);

    Process ghostscript = new Process();
    ghostscript.StartInfo.FileName = _pathToGhostscript;
    ghostscript.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

    ghostscript.StartInfo.Arguments = string.Format(
        "-dSAFER -dBATCH -dNOPAUSE -sDEVICE=png16m -r300 -sOutputFile=\"{0}\" \"{1}\"", output, input);

    ghostscript.Start();
    ghostscript.WaitForExit();
}

Wenn Sie lieber Adobe Reader verwenden, können Sie das Fenster ausblenden:

process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
1
pescolino

Ab July 2018 gibt es noch keine Antwort für das OP. Es gibt keinen freien Weg, um 1) Ihr PDF-Dokument stumm für ein 2) Closed-Source-Projekt zu drucken.

1) Sie können ganz sicher einen Prozess verwenden, z. B. Adobe Acrobat oder Foxit Reader

2) Kostenlose Lösungen haben eine GPL (General Public License von GNU). Das bedeutet, dass Sie Ihren Quellcode öffnen müssen, wenn Sie die Software an Dritte außerhalb Ihres Unternehmens weitergeben.

Wie das OP sagt, können Sie, wenn Sie ein PDF für Drawing.Image erhalten, mit .NET-Methoden drucken. Leider erfordert Software dazu auch eine Zahlung oder eine GPL.

0
John Doe

Ich habe viele Dinge ausprobiert und am besten funktionierte für mich das Starten eines SumatraPDF über die Befehlszeile:

// Launch SumatraPDF Reader to print
String arguments = "-print-to-default -silent \"" + fileName + "\"";
System.Diagnostics.Process.Start("SumatraPDF.exe", arguments);

Das hat so viele Vorteile:

  1. SumatraPDF ist viel schneller als der Adobe Acrobat Reader.
  2. Die Benutzeroberfläche wird nicht geladen. Es druckt einfach.
  3. Sie können SumatraPDF als eigenständige Anwendung verwenden, sodass Sie es in Ihre Anwendung aufnehmen können, um Ihr eigenes Paket zu verwenden. Beachten Sie, dass ich die Lizenzvereinbarung nicht gelesen habe. Sie sollten es wahrscheinlich selbst ausprobieren.
0
Ian

Wenn Sie an kommerziellen Lösungen interessiert sind, die genau das tun, was Sie benötigen, gibt es eine Reihe von Optionen. Mein Unternehmen bietet eine dieser Optionen in einem Entwickler-Toolkit mit dem Namen Debenu Quick PDF Library an.

Hier ist ein Codebeispiel (die wichtigsten Funktionen sind PrintOptions und PrintDocument ):

/* Print a document  */

// Load a local sample file from the input folder

DPL.LoadFromFile("Test.pdf", "");

// Configure print options

iPrintOptions = DPL.PrintOptions(0, 0, "Printing Sample")

// Print the current document to the default 
// printing using the options as configured above.
// You can also specify the specific printer.

DPL.PrintDocument(DPL.GetDefaultPrinterName(), 1, 1, iPrintOptions);
0
Rowan

Was ist mit der PrintDocument-Klasse?

http://msdn.Microsoft.com/de-de/library/system.drawing.printing.printdocument.aspx

Sie müssen nur den Dateinamen der Datei angeben, die Sie drucken möchten (basierend auf dem Beispiel).

HTH

0
Gavin
        Process proc = new Process();
        proc.StartInfo.FileName = @"C:\Program Files\Adobe\Acrobat 7.0\Reader\AcroRd32.exe";
        proc.StartInfo.Arguments = @"/p /h C:\Documents and Settings\brendal\Desktop\Test.pdf";
        proc.StartInfo.UseShellExecute = false;
        proc.StartInfo.CreateNoWindow = true;
        proc.Start();

        for (int i = 0; i < 5; i++)
        {
            if (!proc.HasExited)
            {
                proc.Refresh();
                Thread.Sleep(2000);
            }
            else
                break;
        }
        if (!proc.HasExited)
        {
            proc.CloseMainWindow();
        }
0
Roshana