2013-02-27 9 views
7

Bir PDF oluşturup ekrana göstermesi veya kullanıcının erişebileceği bir yere kaydetmesi gereken bir ASP.Net MVC uygulaması yapıyoruz. Belgeyi oluşturmak için PdfSharp kullanıyoruz. Tamamlandığında, kullanıcının belgeyi kaydetmesine veya bir okuyucuda açmasına nasıl izin veririz? Özellikle sunucu tarafında üretildiğinden, ancak istemci tarafında görünmesini istediğimiz için kafam karıştı. Ben diyor documentRenderer.PdfDocument.Save(filename);, Access to the path 'C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\10.0\report.pdf' is denied. bir UnauthorizedAccessException Ben de emin değilim olsun bu çalıştırırASP.Net MVC'de PdfSharp kullanarak nasıl PDF görüntüleyebilirim?

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); 
    } 
} 

: Burada


şu ana kadar yazdım rapor oluşturmak için MVC denetleyicisi olan Process.Start(filename); satırı çalıştırıldığında ne olur.

Bu

manager.GenerateReport(input) yılında kodudur:

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 
    } 
} 

cevap

6

Ben keskin PDF ile familar değilim ama işlevselliği bulunan aracılığıyla MVC için çoğunlukla yapılır. Pdf belgenizi bir bayt dizisi olarak göstermeniz gerekir. Ardından, tarayıcıya döndürmek ve indirme işlemine izin vermek için MVC'nin Dosya yöntemini kullanmanız yeterlidir. Bunu yapmak için sınıfında herhangi bir yöntem var mı? Yarx önerisini ve PDFsharp Ekibi'nin öğretici kullanarak

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

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

} 
+3

yoktur Bu bayt dizisi almak ve MVC olmadan kullanıcıya döndürmek nasıl gösterir. MVC ile sadece bayt dizisini (bellek akışından, herhangi bir dosyaya gerek duymadan) almak için koda ihtiyacınız vardır. Örnek: http://www.pdfsharp.net/wiki/Clock-sample.ashx –

+2

Yeni kullanıcılar için biraz kafa karıştırıcı olur, bu yüzden (NickAlbrecht) yanıtı @PDFsharpTeam gibi bir şey yapmak için güncellemeyi zahmetli yaparsınız. yardımcı link [** MemoryStream akışı = yeni MemoryStream(); //// document.Save (akış, yanlış); //// Bayt [] documentBytes = stream.ToArray(); //// Return File (documentBytes, "application/pdf"); **] (Bu bana çok yardımcı oldu. Teşekkür ederim!) –

11

, bu biz erdi kodudur:

Denetleyici:

[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: Bir web örnek

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)' satırı parametreyi alır 'false'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '''''nın çağrılmasının bir yan etkisi olarak kapatılmaması gerektiğini belirtmek için yanlış Bu davranış gereklidir, böylece sonraki satırda 'stream.ToArray' diyebiliriz ve kullandığımız 'using' bloğu beklendiği gibi çalışabilir. – Kevin

+0

Karşıdan yükledim ve başvuruyor ancak ReportPdfInput bulamıyor diyor ...? – Murphybro2

+0

@ Murphybro2 'ReportPdfInput', istediğimiz PDF'yi oluşturmak için gereken tüm bilgileri içeren bir derstir. Kütüphanenin bir parçası değil. Karışıklık için özür dilerim! – Kevin