web-dev-qa-db-fra.com

Imprimer les PDF (ou autres fichiers) existants en C #

À partir d'une application que je crée, j'ai besoin d'imprimer des fichiers PDF existants (créés par une autre application). Comment puis-je faire cela en C # et fournir un mécanisme pour que l'utilisateur puisse sélectionner une imprimante différente ou d'autres propriétés.

J'ai regardé le PrintDialog mais je ne sais pas quel fichier il essaie d'imprimer, le cas échéant, b/c la sortie est toujours une page vierge. Peut-être que je manque juste quelque chose là-bas.

Dois-je utiliser "iTextSharp" (comme suggéré ailleurs)? Cela me semble étrange car je peux "envoyer le fichier à l'imprimante" Je n'ai tout simplement pas de belle boîte de dialogue avant de configurer l'imprimante, etc. et je ne veux pas vraiment écrire une boîte de dialogue d'impression à partir de zéro. mais il semble que beaucoup d'exemples que j'ai trouvés en recherchant l'ont fait.

Tout conseil, exemple ou exemple de code serait formidable!

De plus, si PDF est le problème, les fichiers peuvent être créés par l'autre application dans un format diff tel que bitmap ou png si cela facilite les choses.

23
Cody

Afficher une petite boîte de dialogue avec une zone de liste déroulante dont les éléments sont définis sur la collection de chaînes renvoyée par PrinterSettings.InstalledPrinters.

Si vous pouvez exiger que GSView soit installé sur la machine, vous pouvez ensuite imprimer le PDF en silence. C'est un peu lent et détourné, mais au moins vous n'avez pas à faire apparaître Acrobat.

Voici un code que j'utilise pour imprimer certains PDF que je récupère d'un service Web UPS:

    private void PrintFormPdfData(byte[] formPdfData)
    {
        string tempFile;

        tempFile = Path.GetTempFileName();

        using (FileStream fs = new FileStream(tempFile, FileMode.Create))
        {
            fs.Write(formPdfData, 0, formPdfData.Length);
            fs.Flush();
        }

        try
        {
            string gsArguments;
            string gsLocation;
            ProcessStartInfo gsProcessInfo;
            Process gsProcess;

            gsArguments = string.Format("-grey -noquery -printer \"HP LaserJet 5M\" \"{0}\"", tempFile);
            gsLocation = @"C:\Program Files\Ghostgum\gsview\gsprint.exe";

            gsProcessInfo = new ProcessStartInfo();
            gsProcessInfo.WindowStyle = ProcessWindowStyle.Hidden;
            gsProcessInfo.FileName = gsLocation;
            gsProcessInfo.Arguments = gsArguments;

            gsProcess = Process.Start(gsProcessInfo);
            gsProcess.WaitForExit();
        }
        finally
        {
            File.Delete(tempFile);
        }
    }

Comme vous pouvez le voir, il prend les données PDF sous la forme d'un tableau d'octets, les écrit dans un fichier temporaire et lance gsprint.exe pour imprimer le fichier en silence sur l'imprimante nommée ("HP Laserjet 5M "). Vous pouvez remplacer le nom de l'imprimante par celui que l'utilisateur a choisi dans votre boîte de dialogue.

L'impression d'un PNG ou d'un GIF serait beaucoup plus facile - étendez simplement la classe PrintDocument et utilisez la boîte de dialogue d'impression normale fournie par Windows Forms.

Bonne chance!

23

Bien que ce soit VB vous pouvez facilement le traduire. Par la façon dont Adobe n'apparaît pas, il imprime uniquement le pdf puis disparaît.

''' <summary>
''' Start Adobe Process to print document
''' </summary>
''' <param name="p"></param>
''' <remarks></remarks>
Private Function printDoc(ByVal p As PrintObj) As PrintObj
    Dim myProcess As New Process()
    Dim myProcessStartInfo As New ProcessStartInfo(adobePath)
    Dim errMsg As String = String.Empty
    Dim outFile As String = String.Empty
    myProcessStartInfo.UseShellExecute = False
    myProcessStartInfo.RedirectStandardOutput = True
    myProcessStartInfo.RedirectStandardError = True

    Try

        If canIprintFile(p.sourceFolder & p.sourceFileName) Then
            isAdobeRunning(p)'Make sure Adobe is not running; wait till it's done
            Try
                myProcessStartInfo.Arguments = " /t " & """" & p.sourceFolder & p.sourceFileName & """" & " " & """" & p.destination & """"
                myProcess.StartInfo = myProcessStartInfo
                myProcess.Start()
                myProcess.CloseMainWindow()
                isAdobeRunning(p)
                myProcess.Dispose()
            Catch ex As Exception
            End Try
            p.result = "OK"
        Else
            p.result = "The file that the Document Printer is tryng to print is missing."
            sendMailNotification("The file that the Document Printer is tryng to print" & vbCrLf & _
            "is missing. The file in question is: " & vbCrLf & _
            p.sourceFolder & p.sourceFileName, p)
        End If
    Catch ex As Exception
        p.result = ex.Message
        sendMailNotification(ex.Message, p)
    Finally
        myProcess.Dispose()
    End Try
    Return p
End Function
2
anonymous

Vous aurez besoin d'Acrobat ou d'une autre application capable d'imprimer le PDF. De là, vous P/Invoke à ShellExecute pour imprimer le document.

1
plinth

Après de nombreuses recherches et recherches sur cette tâche, Microsoft a publié une excellente base de connaissances pour imprimer un pdf sans aucune autre application nécessaire. Pas besoin d'appeler Adobe ou ghostprint. Il peut imprimer sans enregistrer un fichier sur le disque rend la vie très facile.

http://support2.Microsoft.com/?kbid=322091

1
Marko

Vous pouvez également utiliser PDFsharp - c'est une bibliothèque open source pour créer et manipuler des PDF. http://www.pdfsharp.net/

1
David Duffett

Je fais la même chose pour mon projet et ça a marché pour moi

Voyez si cela peut vous aider ...

Process p = new Process();
p.EnableRaisingEvents = true; //Important line of code
p.StartInfo = new ProcessStartInfo()
{
    CreateNoWindow = true,
    Verb = "print",
    FileName = file,
    Arguments = "/d:"+printDialog1.PrinterSettings.PrinterName
};   
try
{
    p.Start();
} 
catch 
{ 
    /* your fallback code */ 
}

Vous pouvez également jouer avec différentes options de fenêtres

Commande PRINT pour obtenir la sortie souhaitée ... Lien de référence

1
Parvej Solkar