2010-12-02 17 views
13

Por lo tanto, estoy usando Matthew Ephraim's GhostscriptSharp, que es un contenedor simple de C# para la DLL Win32 Ghostscript no administrada en mi proyecto ASP.Net MVC. Algunos antecedentes:¿Qué causa que Ghostscript devuelva un error de -100?

Lo que intento hacer es que un usuario cargue un PDF y luego convierta ese documento en una imagen que luego pueda guardar en el directorio que elija (así como también hacer otro OOP para empatar) esa nueva imagen en mi sitio).

Decidí usar la clase contenedora del Sr. Ephraim (GhostscriptSharp) porque era lo suficientemente simple de usar, y me da un acceso relativamente limpio a la API de la DLL.

Para probarlo, creé una aplicación de consola C# ficticia para asegurarme de que podía cargar la DLL, acceder a ella, entregarle un archivo PDF en el disco local y luego escribir un JPG en el mismo disco local. Después de algunas experiencias de aprendizaje, tuve éxito. Lo entregaría C: \ INPUT.pdf, me daría C: \ OUTPUT.jpg.

Sin embargo, después de integrar el código GhostScriptSharp que tenía en la aplicación de la consola en mi proyecto ASP.NET MVC al punto donde estaba llamando al DLL con P/invoke, Ghostscript vuelve con el código int/error -100 , que es un error fatal (se llama E_Fatal en el código fuente de GhostScript). Obtengo el mismo resultado con el archivo que se carga a través del formulario HTML, y si le doy las mismas rutas exactas que utilicé en mi aplicación de la consola en funcionamiento.

Para referencia, las líneas que se produce la excepción son 93-97 en GhostScriptSharp.cs (que está en la función CallApi):

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

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

Obviamente la excepción se produce porque result es -100.

Cuando InitAPI se llama, el PTR es un ejemplo válido int (aunque no sé si la instancia de GS es correcta o no), args tiene una longitud de 20 (es una string[]) de opciones de Ghostscript válidos (incluyendo las rutas escapadas correctamente a mis archivos de entrada &).

Para resumir, ¿qué estoy haciendo mal? El código de error -100 parece un cajón de sastre porque no hay documentación que indique qué podría estar yendo mal aquí.

Cualquier ayuda es muy apreciada, gracias de antemano.

Respuesta

3

Por lo tanto, terminó siendo un error ID10T que me descarriló aquí en esta instancia específica.

En el código GhostscriptSharp de Matthew Ephraim, usa un par de enumeraciones para definir las opciones establecidas para Ghostscript, y dos en particular fueron las enumeraciones GhostscriptDevices y GhostscriptPageSizes. El problema es que la forma en que se escriben Resharper (complemento Jetbrains Visual Studio) tiene reglas predeterminadas para nombrar miembros de Enum. No estoy pensando, arreglé todas estas definiciones para complacer a Resharper sin darme cuenta de que se pasan directamente a Ghostscript, así que en lugar de obtener a7 para -sPAPERSIZE, GS obtenía A7, y para -sDEVICE obtenía Jpeg en lugar de jpeg.

Por el momento, los permisos no fueron un problema para mí, pero solo porque ejecuté el servidor de prueba de desarrollo web Cassini en Visual Studio.

¡Gracias a @MarkRedman y @tvanfosson por sus útiles sugerencias!

3

Es muy probable que el proceso que ejecuta la aplicación web no tenga permiso para escribir en los directorios que está utilizando. Sugiero crear un directorio específico para la aplicación y un ID local para usarlo para ejecutar el grupo de aplicaciones, luego otorgue a ese ID los privilegios suficientes para leer/escribir el directorio que ha creado.

+0

En primer lugar, he escuchado que si estoy ejecutando la aplicación web con el servidor de desarrollo ASP.Net que opera con los permisos de mi usuario local, que soy administrador en mi máquina local y ahí es donde están los archivos ... Dos, antes en la aplicación incluso antes de usar GhostscriptSharp, mi aplicación crea los directorios específicos en los que entran el PDF y los JPG, por lo que también indicaría que tiene permisos de escritura correctos, ¿correcto? – Mattygabe

+0

@Mattygabe - eso es cierto siempre que estés corriendo en Cassini. No estoy seguro de cuál podría ser el problema. – tvanfosson

10

El error -100 es un "error fatal" genérico en GhostScript.

Algunas cosas a comprobar:

1) permisos (AL operaciones requieren acceso a archivos)

2) Ámbito de aplicación, que desea agregar la carpeta bin GS a las variables PATH

3) Considere no llamar a GhostScript directamente desde asp.net, GS puede ser muy intensivo en la CPU, en lugar de procesar archivos en un servicio separado

También he creado un contenedor, envíeme un correo electrónico (dirección en el perfil) y se lo enviaré. Le permite a uno pasar en la carpeta GS bin que ayuda.

+0

¿Para qué cuentas de usuario debo verificar los permisos? ¿Algo así como los del grupo de usuarios IIS_IUSRS? – Mattygabe

+0

Sí, la cuenta de usuario utilizada para ejecutar la aplicación, la misma en el grupo de aplicaciones (usamos un usuario nombrado agregado a los usuarios/grupo de trabajo de IIS. Este usuario debe tener los permisos correctos en las carpetas donde se generan archivos, etc./permisos completos para probar) HTH –

+0

Además, cuando instalo GS, selecciono "para todos los usuarios" en la configuración y también agrego la carpeta GS bin a las variables de entorno% PATH% en la máquina ... –

Cuestiones relacionadas