2012-09-10 3 views
1

mon problème est: j'utilise ghostscript pour transformer certains fichiers PDF en fichiers jpeg puis les rendre dans un contrôle silverlight. Je transformais le fichier pdf en utilisant:Ghostscript plante le serveur

public void PdfToJpg(string ghostScriptPath, string input, string output) { 
      timer1.Enabled = true; 
      //if the pdf has more than 1 file (ex. 3) then 3 jpeg files will be outputed 
      String ars = "-dNOPAUSE -sDEVICE=jpeg -r300 -o" + output + "-%d.jpeg " + input; 
      ProcessStartInfo startInfo = new ProcessStartInfo(); 
      startInfo.WindowStyle = ProcessWindowStyle.Hidden; 
      startInfo.Arguments = ars; 
      startInfo.FileName = ghostScriptPath; 
      startInfo.WindowStyle = ProcessWindowStyle.Hidden;    
      using (Process exeProcess = Process.Start(startInfo)) { 
       exeProcess.WaitForExit(); 
      }   
     } 

puis enregistrez le numéro de page et l'octet page [] dans un dictionnaire, le dictionnaire dans une session et l'envoyer avec un service permis silverlight, et de les envoyer à la page ASPX que contient le contrôle silverlight (avec Response.redirect (page.aspx)). Tout fonctionne bien mais parfois le serveur (Cassini ou IIS) tombe en panne, ce qui signifie que les fichiers sont convertis mais que la redirection ne se produit jamais, simplement la page reste en état de chargement. Je dois fermer le cassini avec "End Process" ou Redémarrer le serveur IIS afin que le processus fonctionne à nouveau. Je ne pense pas que le problème est avec le service parce que j'ai un processus similaire à envoyer à l'application Silverlight un octet [] de fichier audio et tout fonctionne bien, le serveur ne reste jamais bloqué, donc je pense que c'est à cause de ghostscript .. ., Si quelqu'un a des idées. Aussi j'utilise elmah et aucune erreur n'est signalée ... et quand dans le débogage quand je clique sur le bouton d'affichage qui contient la conversion et d'autres parties du processus il n'entrent pas l'événement de clic mais la conversion est faite (pas la redirection), je ne sais pas comment c'est possible ..., merci. si sûr est quelque chose avec Ghostscript

MISE À JOUR: j'ai changé mon code pour:

 using (Process convertProc = new Process()) { 
       convertProc.StartInfo.FileName = ghostScriptPath; 
       convertProc.StartInfo.Arguments = args; 
       //convertProc.StartInfo.UseShellExecute = false; 
       //convertProc.StartInfo.RedirectStandardOutput = true; 
       convertProc.StartInfo.CreateNoWindow = true; 
       convertProc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
       convertProc.Start(); 
       ThreadedKill(convertProc.Id); 
       convertProc.PriorityClass = ProcessPriorityClass.Normal; 
       convertProc.WaitForExit(); 
       } 

et si le UseShellExecute et redirectoutput sont commentées le serveur va « sauvage » parfois et sinon, le code court parfait à chaque fois, mais avec cela la fenêtre du processus ghostscript apparaît, je ne veux pas ça. Pour ne pas apparaître je dois commenter thise lignes ou mettre useshellexecute à true et commenter redirectoutput qui cause l'échec parfois. Que puis-je faire? et ce qui est redirectStandardOutput et ce qu'il fait ..., dind't comprendre sur MSDN ...

MISE À JOUR 2: a changé mon gswin64.exe à gswin64c.exe pour l'application de console et maintenant cette fenêtre dont je parlais isn Je ne montre plus. Aucun code devenu fou ..., du moins pas encore ..

+0

Pour résoudre ce problème, vous devez probablement fournir des informations plus spécifiques sur l'erreur, par ex. une exception avec une trace de pile ou au moins un code d'erreur Windows. Qu'est-ce qui est enregistré dans le journal des événements? –

+0

c'est le problème, aucune exception, aucune erreur dans l'Observateur d'événements, rien .., dans TaskManager le gswin64.exe ne fonctionne pas lorsque la pendaison se produit. – adi1989

+0

GPL Ghostscript 9.06 (2012-08-08) gswin64.exe – adi1989

Répondre

1

D'abord, vous n'avez pas besoin -dNOPAUSE parce que le -o implique -dBATCH et -dNOPAUSE mais il ne fait pas mal.

Ce problème est-il «intermittent»? Ou si vous envoyez un fichier qui se bloque (bloque le serveur?) À plusieurs reprises: est-il suspendu à chaque fois, ou plus fréquemment avec ce fichier particulier?

Si cela est vraiment intermittent, il est peu probable que ce soit Ghostscript.

Pour capturer stdout et stderr de Ghostscript dans des fichiers, vous pouvez ajouter le -sstdout=___.out et -sstderr=___.err pour voir si Ghostscript est plaint. Si vous écrivez toujours les mêmes fichiers, le contenu après l'erreur vous indiquera si des messages ont été générés par gswin * .exe.

L'ajout de -Z: ajoutera également des informations de synchronisation à la sortie Ghostscript.

Notez que puisque vous utilisez -r300 pour la sortie JPEG: si Ghostscript est un arrêt inattendu, il y aura deux fichiers dans le répertoire TEMP qui commencent par et ont l'extension .tmp. Ceux-ci sont créés pour les fichiers "clist" basés sur disque utilisés pour la mise en bande (les pages de format lettre de 300 dpi sont suffisamment grandes pour dépasser la valeur par défaut -dMaxBitmap=____ de 8m).

Si vous ne voyez pas une accumulation de fichiers te_XXXXX.tmp dans votre dossier TEMP, Ghostscript ne plante (probablement) pas.

+0

aucun fichier 'tt' dans le répertoire TEMP ..., peu importe le fichier que j'envoie, quand il se bloque, tous les fichiers que j'envoie après que cela ne fonctionne pas, il convertit en fichiers jpeg mais le reste de mon code dans codebehind n'est pas exécuté. Et comment le commandement devrait être? : -sstdout = fichier.out -sstderr = fichier2.err -sDEVICE = jpeg -r300 -o "+ sortie +" -% d.jpeg "+ entrée ;, où les fichiers .err et .out doivent être? can \ t les trouver n'importe où, ou c'est parce que gs ne produit pas d'erreurs?, maintenant j'ai trouvé un fichier pdf qui n'est pas du tout transformé par gs et je pense qu'il devrait montrer un log ou quelque chose ..., merci – adi1989