2009-04-22 18 views
68

उत्पन्न करने के लिए मैं एक नियंत्रक पर एक कार्रवाई कॉल करना चाहते हैं पाने के लिए। नियंत्रक को मॉडल से डेटा प्राप्त करें। दृश्य तब पीडीएफ चलाता है और उत्पन्न करता है। केवल उदाहरण मैं पाया है लो http://whereslou.com/2009/04/12/returning-pdfs-from-an-aspnet-mvc-action ने एक लेख में है। उसका कोड बहुत ही सुरुचिपूर्ण है। दृश्य पीडीएफ उत्पन्न करने के लिए ITextSharp का उपयोग कर रहा है। एकमात्र नकारात्मक पक्ष उसका उदाहरण स्पार्क व्यू इंजन का उपयोग करता है। क्या मानक माइक्रोसॉफ्ट व्यू इंजन के साथ एक समान काम करने का कोई तरीका है?Asp.Net MVC कैसे दृश्य पीडीएफ

+8

स्पार्क व्यू इंजन का उपयोग करना नकारात्मक है? मैं घायल हूँ :) – loudej

+0

चेक इस बाहर, RazorPDF: http://www.nyveldt.com/blog/post/Introducing-RazorPDF –

+0

कैसे PhantomJS साथ ASP.NET MVC में यह करने के लिए का विस्तृत वर्णन यहां लॉग होता है: http: // zizhujy.com/blog/post/2014/07/29/Use-PhantomJS-To-Create-WebPage-to-PDF-Converter.aspx। और एक ऑनलाइन उदाहरण ब्लॉग पोस्ट के चरणों को लागू किया गया है: http://zizhujy.com/en-US/PDFConverter। यह तब तक बढ़िया काम करता है जब तक पृष्ठ अज्ञात यात्रा की अनुमति देता है। –

उत्तर

19

हमारे इस समस्या का अंतिम जवाब Rotativa उपयोग करने के लिए किया गया था।

यह अन्य समाधान के कुछ तरह WKhtmltopdf.exe ऊपर लपेटता है, लेकिन यह है कि मैं

मैं चला गया और सभी अन्य उत्तर कि भी अच्छी तरह से समस्या का समाधान मतदान पाया है उपयोग करने के लिए अब तक का सबसे आसान है, लेकिन यह वही है जो हम ऊपर दिए गए प्रश्न में उत्पन्न समस्या को हल करने के लिए करते थे। यह अन्य उत्तरों से अलग है।

यहाँ एक Rotativa Tutorial है।

आप इसे स्थापित करने के बाद, यह आपके सभी की जरूरत

public ActionResult PrintInvoice(int invoiceId) 
{ 
    return new ActionAsPdf(
       "Invoice", 
       new { invoiceId= invoiceId }) 
       { FileName = "Invoice.pdf" }; 
} 

बहुत बहुत सरल है।

+2

डाउनवोट क्यों, मैं उलझन में हूं। इस प्रकार हम समस्या को हल करते हैं, इसलिए मैंने इसे चालू रखने के लिए प्रश्न अपडेट किया। मुझे समझ में नहीं आता अगर मैं समझ नहीं पा रहा हूं कि मुझे वोट क्यों मिला तो मैं बेहतर कैसे कर सकता हूं? –

+2

एक टिप्पणी के बिना फिर से नीचे वोट ... यह वह जवाब है जिसका हम इस मुद्दे को हल करने के लिए उपयोग करते थे। मैंने वापस आने और अधिक वर्तमान उत्तर के साथ प्रश्न को अद्यतन करने के लिए अतिरिक्त प्रयास किए। मैं उलझन में हूं कि यह कैसे कम वोट देता है, जब तक कि आपको केवल rotativa पसंद नहीं है। –

+0

ब्राउन बिल्कुल सही कोड के साथ उत्तर, 21 वीं शताब्दी में हमें यही चाहिए। दोनों टिप्पणियों और उत्तर के लिए +1 .. धन्यवाद ढेर – Learner

81

मैं iTextSharp का उपयोग MVC में गतिशील पीडीएफ उत्पन्न करने के लिए। तुम सब करने की ज़रूरत है एक स्ट्रीम वस्तु में अपने पीडीएफ डाल दिया जाता है और फिर अपने ActionResult एक FileStreamResult लौट आते हैं। मैंने सामग्री-स्वभाव भी सेट किया ताकि उपयोगकर्ता इसे डाउनलोड कर सके।

 
public FileStreamResult PDFGenerator() 
{ 
    Stream fileStream = GeneratePDF(); 

    HttpContext.Response.AddHeader("content-disposition", 
    "attachment; filename=form.pdf"); 

    return new FileStreamResult(fileStream, "application/pdf"); 
} 

मैं भी कोड है कि मुझे सक्षम बनाता है एक टेम्पलेट पीडीएफ लेने के लिए, यह आदि के लिए पाठ और छवियों को लिखने (यदि आप ऐसा करना चाहता था) है।

  • नोट: यदि आप करने के लिए 0.
 
private Stream GeneratePDF() 
{ 
    //create your pdf and put it into the stream... pdf variable below 
    //comes from a class I use to write content to PDF files 

    MemoryStream ms = new MemoryStream(); 

    byte[] byteInfo = pdf.Output(); 
    ms.Write(byteInfo, 0, byteInfo.Length); 
    ms.Position = 0; 

    return ms; 
} 
+0

अच्छा कोड wraps। मैं सोच रहा था कि हम यह कैसे कर सकते हैं। – MikeJ

+0

बस जो मैं देख रहा था –

+5

मुझे उदाहरण में यह देखना अच्छा लगेगा कि उदाहरण में "पीडीएफ क्लास" क्या दिखता है या इसे लागू करने के तरीके पर कुछ संकेत मिलता है? – jesperlind

5

मैं भी इस http://www.codeproject.com/Articles/260470/PDF-reporting-using-ASP-NET-MVC3 में आए स्ट्रीम स्थिति सेट करना होगा। यह आसान और तेज़ है, और एमवीसी के साथ अच्छी तरह से फिट बैठता है।

हालांकि, केवल नकारात्मक पक्ष यह है कि अब तक यह काफी लचीला आप एक सभ्य लेआउट करना चाहते हैं नहीं है, उदाहरण के लिए, आप एचटीएमएल के माध्यम से सेल बॉर्डर की मेज के साथ अधिक नियंत्रण, और नहीं है। यह बल नए पेज का समर्थन करता है, लेकिन आपको iTextsharp पर एक पैच लागू करना होगा।

+0

धन्यवाद, यह मेरे लिए काम करता है! –

2

मैं सिर्फ wkhtmltopdf इस्तेमाल किया, html में लेआउट बनाने के लिए और बाद में, मैं इसे पीडीएफ में कन्वर्ट।

आसान, अनुकूलन, नरक :)

+2

मुझे लगता है कि आप wkhtmltopdf – raider33

5

बाद में पीडीएफ में एचटीएमएल और मुद्रण में लेआउट बनाने के रूप में भयानक तेज़ तरीका है।

एचटीएमएल पीडीएफ रूपांतरण में phantomjs, wkhtmltopdf या jsreport

jsreport asp.net MVC के विचारों के साथ प्रत्यक्ष एकीकरण प्रदान करता है के द्वारा प्रदान की जाती है, जहां सिर्फ विशेषता के साथ नियंत्रक कार्रवाई चिह्नित कर सकते हैं और इसके लिए एचटीएमएल के बजाय पीडीएफ प्रिंट होगा आप।

अधिक इस blog post

अस्वीकरण पर: मैं jsreport

+1

का उपयोग कर रहे हैं यदि आप एमवीसी का उपयोग कर रहे हैं, तो Rotativa wkhtmltopdf के लिए वास्तव में एक अच्छा रैपर है ... उपयोग करने में बहुत आसान है, हमने अब इस समस्या को हल करने के लिए इसे परिवर्तित कर दिया है ... छवियों के साथ कोई समस्या थी, लेकिन SO –

+0

पर एक कामकाज है हाँ, रोरातिवा एक अच्छा रैपर है। jsreport बल्कि एक रिपोर्टिंग सर्वर है जो छवियों को संभालता है या आपके लिए रिपोर्ट इतिहास रखता है। –

4

यह एक पुरानी सवाल यह है के लेखक, लेकिन एक अभी भी प्रासंगिक है कि हूँ और मैं मैं सिर्फ साझा करते हैं कि मैं क्या क्रियान्वित किया है जो अच्छी तरह से काम करता है सोचा । WkHtmlToPdf के आधार पर Pechkin पुस्तकालय में एक कांटा पीडीएफ करने के लिए HTML पृष्ठों कन्वर्ट करने के लिए एक वेबकिट इंजन का उपयोग करता है -

  1. NuGet पैकेज TuesPechkin स्थापित करें।

  2. एक दृश्य पढ़ने के लिए थोड़ा सा सहायक लिखें और इसे HTML स्ट्रिंग में परिवर्तित करें (mvcContext यह है। HttpContext)। प्रतिस्थापन बिल्कुल वैकल्पिक है!:

    public static string RenderViewToString(HttpContextBase mvcContext, string area, string controllerName, string viewName, object model) 
    { 
        var context = System.Web.HttpContext.Current; 
        var contextBase = mvcContext; 
        var routeData = new RouteData(); 
        if (area == null) area = ""; 
    
        routeData.DataTokens.Add("area", area); 
    
        routeData.Values.Add("controller", controllerName); 
    
        var controllerContext = new ControllerContext(contextBase, 
                  routeData, 
                  new EmptyController()); 
    
        var razorViewEngine = new RazorViewEngine(); 
        var razorViewResult = razorViewEngine.FindView(controllerContext, 
                   viewName, 
                   "", 
                  false); 
    
        var writer = new StringWriter(); 
        var viewContext = new ViewContext(controllerContext, 
               razorViewResult.View, 
               new ViewDataDictionary(model), 
               new TempDataDictionary(), 
               writer); 
        razorViewResult.View.Render(viewContext, writer); 
    
        string hostAddress = context.Request.Url.Scheme + "://" + context.Request.Url.Authority; 
    
        return writer.ToString() 
           .Replace("src=\"/", "src=\"" + hostAddress + "/") 
           .Replace("<link href=\"/", "<link href=\"" + hostAddress + "/");       
    } 
    
    class EmptyController : ControllerBase 
    { 
        protected override void ExecuteCore() { } 
    } 
    

ऊपर की कड़ी मेहनत के यहां से थे: http://wouterdekort.blogspot.co.uk/2012/10/rendering-aspnet-mvc-view-to-string-in.html?showComment=1414603363455#c7863520150405064571

  1. दस्तावेज़

    public ActionResult DownloadPDF(long CentreID) 
    { 
        var model = GetModel() 
    
        IPechkin converter = Factory.Create(); 
        byte[] result = converter.Convert(Helpers.PDF.RenderViewToString(this.HttpContext, "area", "controller", "action", model); 
        MemoryStream outputStream = new MemoryStream(); 
        outputStream.Write(result, 0, result.Length); 
        outputStream.Position = 0; 
    
        return File(outputStream, "application/pdf", "filename.pdf"); 
    } 
    
  2. उत्पन्न करने के लिए एक MVC कार्य बनाएँ
+0

उन लोगों के लिए जो इस ट्यूटोरियल का पालन करते हैं और 'आईपीकेकिन' और 'फैक्ट्री' चीजों पर त्रुटि है क्योंकि यह पहले से ही बहिष्कृत है। कृपया https://github.com/tuespetre/TuesPechkin पर रेपो पर स्थापित और कार्यान्वित करने के तरीके को पढ़ें। – chaintng

+0

और साथ ही, आप 'मंगलपेककिन' को नुजेट से डाउनलोड करने के बाद, 'मंगलपैचकिन .khtmltox.Win32' या' मंगलपैचकिन .khtmltox.Win64' डाउनलोड करना न भूलें क्योंकि इसमें डाउनलोड होने पर शामिल नहीं है। – chaintng

+0

यह शीर्ष उत्तरों में से एक होना चाहिए। वही था जो मैं खोज रहा था और यह खुला स्रोत है। – Alao

0

बहुत देर से उत्तर, लेकिन मैंने पाया कि निम्न URL मुझे जल्दी से मेरे परिणाम मिल में मदद की:

(सुनिश्चित करें कि आप Nuget संकुल का उपयोग करके iTextSharp DLL करने के लिए संदर्भ)

https://www.aspsnippets.com/Articles/Export-Grid-Html-Table-data-from-database-to-PDF-file-using-iTextSharp-in-ASPNet-MVC.aspx

संपादित इस कोड को मैं मेज एक छोटे से अलग दिखाने के लिए प्रयोग किया जाता है (यह परिदृश्य के रूप में अच्छी तरह से है:

public string GetCssForPdf() 
     { 
      string css = ""; 

      css = "th, td" + 
        "{" + 
         "font-family:Arial; font-size:10px" + 
        "}"; 

      return css; 
     } 

[HttpPost] 
     [ValidateInput(false)] 
     public FileResult Export(string GridHtml) 
     { 
      string webgridstyle = GetCssForPdf(); 

      string exportData = String.Format("<html><body>{0}{1}</body></html>", "<style>" + webgridstyle + "</style>", GridHtml); 
      var bytes = System.Text.Encoding.UTF8.GetBytes(exportData); 

      using (var input = new MemoryStream(bytes)) 
      { 
       var output = new MemoryStream(); 
       var document = new iTextSharp.text.Document(PageSize.A4, 50, 50, 50, 50); 
       var writer = PdfWriter.GetInstance(document, output); 

       document.SetPageSize(iTextSharp.text.PageSize.A4.Rotate()); 
       Font headerFont = FontFactory.GetFont("Verdana", 10); 
       Font rowfont = FontFactory.GetFont("Verdana", 10); 

       writer.CloseStream = false; 
       document.Open(); 

       var xmlWorker = iTextSharp.tool.xml.XMLWorkerHelper.GetInstance(); 
       xmlWorker.ParseXHtml(writer, document, input, System.Text.Encoding.UTF8); 
       document.Close(); 
       output.Position = 0; 

       return File(output, "application/pdf", "Pipeline_Report.pdf"); 

       //return new FileStreamResult(output, "application/pdf"); 
      } 
     } 

उम्मीद है कि यह किसी और की भी मदद करता है।