GhostScriptが-100のエラーを返す原因は何ですか?
-
30-09-2019 - |
質問
だから、私は使っています マシュー・エフライムのghostscriptsharp, 、これは、私のASP.NET MVCプロジェクトで、管理されていないWin32 GhostScript DLLのシンプルなC#ラッパーです。いくつかの背景:
私がやろうとしているのは、ユーザーにPDFをアップロードしてから、そのドキュメントを画像に変換して、選択したディレクトリに保存できるイメージに変換することです(他のOOPを行い、その新しい画像をサイトに結び付けることができます) 。
Ephraim氏のラッパークラス(GhostScriptSharp)を使用することにしました。なぜなら、それは使用するのに十分なシンプルであり、DLLのAPIへの比較的きれいなアクセスを提供するからです。
それをテストするために、Dummy C#Consoleアプリケーションを作成して、DLLをロードし、アクセスし、ローカルディスクにPDFファイルを渡してからJPGを同じローカルディスクに書き込ませることができることを確認しました。いくつかの学習経験の後、私は成功しました。 C: input.pdfを渡します。C: output.jpgを渡します。
ただし、コンソールアプリケーションでASP.NET MVCプロジェクトに入ったGhostScriptSharpコードを統合した後、P/InvokeでDLLを呼び出している場所まで、GhostScriptはINT/ERRORコードで戻ってきています -100
, 、致命的なエラーです(呼び出されます E_Fatal
GhostScriptソースコードで)。 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用に記載されているオプションを定義し、特に2つは GhostscriptDevices
と GhostscriptPageSizes
酵素。問題は、resharper(Jetbrains Visual Studioプラグイン)の書面の方法には、列挙メンバーを命名するためのデフォルトのルールがあることです。考えていないので、これらの定義をすべて修正して、これらがghostscriptに直接渡されていることに気付かないようにしてください。 a7
にとって -sPAPERSIZE
GSは得ていました A7
, 、そして -sDEVICE
それは得ていました Jpeg
それ以外の jpeg
.
当面は、私の側では許可が問題ではありませんでしたが、Visual StudioでCassini Web Devテストサーバーを実行しているからです。
有益な提案をしてくれた@MarkRedmanと@TvanFossonに感謝します!
他のヒント
-100エラーは、GhostScriptの一般的な「致命的なエラー」です。
チェックするいくつかのこと:
1)権限(AL操作にはファイルアクセスが必要)
2)スコープ、GSビンフォルダーをパス変数に追加する必要があります
3)asp.netからghostscriptを直接呼び出さないことを検討してください。GSは非常にCPU集中的であり、別のサービスでファイルを処理することができます
また、ラッパーを作成し、メール(プロフィール上のアドレス)を送ってください。送信します。これにより、GS BINフォルダーを渡すことができます。
ほとんどの場合、Webアプリケーションを実行しているプロセスには、使用しているディレクトリに書き込む許可がありません。アプリが使用する特定のディレクトリと、アプリプールを実行するために使用するローカルIDを作成し、そのIDに作成したディレクトリを読み取り/書き込むのに十分な特権を与えることをお勧めします。