Question

Alors, je me sers Matthew Ephraim GhostscriptSharp de , qui est un simple wrapper C # pour la DLL non gérée Win32 Ghostscript dans mon projet ASP.Net MVC. Un peu d'histoire:

Qu'est-ce que je tente de faire est d'avoir un utilisateur de télécharger un fichier PDF, puis convertir ce document en une image que je peux ensuite mettre hors circuit dans quel répertoire je choisis (ainsi que faire une autre OOP pour attacher cette nouvelle image mon site).

J'ai décidé d'utiliser la classe wrapper de M. Ephraim (de GhostscriptSharp) parce qu'il était assez simple à utiliser, et il me donne un accès relativement propre à l'API de la DLL.

Pour le tester, je créé une application C # console factice pour vous assurer que je pouvais charger la DLL, d'y accéder, la main un fichier PDF sur le disque local et ensuite écrire un JPG sur le même disque local. Après quelques expériences d'apprentissage, j'ai eu le succès. Je remettre C: \ input.pdf, il me remettrait C: \ OUTPUT.jpg.

Cependant, après avoir intégré le code GhostScriptSharp que j'avais dans l'application de la console dans mon projet ASP.NET MVC au point où j'appelle la DLL avec P / Invoke, Ghostscript revient avec le code int / erreur -100, qui est une erreur fatale (que l'on appelle E_Fatal dans le code source GhostScript). Je reçois le même résultat à la fois le fichier téléchargé via le formulaire HTML, et si je le remets exactement les mêmes chemins codés en dur que j'ai utilisé dans mon application console de travail.

Pour référence, les lignes qui l'exception est levée sont 93-97 en GhostScriptSharp.cs (qui est dans la fonction de CallApi):

int result = InitAPI(gsInstancePtr, args.Length, args);

if (result < 0) {
  throw new ExternalException("Ghostscript conversion error", result);
}

Il est évident que l'exception est levée parce result est -100.

Quand InitAPI est appelée, le PTR d'instance est un int valide (bien que je ne sais pas si l'instance de GS est correcte ou non), args a une longueur de 20 (est un string[]) d'options valides Ghostscript (y compris les chemins correctement-échappées à mes fichiers d'entrée et de sortie).

Longue histoire courte, ce que je fais mal? Le code d'erreur -100 apparaît comme un fourre-tout parce qu'il n'y a pas de documentation que les États qui pourraient aller mal ici.

Toute aide est très appréciée, merci d'avance.

Était-ce utile?

La solution 3

Alors, a fini par être une erreur de ID10T qui me dérailler ici dans ce cas spécifique.

Dans Matthieu code d'Ephraïm GhostscriptSharp, il utilise quelques énumérations pour définir les options définies pour Ghostscript, et deux en particulier ont été les énumérations GhostscriptDevices et GhostscriptPageSizes. Le problème est, la façon dont ils sont écrits ReSharper (JetBrains plug-in Visual Studio) a des règles par défaut pour nommer les membres Enum. Ne pas penser, je fixe toutes ces définitions pour plaire ReSharper sans se rendre compte que ceux-ci sont transmis directement à Ghostscript, donc au lieu d'obtenir a7 pour -sPAPERSIZE GS obtenait A7, et pour -sDEVICE il devenais Jpeg au lieu de jpeg.

Pour les autorisations étant de temps n'étaient pas un problème sur ma fin, mais seulement parce que je lance le serveur de test dev web Cassini dans Visual Studio.

Merci à @MarkRedman et @tvanfosson pour leurs suggestions utiles!

Autres conseils

L'erreur -100 est une "erreur fatale" générique Ghostscript.

Quelques choses à vérifier:

1) Autorisations (al opérations exigent l'accès aux fichiers)

2) Champ d'application, vous souhaitez ajouter le dossier bin GS aux variables PATH

3) Ne tenez pas compte appeler Ghostscript directement à partir asp.net, GS peut être très consommateur d'UC, plutôt des fichiers de traitement dans un service séparé

J'ai aussi créé une enveloppe, envoyez-moi un e-mail (adresse sur le profil) et je vais vous l'envoyer. Elle permet de passer dans le dossier bin GS qui aide.

Très probablement le processus en cours d'exécution de l'application Web n'a pas l'autorisation d'écriture aux répertoires que vous utilisez. Je vous suggère de créer un répertoire spécifique pour l'application à utiliser et un identifiant local à utiliser pour exécuter le pool d'applications, puis donner assez de privilèges que id pour lire / écrire le répertoire que vous avez créé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top