এমভিসিতে ব্রাউজারে পিডিএফ কীভাবে ফিরে আসবেন?


120

আইটেক্সটশার্পের জন্য আমার কাছে এই ডেমো কোড রয়েছে

    Document document = new Document();
    try
    {
        PdfWriter.GetInstance(document, new FileStream("Chap0101.pdf", FileMode.Create));

        document.Open();

        document.Add(new Paragraph("Hello World"));

    }
    catch (DocumentException de)
    {
        Console.Error.WriteLine(de.Message);
    }
    catch (IOException ioe)
    {
        Console.Error.WriteLine(ioe.Message);
    }

    document.Close();

ব্রাউজারে পিডিএফ ডকুমেন্ট ফিরিয়ে আনতে আমি কীভাবে নিয়ামক পেতে পারি?

সম্পাদনা করুন:

এই কোডটি চালানো অ্যাক্রোব্যাটটি খোলে তবে আমি একটি ত্রুটি বার্তা পেয়েছি "ফাইলটি ক্ষতিগ্রস্থ হয়েছে এবং এটি মেরামত করা যায়নি" "

  public FileStreamResult pdf()
    {
        MemoryStream m = new MemoryStream();
        Document document = new Document();
        PdfWriter.GetInstance(document, m);
        document.Open();
        document.Add(new Paragraph("Hello World"));
        document.Add(new Paragraph(DateTime.Now.ToString()));
        m.Position = 0;

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

কোন ধারণা কেন এটি কাজ করে না?



@ এমজি 1075 আপনার লিঙ্কটি মারা গেছে
thecoolmacdude

@ থেকুলম্যাকডুড - ঠিক আছে ... nyveldt.com/blog/page/razorpdf ; nyveldt.com/blog/post/razorpdf- উদাহরণ ; github.com/RazorAnt
এমজি 1075

উত্তর:


128

রিটার্ন a FileContentResult। আপনার নিয়ামক ক্রিয়ায় শেষ লাইনটি এমন হবে:

return File("Chap0101.pdf", "application/pdf");

আপনি যদি এই পিডিএফটি গতিশীলভাবে MemoryStreamতৈরি করে থাকেন তবে একটি ব্যবহার করা ভাল হয় , এবং ফাইলটিতে সংরক্ষণের পরিবর্তে মেমরিতে নথিটি তৈরি করা ভাল । কোডটি এমন কিছু হবে:

Document document = new Document();

MemoryStream stream = new MemoryStream();

try
{
    PdfWriter pdfWriter = PdfWriter.GetInstance(document, stream);
    pdfWriter.CloseStream = false;

    document.Open();
    document.Add(new Paragraph("Hello World"));
}
catch (DocumentException de)
{
    Console.Error.WriteLine(de.Message);
}
catch (IOException ioe)
{
    Console.Error.WriteLine(ioe.Message);
}

document.Close();

stream.Flush(); //Always catches me out
stream.Position = 0; //Not sure if this is required

return File(stream, "application/pdf", "DownloadName.pdf");

টনি, আপনার প্রথমে ডকুমেন্টটি বন্ধ করতে হবে এবং প্রবাহটি প্রবাহিত করতে হবে।
জিওফ

2
জিফ, আমি এটি অর্জন করার চেষ্টা করছি, তবে একই রকম সমস্যা আছে। রান সময় আমি একটি ত্রুটি পেয়েছি "একটি বদ্ধ স্ট্রিম অ্যাক্সেস করতে পারি না" তবে আমি এটি বন্ধ না করলে কিছুই ফিরে আসে না।
লিটল ক্রিস

1
ধন্যবাদ @ লিটলিট্রিস। আপনি ঠিক বলেছেন, আমি কোডটি পিডিএফড্রাইটারকে কোডটি সম্পাদনা করেছি lo ক্লসস্ট্রিম = মিথ্যা;
জেফ

1
হ্যাঁ @ জিফ স্ট্রিম oss সম্ভাবনা = 0; প্রয়োজনীয়, যদি আপনি এটি না লিখেন, পিডিএফ খোলার মুহুর্তে অ্যাক্রোব্যাট একটি "ত্রুটিযুক্ত ফাইল" নিক্ষেপ করেছে
আলবার্তো লিওন

3
পরোক্ষভাবে টাইপ রূপান্তর করা যায় না 'System.Web.Mvc.FileStreamResult' থেকে 'System.Web.Mvc.FileContentResult'
CountMurphy

64

আমি এই কোড দিয়ে এটি কাজ করে।

using iTextSharp.text;
using iTextSharp.text.pdf;

public FileStreamResult pdf()
{
    MemoryStream workStream = new MemoryStream();
    Document document = new Document();
    PdfWriter.GetInstance(document, workStream).CloseStream = false;

    document.Open();
    document.Add(new Paragraph("Hello World"));
    document.Add(new Paragraph(DateTime.Now.ToString()));
    document.Close();

    byte[] byteInfo = workStream.ToArray();
    workStream.Write(byteInfo, 0, byteInfo.Length);
    workStream.Position = 0;

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

ডকুমেন্ট, পিডিএফ রাইটার এবং অনুচ্ছেদগুলি অপরিচিত।
মাইকেল 25

9
আমি কিছুটা উদ্বিগ্ন usingযে উদাহরণটিতে আমি খুঁজে পাচ্ছি তার মধ্যে একটিও বিবৃতি নেই ... এখানে কি এটির দরকার নেই? আমি মনে করি আপনার কাছে কমপক্ষে 3 টি ডিসপোজেবল অবজেক্ট রয়েছে ...
কোবি

হ্যাঁ, বিবৃতি ব্যবহার করা ভাল। যদি এটির বেশি প্রোডাকশন অ্যাপ হয় তবে বলুন ... এটির জন্য একজন ব্যক্তি, এটি সমস্যার কারণ হতে পারে ...
vbullinger

7
ফাইলস্টেম রিসাল্ট আপনার জন্য স্ট্রিমটি বন্ধ করবে। এই উত্তরটি দেখুন stackoverflow.com/a/10429907/228770
এড স্পেন্সার

গুরুত্বপূর্ণ জিনিসটি পজিশন = 0. হাহা সেট করা হয়েছে। আপনাকে ধন্যবাদ @ টনিবর্ফ
থানহুলডি

23

আপনাকে অবশ্যই উল্লেখ করতে হবে:

Response.AppendHeader("content-disposition", "inline; filename=file.pdf");
return new FileStreamResult(stream, "application/pdf")

ফাইলটি ডাউনলোড করার পরিবর্তে ব্রাউজারে সরাসরি খোলার জন্য


ধন্যবাদ! আমি সর্বত্র অনুসন্ধান করছিলাম কীভাবে এটি করা যায় !!
স্কটি 17

17

আপনি যদি FileResultনিজের অ্যাকশন পদ্ধতি থেকে কোনও ফিরিয়ে File()দেন এবং নিয়ন্ত্রণকারীটিতে এক্সটেনশন পদ্ধতি ব্যবহার করেন , আপনি যা চান তা করা খুব সহজ। File()পদ্ধতিটিতে ওভাররাইড রয়েছে যা ফাইলের বাইনারি বিষয়বস্তু, ফাইলের পথ বা একটি গ্রহণ করবে Stream

public FileResult DownloadFile()
{
    return File("path\\to\\pdf.pdf", "application/pdf");
}

11

আমি একই সমস্যার মধ্যে পড়েছি এবং আমি সমাধানের পক্ষে হোঁচট খেয়েছি। আমি দুটি পোস্ট থেকে একটি ব্যবহার স্ট্যাকের যে পদ্ধতি শো ডাউনলোড এবং অন্যের জন্য ফিরে যাওয়ার এক যে শো ItextSharp এবং MVC জন্য কাজ সমাধান।

public FileStreamResult About()
{
    // Set up the document and the MS to write it to and create the PDF writer instance
    MemoryStream ms = new MemoryStream();
    Document document = new Document(PageSize.A4.Rotate());
    PdfWriter writer = PdfWriter.GetInstance(document, ms);

    // Open the PDF document
    document.Open();

    // Set up fonts used in the document
    Font font_heading_1 = FontFactory.GetFont(FontFactory.TIMES_ROMAN, 19, Font.BOLD);
    Font font_body = FontFactory.GetFont(FontFactory.TIMES_ROMAN, 9);

    // Create the heading paragraph with the headig font
    Paragraph paragraph;
    paragraph = new Paragraph("Hello world!", font_heading_1);

    // Add a horizontal line below the headig text and add it to the paragraph
    iTextSharp.text.pdf.draw.VerticalPositionMark seperator = new iTextSharp.text.pdf.draw.LineSeparator();
    seperator.Offset = -6f;
    paragraph.Add(seperator);

    // Add paragraph to document
    document.Add(paragraph);

    // Close the PDF document
    document.Close();

    // Hat tip to David for his code on stackoverflow for this bit
    // /programming/779430/asp-net-mvc-how-to-get-view-to-generate-pdf
    byte[] file = ms.ToArray();
    MemoryStream output = new MemoryStream();
    output.Write(file, 0, file.Length);
    output.Position = 0;

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


    // Return the output stream
    return File(output, "application/pdf"); //new FileStreamResult(output, "application/pdf");
}

দুর্দান্ত উদাহরণ! আমি যা খুঁজছিলাম ঠিক এটাই ছিল! - পিট -
ডিজিওজ মাল্টিমিডিয়া

2
Usings? বন্ধ? নষ্ট? ফ্লাশ? মেমরি ফুটো সম্পর্কে কে চিন্তা করে?
vbullinger

3

আপনি সামগ্রীর প্রকারটি পরিবর্তন করতে এবং প্রতিক্রিয়াতে ফাইলটি যুক্ত করতে একটি কাস্টম ক্লাস তৈরি করতে পারেন।

http://haacked.com/archive/2008/05/10/writing-a-custom-file-download-action-result-for-asp.net-mvc.aspx


7
যেমনটি ব্লগ পোস্টের শীর্ষে বলা হয়েছে, ফাইলআরসাল্ট এসপ.নেট এমভিসির সাথে বাক্স থেকে বেরিয়ে আসে, সুতরাং আপনার নিজের কোডিংয়ের দরকার নেই।
নার্ডফুরি

3

আমি জানি যে এই প্রশ্নটি পুরানো তবে আমি ভেবেছিলাম যে এটি ভাগ করে নেব কারণ আমি এর মতো কিছু পাই না।

আমি রেজার ব্যবহার করে আমার মতামত / মডেলগুলি স্বাভাবিক হিসাবে তৈরি করতে চেয়েছিলাম এবং সেগুলিকে পিডিএফ হিসাবে রেন্ডার করতে চাই

আইটিেক্সটশার্প ব্যবহার করে কীভাবে ডকুমেন্টটি বিন্যাস করতে হবে তার চেয়ে স্ট্যান্ডার্ড এইচটিএমএল আউটপুট ব্যবহার করে পিডিএফ উপস্থাপনাটির উপর আমার নিয়ন্ত্রণ ছিল।

প্রকল্প এবং উত্স কোড নুগেট ইনস্টলেশন নির্দেশাবলী সহ এখানে উপলব্ধ:

https://github.com/andyhutch77/MvcRazorToPdf

Install-Package MvcRazorToPdf

3

FileStreamResultঅবশ্যই কাজ করে। তবে আপনি যদি মাইক্রোসফ্ট ডক্সের দিকে নজর দেন তবে এটি উত্তরাধিকার সূত্রে প্রাপ্ত ActionResult -> FileResult, যার আরও একটি উত্পন্ন ক্লাস রয়েছে FileContentResult। এটি "বাইনারি ফাইলের বিষয়বস্তু প্রতিক্রিয়াতে প্রেরণ করে"। সুতরাং আপনার যদি ইতিমধ্যে থাকে তবে byte[]আপনার FileContentResultপরিবর্তে ব্যবহার করা উচিত ।

public ActionResult DisplayPDF()
{
    byte[] byteArray = GetPdfFromWhatever();

    return new FileContentResult(byteArray, "application/pdf");
}

2

আপনি সাধারণত একটি প্রতিক্রিয়া করবেন l ফ্লুশ একটি প্রতিক্রিয়া অনুসরণ করবে lo ক্লোজ, তবে কোনও কারণে আইটেক্সটশার্প লাইব্রেরি এটি পছন্দ করছে বলে মনে হয় না। ডেটা এটির মাধ্যমে তৈরি করে না এবং অ্যাডোব পিডিএফটি দূষিত বলে মনে করে। প্রতিক্রিয়া ছেড়ে দিন Leaveএফটি বন্ধ করুন এবং দেখুন আপনার ফলাফল আরও ভাল হয়েছে কিনা:

Response.Clear();
Response.ContentType = "application/pdf";
Response.AppendHeader("Content-disposition", "attachment; filename=file.pdf"); // open in a new window
Response.OutputStream.Write(outStream.GetBuffer(), 0, outStream.GetBuffer().Length);
Response.Flush();

// For some reason, if we close the Response stream, the PDF doesn't make it through
//Response.Close();

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

যদি ফাইলনামটি গতিশীলভাবে উত্পন্ন হয় তবে এখানে ফাইলের নাম কীভাবে সংজ্ঞায়িত করা যায়, এটি এখানে গাইডের মাধ্যমে উত্পন্ন হচ্ছে।


1

আপনি যদি পপআপ বা ব্রাউজারে পিডিএফ প্রদর্শন করতে ডিবি থেকে ভার-বাইনারি ডেটা ফেরান মানে এই কোডটি অনুসরণ করুন: -

পৃষ্ঠা দেখুন:

@using (Html.BeginForm("DisplayPDF", "Scan", FormMethod.Post))
    {
        <a href="javascript:;" onclick="document.forms[0].submit();">View PDF</a>
    }

স্ক্যান নিয়ামক:

public ActionResult DisplayPDF()
        {
            byte[] byteArray = GetPdfFromDB(4);
            MemoryStream pdfStream = new MemoryStream();
            pdfStream.Write(byteArray, 0, byteArray.Length);
            pdfStream.Position = 0;
            return new FileStreamResult(pdfStream, "application/pdf");
        }

        private byte[] GetPdfFromDB(int id)
        {
            #region
            byte[] bytes = { };
            string constr = System.Configuration.ConfigurationManager.ConnectionStrings["Connection"].ConnectionString;
            using (SqlConnection con = new SqlConnection(constr))
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    cmd.CommandText = "SELECT Scan_Pdf_File FROM PWF_InvoiceMain WHERE InvoiceID=@Id and Enabled = 1";
                    cmd.Parameters.AddWithValue("@Id", id);
                    cmd.Connection = con;
                    con.Open();
                    using (SqlDataReader sdr = cmd.ExecuteReader())
                    {
                        if (sdr.HasRows == true)
                        {
                            sdr.Read();
                            bytes = (byte[])sdr["Scan_Pdf_File"];
                        }
                    }
                    con.Close();
                }
            }

            return bytes;
            #endregion
        }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.