Comment imprimer un PDF avec C#

<!-J'essaie de résoudre ce problème depuis 2 jours. Il y a beaucoup plus ou moins de bonnes solutions sur le net, mais pas une seule ne convient parfaitement à ma tâche.

tâche:

  • Impression d'un document PDF par programmation
  • le Faire avec une imprimante
  • ne laissez pas l'Utilisateur faire plus d'un Button_Click
  • Faire le silence - le plus, le mieux
  • le Faire côté client

Première Solutions:

faites-le avec un formulaire.WebBrowser

si nous avons Adobe Reader installé, il y a un plugin pour afficher les fichiers PDF dans le webbrowser. Avec cette solution, nous avons un bel aperçu et avec webbrowserControlName.Print (), nous pouvons déclencher le contrôle d'imprimer son contenu.

problème - nous avons toujours un PrintDialog.


Démarrer L'AcroRd32.exe avec commencer arguments

La suite Commande CMD utilisons Adobe Reader pour imprimer notre PDF.

InsertPathTo.. AcroRd32.exe /t "C:sample.pdf ""printerNetworkprinterName"

problèmes-nous avons besoin du chemin absolu vers AcroRd32.exe / il y a une fenêtre Adobe Reader qui s'ouvre et qui doit être ouverte jusqu'à ce que la tâche d'impression soit prête.


utiliser les presets windows

Process process = new Process();

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

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

problème - il y a toujours une fenêtre Adobe Reader qui apparaît, mais après l'impression est fait, il se ferme habituellement.

Solution-convaincre le client d'utiliser Foxit Reader (ne pas utiliser les deux dernières lignes de code).


Convertir les pages PDF en dessin.Image

<!-Je ne sais pas comment le faire avec du code, mais quand j'arrive à faire marcher ça, le reste n'est qu'un jeu d'enfant. Impression.PrintDocument peut répondre à toutes les exigences.


quelqu'un à une idée pour obtenir un peu de Dessin.Les Images de ces fichiers Pdf ou d'une autre approche, comment le faire?

Meilleures Salutations, Max

19
demandé sur yms 2012-07-20 16:42:44

11 réponses

la méthode la plus souple, la plus facile et la plus performante que j'ai pu trouver était D'utiliser GhostScript. Il peut imprimer les imprimantes windows directement par nom d'imprimante.

"C:\Program Files\gs\gs9.07\bin\gswin64c.exe"- dPrinted-dBATCH-dNOPAUSE-sDEVICE=mswinpr2-dNoCancel-soulputfile= " %printer%nom de l'imprimante"" pdfdocument.pdf"

ajouter ces commutateurs pour rétrécir le document à une page A4.

-sPAPERSIZE=a4-dPDFFitPage

5
répondu Johan van der Slikke 2013-10-11 13:58:49

une autre approche consisterait à utiliser la fonction spooler dans .NET pour envoyer les données préformatées de l'imprimante à une imprimante. Mais malheureusement, vous devez travailler avec win32 spooler API

vous pouvez regarder comment envoyer des données brutes à une imprimante en utilisant Visual C# .NET

vous ne pouvez utiliser cette approche que lorsque l'imprimante supporte le document PDF nativement.

3
répondu Turbot 2012-07-20 13:26:04

Si une bibliothèque commerciale est une option, vous pouvez essayer avec Amyuni PDF Creator. Net.

impression directement avec la bibliothèque:

Pour ouvrir un fichier PDF et l'envoyer directement à imprimer, vous pouvez utiliser la méthode IacDocument.Imprimer. Le code en C# ressemblera à ceci:

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

Exporter vers les images (puis imprimer si nécessaire):

Choix 1: Vous pouvez utiliser la méthode IacDocument.ExportToJPeg pour convertir toutes les pages D'un PDF en images JPG que vous pouvez imprimer ou afficher en utilisant le dessin.Image

choix 2: Vous pouvez dessiner chaque page dans un bitmap en utilisant la méthode IacDocument.DrawCurrentPage la méthode Système.Dessin.Graphique.FromImage. Le code en C# devrait ressembler à ceci:

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

avertissement: je travaille pour Amyuni Technologies

3
répondu yms 2015-05-22 03:14:36

Vous pouvez utiliser ghostscript pour convertir PDF en formats d'image.

l'exemple suivant convertit un PDF unique en une séquence de fichiers PNG:

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

si vous préférez utiliser Adobe Reader à la place, vous pouvez masquer sa fenêtre:

process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
1
répondu pescolino 2012-07-20 21:19:35

j'ai trouvé une version légèrement différente de votre code qui utilise la printto verbe. Je ne l'ai pas essayé, mais peut-être qu'il vous aide à:

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

1
répondu Hinek 2012-07-30 11:21:00

je sais que la balise Windows Forms; cependant, en raison du titre général, certaines personnes pourraient se demander si ils peuvent utiliser l'espace de nom avec un WPF applications -- ils le peuvent.

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

maintenant, ce namespace doit être utilisé avec un WPF application. Il ne joue pas bien avec ASP.NET ou Windows Service. Il ne doit pas être utilisé avec Windows Forms, comme il l'a System.Drawing.Printing. Je n'ai pas un seul problème avec mon impression PDF en utilisant le ci-dessus code.

notez que si votre imprimante ne supporte pas L'impression directe pour les fichiers PDF, cela ne fonctionnera pas.

1
répondu B.K. 2015-05-21 16:29:08

Qu'en est-il de l'utilisation du PrintDocument classe?

http://msdn.microsoft.com/en-us/library/system.drawing.printing.printdocument.aspx

Vous avez juste besoin de passer le nom du fichier que vous souhaitez imprimer (basé sur l'exemple).

HTH

0
répondu Gavin 2012-07-20 12:53:40
        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
répondu Roshana 2012-09-30 20:14:51

si vous êtes intéressé par des solutions commerciales qui font exactement ce que vous avez besoin, alors il ya beaucoup d'options. Mon entreprise offre une de ces options dans un developer toolkit appelé Debenu Quick PDF Library.

voici un exemple de code (les fonctions clés sont PrintOptions et 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
répondu Rowan 2014-01-17 05:46:44

j'ai essayé beaucoup de choses et celle qui fonctionnait le mieux pour moi était de lancer un SumatraPDF à partir de la ligne de commande:

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

Il y a tellement d'avantages à cela:

  1. SumatraPDF est beaucoup plus rapide que Adobe Acrobat Reader.
  2. L'interface utilisateur ne fonctionne pas. Il imprime juste.
  3. Vous pouvez utiliser SumatraPDF comme une application autonome de sorte que vous pouvez inclure dans votre application de sorte que vous pouvez utiliser votre propre pa. Notez que je n'ai pas lu la licence accord; vous devriez probablement vérifier vous-même.
0
répondu Ian 2017-11-17 18:55:47

July 2018, il n'y a toujours pas de réponse pour L'OP. Il n'y a pas de voie libre pour 1) imprimer silencieusement votre pdf pour un 2) projet source fermé.

1) Vous pouvez très certainement utiliser un processus i.e. Adobe Acrobat ou Foxit Reader

2) les solutions libres ont une licence GPL (licence publique générale GNU). Cela signifie que vous devez ouvrir votre code source si vous donnez le logiciel, même gratuitement, à quelqu'un en dehors de votre entreprise.

comme le dit L'OP, si vous pouvez obtenir un PDF à Dessin.Image, vous pouvez l'imprimer avec les méthodes .NET. Malheureusement, le logiciel pour ce faire nécessite également un paiement ou une GPL.

0
répondu John Doe 2018-07-31 18:27:30