18

したがって、私はMatthew Ephraim の GhostscriptSharpを使用しています。これは、ASP.Net MVC プロジェクトのアンマネージ Win32 Ghostscript DLL の単純な C# ラッパーです。背景:

私がやろうとしているのは、ユーザーに 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 code を返します-100。これは致命的です。エラー ( E_FatalGhostScript ソース コードで呼び出されます)。HTML フォームを介してアップロードされたファイルと、作業中のコンソール アプリケーションで使用したのとまったく同じハードコードされたパスを渡した場合の両方で、同じ結果が得られます。

参考までに、例外がスローされる行は、GhostScriptSharp.cs (CallApi関数内) の 93 ~ 97 行です。

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

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

resultisであるため、明らかに例外がスローされます-100

InitAPI が呼び出されると、インスタンス ptr は有効ですint(ただし、GS のインスタンスが正しいかどうかはわかりません)。args の長さは 20 (ですstring[]) の有効な GhostScript オプション (正しくエスケープされたパスを含む)入力および出力ファイルに)。

簡単に言えば、私は何が間違っているのですか?-100ここで問題が発生する可能性があることを示すドキュメントがないため、エラー コードはすべてを網羅しているように見えます。

どんな助けでも大歓迎です、事前に感謝します。

4

3 に答える 3

13

-100 エラーは、GhostScript の一般的な「致命的なエラー」です。

いくつかの確認事項:

1) 権限 (すべての操作にはファイル アクセスが必要です)

2) スコープ、GS bin フォルダーを PATH 変数に追加したい

3) asp.net から直接 GhostScript を呼び出さないことを検討してください。GS は CPU を集中的に使用する可能性があり、別のサービスでファイルを処理するのではなく、

ラッパーも作成しました。メール (プロフィールのアドレス) を送ってください。お送りします。役立つ GS bin フォルダーを渡すことができます。

于 2010-12-02T22:14:26.083 に答える
4

そのため、この特定のインスタンスでここで私を脱線させていた ID10T エラーになりました。

Matthew Ephraim の GhostscriptSharp コードでは、いくつかの列挙型を使用して Ghostscript のオプションを定義していますが、特に 2 つが列挙型GhostscriptDevicesGhostscriptPageSizes列挙型でした。問題は、Resharper (Jetbrains Visual Studio プラグイン) の記述方法に、Enum メンバーの命名に関する既定の規則があることです。a7何も考えず、Resharper がこれらが Ghostscript に直接渡されることに気付かないように、これらの定義をすべて-sPAPERSIZE修正A7-sDEVICEましJpegjpeg

当分の間、権限は私の側では問題ではありませんでしたが、Visual Studio で Cassini Web 開発テスト サーバーを実行したためです。

有益な提案をしてくれた @MarkRedman と @tvanfosson に感謝します!

于 2010-12-06T17:08:00.363 に答える
3

ほとんどの場合、Web アプリケーションを実行しているプロセスには、使用しているディレクトリへの書き込み権限がありません。アプリが使用する特定のディレクトリと、アプリ プールを実行するために使用するローカル ID を作成し、作成したディレクトリの読み取り/書き込みに十分な権限をその ID に付与することをお勧めします。

于 2010-12-02T22:02:46.450 に答える