À 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.
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!
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
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.
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.
Vous pouvez également utiliser PDFsharp - c'est une bibliothèque open source pour créer et manipuler des PDF. http://www.pdfsharp.net/
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