2010-12-02 50 views
13

因此,我使用的是Matthew Ephraim's GhostscriptSharp,它是我的ASP.Net MVC項目中的非託管Win32 Ghostscript DLL的簡單C#包裝。一些背景:什麼導致Ghostscript返回-100的錯誤?

我想要做的是有一個用戶上傳PDF文件,然後將該文件轉換成一個圖像,然後我可以保存到我選擇的任何目錄(以及做一些其他OOP綁定那個新的圖像到我的網站)。

我決定使用Ephraim先生的包裝類(GhostscriptSharp),因爲它使用起來很簡單,它使我能夠相對乾淨地訪問DLL的API。

爲了測試它,我創建了一個虛擬的C#控制檯應用程序,以確保我可以加載DLL,訪問它,在本地磁盤上傳遞PDF文件,然後讓它將JPG寫入同一本地磁盤。經過一些學習經歷,我獲得了成功。我會把它交給C:\ INPUT.pdf,它會交給我C:\ OUTPUT.jpg。

但是,將我在控制檯應用程序中使用的GhostScriptSharp代碼集成到我的ASP.NET MVC項目中,並將其與P/invoke調用DLL的位置相集成後,Ghostscript將返回int/error代碼-100 ,這是一個致命錯誤(在GhostScript源代碼中稱爲E_Fatal)。我通過HTML表單上傳的文件獲得了相同的結果,並且如果我將它用於我的工作控制檯應用程序中使用的完全相同的硬編碼路徑,則會得到相同的結果。

作爲參考,該引發異常的線在GhostScriptSharp.cs 93-97(這是在CallApi功能):

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

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

顯然拋出異常因爲result-100

當InitAPI被調用時,實例ptr是一個有效的int(雖然我不知道GS的實例是否正確),args的長度爲20(是string[])有效的GhostScript選項包括正確轉義的輸入文件路徑&)。

長話短說,我做錯了什麼?錯誤代碼-100看起來像一個全面的,因爲沒有文件說明什麼可能會在這裏出錯。

任何幫助非常感謝,提前謝謝。

回答

3

因此,最終成爲了一個ID10T錯誤,在這個特定的實例中,這個錯誤讓我在這裏出軌。

在Matthew Ephraim的GhostscriptSharp代碼中,他使用了幾個枚舉來定義爲Ghostscript設置的選項,其中兩個特別是GhostscriptDevicesGhostscriptPageSizes枚舉。問題是,他們編寫的方式Resharper(Jetbrains Visual Studio插件)具有用於命名Enum成員的默認規則。沒有想到,我解決了所有這些定義,請Resharper沒有意識到這些是直接傳遞給Ghostscript,所以a7代替-sPAPERSIZE GS代替A7-sDEVICE代替jpeg代替。

目前,權限對我來說不是問題,但只是因爲我在Visual Studio中運行了Cassini Web Dev測試服務器。

感謝@MarkRedman和@tvanfosson提供了有用的建議!

3

運行Web應用程序的進程很可能沒有寫入您正在使用的目錄的權限。我建議爲要使用的應用程序創建一個特定的目錄,並使用本地ID來運行應用程序池,然後爲該ID提供足夠的權限來讀取/寫入您創建的目錄。

+0

一,我聽說如果我用ASP.Net開發服務器運行Web應用程序,它使用我本地用戶的權限運行,我在本地計算機上管理員,這就是文件所在的位置。二,在使用GhostscriptSharp之前,在應用程序的早期階段,我的應用程序會創建PDF和JPG進入的特定目錄,這樣也會表明它具有適當的寫入權限,對嗎? – Mattygabe 2010-12-02 22:10:54

+0

@Mattygabe - 只要你在卡西尼跑步,這就是真的。不知道可能是什麼問題。 – tvanfosson 2010-12-02 22:15:02

10

-100錯誤是GhostScript中的通用「致命錯誤」。

有幾件事情要檢查:

1)權限(人操作需要的文件訪問)

2)適用範圍,要在GS bin文件夾添加到PATH變量

3)考慮不要直接從asp調用GhostScript。淨,GS可以是非常CPU的密集型,而是在一個單獨的服務處理文件

我也創建了一個包裝,給我發一封電子郵件(地址在配置文件),我會把它發送給你。它允許一個傳入GS bin文件夾,這有助於。

相關問題