2013-02-27 33 views
7

हम एक एएसपी.NET एमवीसी ऐप बना रहे हैं जिसे पीडीएफ उत्पन्न करने और इसे स्क्रीन पर प्रदर्शित करने में सक्षम होना चाहिए या उपयोगकर्ता को एक्सेस करने के लिए इसे कहीं भी आसान बनाना है। हम दस्तावेज उत्पन्न करने के लिए पीडीएफएसआरपी का उपयोग कर रहे हैं। एक बार यह समाप्त हो जाने के बाद, हम उपयोगकर्ता को दस्तावेज़ को सहेजने या इसे पाठक में खोलने के लिए कैसे देते हैं? मैं विशेष रूप से उलझन में हूं क्योंकि पीडीएफ सर्वर-साइड उत्पन्न होता है लेकिन हम चाहते हैं कि यह क्लाइंट-साइड दिखाए।मैं ASP.Net MVC में PdfSharp का उपयोग करके पीडीएफ कैसे प्रदर्शित करूं?


यहाँ रिपोर्ट है कि हम अब तक लिखा है बनाने के लिए 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); कि कहते हैं, Access to the path 'C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\10.0\report.pdf' is denied. में एक UnauthorizedAccessException मैं भी यकीन नहीं है मिल क्या होगा जब लाइन 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

मैं पीडीएफ तेज के साथ familar नहीं कर रहा हूँ लेकिन MVC के लिए ज्यादातर किया जाता है के माध्यम से कार्यक्षमता में बनाया गया। आपको अपने पीडीएफ दस्तावेज़ को बाइट्स की सरणी के रूप में प्रस्तुत करने की आवश्यकता है। फिर आप इसे ब्राउज़र पर वापस लाने के लिए एमवीसी की फ़ाइल विधि का उपयोग करेंगे और इसे डाउनलोड को संभालने दें। क्या ऐसा करने के लिए उनके वर्ग पर कोई तरीका है?

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

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

} 
+3

एक वेब नमूना नहीं है यह दिखाता है कि बाइट सरणी कैसे प्राप्त करें और इसे एमवीसी के बिना उपयोगकर्ता को वापस कर दें। एमवीसी के साथ आपको केवल बाइट सरणी प्राप्त करने के लिए कोड की आवश्यकता है (मेमोरी स्ट्रीम से, कोई फ़ाइल आवश्यक नहीं है)। नमूना: http://www.pdfsharp.net/wiki/Clock-sample.ashx –

+2

नए उपयोगकर्ताओं के लिए, यह थोड़ा उलझन में आता है, तो क्या आप (निकएल्ब्रेक्ट) को @PDFsharpTeam जैसी सटीक चीज़ करने के उत्तर को अपडेट करने के लिए परेशान करेंगे सहायक लिंक [** मेमोरीस्ट्रीम स्ट्रीम = नई मेमोरीस्ट्रीम(); //// दस्तावेज़। सहेजें (स्ट्रीम, झूठा); //// बाइट [] दस्तावेज़बाइट्स = स्ट्रीम। ToArray(); //// वापसी फ़ाइल (दस्तावेज़बाइट्स, "एप्लिकेशन/पीडीएफ"); **] (इससे मुझे बहुत मदद मिली। धन्यवाद !!!) –

11

Yarx के सुझाव और PDFsharp टीम के ट्यूटोरियल का उपयोग करना, इस कोड को हम साथ समाप्त हो गया है:

नियंत्रक:

[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

एफवाईआई: लाइन 'दस्तावेज़। सेव (स्ट्रीम, झूठा)' पैरामीटर लेता है 'झूठा' यह इंगित करने के लिए कि 'धारा' को 'सेव' कॉल करने के दुष्प्रभाव के रूप में बंद नहीं किया जाना चाहिए। यह व्यवहार जरूरी है ताकि हम अगली पंक्ति में 'stream.oArray' को कॉल कर सकें, और इसलिए उपयोग किए जाने वाले 'उपयोग' ब्लॉक को उम्मीद के अनुसार काम कर सकते हैं। – Kevin

+0

मैंने डीएलएल को डाउनलोड और संदर्भित किया है लेकिन यह कहता है कि यह ReportPdfInput .. नहीं ढूंढ सकता है? – Murphybro2

+0

@ मर्फीब्रो 2 'रिपोर्ट पीडीएफ इनपुट' एक वर्ग था जिसे हमने लिखा था जिसमें हमारे इच्छित पीडीएफ को प्रस्तुत करने के लिए आवश्यक सभी जानकारी शामिल थीं। यह पुस्तकालय का हिस्सा नहीं है। गलतफहमी के लिए खेद है! – Kevin

संबंधित मुद्दे