MVC 3 でサードパーティのコンポーネントを使用せずにこれを行うことができるかどうか疑問に思っていました.この種のことを行うと主張しても、コンパイルされないようです。PDF をデータベースに保存したり、データベースから取得したりするのに問題はありませんが、PDF を aFile
または aとして返すと、FileStreamResult
ユーザーはダウンロードを求められます。より望ましいアプローチは、ブラウザー内で実際に PDF をレンダリングすることです。私は iTextSHarp を見てきましたが、ある程度は機能しますが、完全な解決策ではありません。たとえば、クライアントに Adobe Reader がインストールされている場合にのみ、ビュー内に PDF が表示されます。それ以外の場合は、ダウンロードを求めるプロンプトが表示されます。技術的には、私は主にPDFビューアを探しています。何か案は?
3 に答える
試したことはありませんが、今のところこれが最善の解決策のようです。ただし、C# に移植して MVC と互換性を持たせる必要がありますが、 Syncfusion のようなサード パーティ コンポーネントを使いたくない場合は、これが適しているようです。
12月4日編集
回避策を探すのにかなりの数日を費やしましたが、かなり良い回避策を見つけたと思います。Ghostscript コンバーター用の C# ラッパーは既に多数あるので、独自のスキームを展開してみませんか? (私はそれをやった)。ラッパー:
より実用的なソリューションが必要な場合は、Codeproject に関する 2 つの素晴らしい記事があります。
Ghostscript API を使用して PDF を画像に変換する方法
C# と GhostScript を使用して PDF を一連の画像に変換する
しかし、解決策はまだ最適ではないと感じています。たとえば、Ghostscript コンバーターはファイル ディレクトリで動作します。つまり、コンバーターが動作するディスク上に PDF ファイルの物理コピーを生成する必要があります。これがバイト配列を使用して実現できれば、はるかに優れたものになります。しかし、おそらくそれに対処する方法があります。
12月21日編集
そして最後に、完全性と実際の質問への回答のために:
もう少し調査した結果、現時点で最高の PDF ビューアは素晴らしいPDF.jsライブラリであるという結論に達しました。いくつか試しましたが、今のところこれが一番です。サードパーティのコンポーネント ( Syncfusion の Pdf Viewer )も試しましたが、それでも PDF.js ほど一貫性がなく、信頼性もありませんでした。PDF.js の欠点:
- 少し混乱して使い始めるのが難しい、ドキュメントはやや弱い
- 最新のブラウザーでのみ動作します (HTML5 を多用しているため、当然のことです)。Firefox 17 と Chrome 23 で正常にテストしました。IE9 ではいくつか問題がありますが、IE10 では問題なく動作します。しかし、私はそれをまったく気にしません。Web サイトの閲覧者がアプリケーション (または他の Web アプリ) にこのような強力な機能を期待している場合、最新のテクノロジを使用する必要があります。
- PDFをバイト配列/ストリームとしてロードする方法はないようです(少なくとも私が知っていることではありません)。したがって、表示したい場合はディスクにPDFのコピーを作成する必要があります。これらのごくわずかな問題を除けば、PDF.js は本当に驚くべきものです。
ここで、PDF.js の小さいながらも完全に機能する MVC デモを作成しました。
私は iTextSharp を使用して良い結果を得ています。Adobeがインストールされていなくても、別のウィンドウでpdfを開くことができます(コンプでFoxit Readerを使用しています)。実際、私の例では、iTextSharp をまったく使用していません。
私の見解:
<a href="@Url.Action("RetreiveFile", "File", new { id = fileId })" target="_blank">
OpenPdf
</a>
私のコントローラー:
public ActionResult RetreiveFile(int id)
{
ComplexClass myClass= _FileModel.GetFile(id);
byte[] img = myClass.ContentData.ToArray();
Response.AppendHeader("Content-Disposition", "inline; filename=xyz.pdf");
return File(img, "application/pdf");
}
私のコンテンツデータはバイナリデータとしてデータベースに保存されています。
とにかく、私はあなたの質問を誤解しているかもしれませんが、これは私のプロジェクトでpdfを処理する方法であり、私のブラウザは決してpdfをダウンロードするように求めません:)
よろしく。
iTextSharpは、これに対する解決策です。