Pregunta

Por lo tanto, estoy usando Mateo Ephraim , que es un simple C # envoltorio para el Win32 no administrada Ghostscript DLL en mi proyecto de ASP.Net MVC. Algunos antecedentes:

Lo que estoy tratando de hacer es tener un usuario cargar un archivo PDF, y luego convertir ese documento en una imagen que luego puedo guardar apagado en cualquier directorio elijo (así como hacer alguna otra programación orientada a objetos para atar esa nueva imagen para mi sitio).

decidí usar clase contenedora del señor Efraín (GhostscriptSharp) porque era bastante simple de usar, y me da un acceso relativamente limpia a la API de la DLL.

Para probarlo, he creado una aplicación de consola # ficticia C para asegurarse de que pudiera cargar el archivo DLL, acceder a ella, la mano que un archivo PDF en el disco local y luego tener que escribir un archivo JPG en el mismo disco local. Después de unas pocas experiencias de aprendizaje, he tenido éxito. Me entregarlo C: \ input.pdf, me entregaría C: \ output.jpg.

Sin embargo, después de integrar el código GhostScriptSharp que tenía en la aplicación de consola en mi proyecto de ASP.NET MVC hasta el punto de donde yo estaba llamando a la DLL con P / Invoke, Ghostscript está regresando con el código -100 int / error, que es un error fatal (se llama E_Fatal en el código fuente GhostScript). Me sale el mismo resultado tanto con el archivo que se carga a través del formulario HTML, y si entrego las mismas rutas rígida exactas que he usado en mi aplicación de consola de trabajo.

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);
}

Es evidente que la excepción se produce porque result es -100.

Cuando InitAPI se llama, el PTR es un ejemplo int válida (aunque no sé si la instancia de GS es correcta o no), args tiene una longitud de 20 (es un string[]) de opciones de Ghostscript válidos (incluyendo los caminos escapado correctamente-a mis archivos de entrada y de salida).

Para acortar una larga historia, ¿qué estoy haciendo mal? El código de error -100 parece como un cajón de sastre, porque no hay documentación que los estados lo que posiblemente podría ir mal aquí.

Cualquier ayuda es muy apreciada, gracias de antemano.

¿Fue útil?

Solución 3

Así, terminó siendo un id10t que me estaba desbaratando aquí, en este caso específico.

Código de GhostscriptSharp En Mateo Ephraim, que utiliza un par de enumeraciones para definir las opciones establecidas para Ghostscript, y dos en particular eran las enumeraciones GhostscriptDevices y GhostscriptPageSizes. El problema es que la forma en que están escritas ReSharper (JetBrains Visual Studio plug-in) tiene reglas predeterminadas para nombrar a los miembros de enumeración. Sin pensar, me fijo todas estas definiciones para complacer ReSharper sin darse cuenta de que tienen que hacerse pasar directamente a Ghostscript, así que en vez de conseguir a7 para GS -sPAPERSIZE estaba A7, y por -sDEVICE se estaba haciendo Jpeg en lugar de jpeg.

Por el momento, los permisos no eran un problema en mi final, pero sólo porque corro el servidor de prueba web dev Cassini en Visual Studio.

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

Otros consejos

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

Algunas cosas a comprobar:

1) permisos (AL operaciones requieren el acceso a archivos)

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

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

También han creado un envoltorio, me envía un correo electrónico (dirección en el perfil) y yo le le envíe. Le permite a uno pasar en la carpeta bin GS que ayuda.

Lo más probable es que el proceso que se ejecuta la aplicación web no tiene permiso para escribir en los directorios que está utilizando. Me gustaría sugerir la creación de algún directorio específico para la aplicación de uso y un ID local a utilizar para ejecutar el grupo de aplicaciones, a continuación, dar ese id suficientes privilegios para leer / escribir el directorio que ha creado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top