Domanda

Quindi, io sto usando Matthew Efraim , che è un semplice C # wrapper per il non gestito Win32 DLL di Ghostscript nel mio progetto ASP.Net MVC. Alcuni retroscena:

Quello che sto cercando di fare è avere un utente caricare un file PDF e quindi convertire il documento in un'immagine che posso quindi salvare fuori in qualunque directory scelgo (così come fare qualche altra OOP per legare che nuova immagine a il mio sito).

Ho deciso di usare classe wrapper del signor Ephraim (GhostscriptSharp) perché era abbastanza semplice da usare, e mi dà l'accesso relativamente pulito per API della DLL.

Per provarlo, ho creato un manichino C # applicazione console per assicurarsi che ho potuto caricare la DLL, accedervi, mano un file PDF sul disco locale e poi lo hanno scrivere JPG nello stesso disco locale. Dopo alcune esperienze di apprendimento, ho avuto successo. Vorrei consegnarlo C: \ input.pdf, che mi avrebbe portata di mano C: \ OUTPUT.jpg.

Tuttavia, dopo aver integrato il codice GhostScriptSharp che ho avuto nella console nel mio progetto ASP.NET MVC al punto di dove stavo chiamando la DLL con P / Invoke, Ghostscript sta tornando con il codice di int / errore -100, che è un errore fatale (viene chiamato E_Fatal nel codice sorgente GhostScript). Ottengo lo stesso risultato sia con il file che è caricato attraverso il form HTML, e se mi passi la stessa identica percorsi hard-coded che ho usato nella mia applicazione console di lavoro.

Per riferimento, le linee che viene generata l'eccezione sono 93-97 in GhostScriptSharp.cs (che è in funzione CallApi):

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

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

Ovviamente l'eccezione viene generata perché result è -100.

Quando InitAPI viene chiamato, il PTR esempio è un int valida (anche se non so se l'istanza di GS è corretto o meno), args ha una lunghezza di 20 (è un string[]) di opzioni di Ghostscript validi (compresi i percorsi correttamente-sfuggiti ai miei file di input e di output).

Per farla breve, quello che sto facendo di sbagliato? Il -100 codice di errore sembra un catch-all, perché non v'è alcuna documentazione che gli Stati che cosa potrebbe andare male qui.

Ogni aiuto è molto apprezzato, grazie in anticipo.

È stato utile?

Soluzione 3

Quindi, ha finito per essere un errore ID10T che mi è stato deragliare qui, in questo caso specifico.

Codice GhostscriptSharp di In Matteo Efraim, egli usa un paio di enumerazioni di definire le opzioni previste per Ghostscript, e due in particolare erano i GhostscriptDevices e GhostscriptPageSizes enumerazioni. Il problema è che il modo in cui sono scritti ReSharper (JetBrains Visual Studio plugin) ha regole predefinite per la denominazione membri Enum. Senza pensare, ho sistemato tutte queste definizioni per compiacere ReSharper non rendendosi conto che questi sono passati direttamente a Ghostscript, così invece di ottenere a7 per GS -sPAPERSIZE stava diventando A7, e per -sDEVICE si stava facendo Jpeg invece di jpeg.

per l'essere permessi di tempo non erano un problema da parte mia, ma solo perché ho eseguito il test server web dev Cassini in Visual Studio.

Grazie a @MarkRedman e @tvanfosson per i loro utili suggerimenti!

Altri suggerimenti

L'errore -100 è un generico "errore fatale" in GhostScript.

Un paio di cose da controllare:

1) Permessi (AL operazioni richiedono l'accesso ai file)

2) Ambito di applicazione, si desidera aggiungere alla cartella bin GS alle variabili PATH

3) Prendere in considerazione non chiamare GhostScript direttamente da asp.net, GS può essere molto impegnativo per la CPU, piuttosto elaborare file in un servizio separato

Ho anche creato un involucro, mandami una e-mail (indirizzo su profilo) e io lo invierà voi. Essa permette di passare nella cartella bin GS che aiuta.

Molto probabilmente il processo in esecuzione l'applicazione Web non ha il permesso di scrittura alle directory che si sta utilizzando. Io suggerirei di creare una directory specifica per l'applicazione per l'uso e un id locale da utilizzare per eseguire il pool di app, quindi dare quel id privilegi sufficienti per leggere / scrivere la cartella che hai creato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top