2013-02-27 106 views
7

私たちは、PDFを生成して画面に表示したり、どこかに簡単にアクセスしてアクセスできるようにするASP.Net MVCアプリケーションを作成しています。私たちはPdfSharpを使って文書を生成しています。それが終わったら、ユーザーに文書を保存させたり、読者に開く方法を教えてください。 PDFはサーバーサイドで生成されるため、私は特に混乱していますが、クライアントサイドに表示する必要があります。ここでASP.Net MVCでPdfSharpを使用してPDFを表示するにはどうすればよいですか?


我々はこれまでに書いたレポートを作成するには、MVCコントローラです:

public class ReportController : ApiController 
{ 
    private static readonly string filename = "report.pdf"; 

    [HttpGet] 
    public void GenerateReport() 
    { 
     ReportPdfInput input = new ReportPdfInput() 
     { 
      //Empty for now 
     }; 

     var manager = new ReportPdfManagerFactory().GetReportPdfManager(); 
     var documentRenderer = manager.GenerateReport(input); 
     documentRenderer.PdfDocument.Save(filename); //Returns a PdfDocumentRenderer 
     Process.Start(filename); 
    } 
} 

これを実行すると、私はdocumentRenderer.PdfDocument.Save(filename);UnauthorizedAccessExceptionを得ると言うこと、Access to the path 'C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\10.0\report.pdf' is denied.私もわからないんだけど行Process.Start(filename);が実行されるとどうなりますか?

これはmanager.GenerateReport(input)のコードです:

public class ReportPdfManager : IReportPdfManager 
{ 
    public PdfDocumentRenderer GenerateReport(ReportPdfInput input) 
    { 
     var document = CreateDocument(input); 
     var renderer = new PdfDocumentRenderer(true, PdfSharp.Pdf.PdfFontEmbedding.Always); 
     renderer.Document = document; 
     renderer.RenderDocument(); 

     return renderer; 
    } 

    private Document CreateDocument(ReportPdfInput input) 
    { 
     //Put content into the document 
    } 
} 

答えて

6

私は鋭いが、機能に建て経由MVCはほとんど行われているためPDFで慣れていませんよ。あなたは、バイトの配列として表されるPDF文書を取得する必要があります。次に、MVCのFileメソッドを使用してブラウザに戻し、ダウンロードを処理させます。彼らのクラスにそれを行う方法はありますか? Yarxの提案とPDFsharpチームのチュートリアルを使用して

public class PdfDocumentController : Controller 
{ 
    public ActionResult GenerateReport(ReportPdfInput input) 
    { 
     //Get document as byte[] 
     byte[] documentData; 

     return File(documentData, "application/pdf"); 
    } 

} 
+3

ありバイト配列を取得してMVCなしでユーザーに返す方法を示しています。 MVCを使用すると、バイト配列を取得するためのコードが必要になります(メモリストリームからファイルは必要ありません)。サンプル:http://www.pdfsharp.net/wiki/Clock-sample.ashx –

+2

新しいユーザーの場合、少し混乱してしまうので、あなたは(NickAlbrecht)@ PDFsharpTeamのような正確なことを行うために答えを更新するのは難しいでしょうヘルパーリンク。 [** MemoryStream stream =新しいMemoryStream(); //// document.Save(stream、false); //// Byte [] documentBytes = stream.ToArray(); //// return file(documentBytes、 "application/pdf"); **](これは大変助けになりました。ありがとう!!!) –

11

、これは我々がになってしまったコードは次のとおりです。

コントローラー:

[HttpGet] 
public ActionResult GenerateReport(ReportPdfInput input) 
{ 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     var manager = new ReportPdfManagerFactory().GetReportPdfManager(); 
     var document = manager.GenerateReport(input); 
     document.Save(stream, false); 
     return File(stream.ToArray(), "application/pdf"); 
    } 
} 

ReportPdfManager:ウェブサンプルが

public PdfDocument GenerateReport(ReportPdfInput input) 
{ 
    var document = CreateDocument(input); 
    var renderer = new PdfDocumentRenderer(true, 
     PdfSharp.Pdf.PdfFontEmbedding.Always); 
    renderer.Document = document; 
    renderer.RenderDocument(); 

    return renderer.PdfDocument; 
} 

private Document CreateDocument(ReportPdfInput input) 
{ 
    //Creates a Document and puts content into it 
} 
+0

FYI: 'document.Save(stream、false)'行は、 'stream'を' Save'を呼び出す副作用として閉じてはならないことを示す 'false'この動作は、次の行で 'stream.ToArray'を呼び出すために必要であり、使用した' using'ブロックが期待どおりに動作するようにします。 – Kevin

+0

DLLをダウンロードして参照しましたが、ReportPdfInput ..が見つかりません。 – Murphybro2

+0

@ Murphybro2 'ReportPdfInput'は、私たちが望むPDFをレンダリングするのに必要なすべての情報を含む、私たちが書いたクラスでした。それは図書館の一部ではありません。混乱させて申し訳ありません! – Kevin

関連する問題