iTextSharp - একটি ইমেল সংযুক্তিতে মেমরি পিডিএফ প্রেরণ


100

আমি এখানে বেশ কয়েকটি প্রশ্ন জিজ্ঞাসা করেছি কিন্তু এখনও সমস্যা আছে। আমি যদি আমার কোডটিতে আমি কী ভুল করছি তা যদি আমাকে বলতে পারেন তবে আমি প্রশংসা করব। আমি একটি এএসপি.নেট পৃষ্ঠা থেকে উপরের কোডটি চালাচ্ছি এবং "একটি বন্ধ স্ট্রিম অ্যাক্সেস করতে পারি না" get

var doc = new Document();

MemoryStream memoryStream = new MemoryStream();

PdfWriter.GetInstance(doc, memoryStream);
doc.Open();
doc.Add(new Paragraph("First Paragraph"));
doc.Add(new Paragraph("Second Paragraph"));

doc.Close(); //if I remove this line the email attachment is sent but with 0 bytes 

MailMessage mm = new MailMessage("username@gmail.com", "username@gmail.com")
{
    Subject = "subject",
    IsBodyHtml = true,
    Body = "body"
};

mm.Attachments.Add(new Attachment(memoryStream, "test.pdf"));
SmtpClient smtp = new SmtpClient
{
    Host = "smtp.gmail.com",
    Port = 587,
    EnableSsl = true,
    Credentials = new NetworkCredential("username@gmail.com", "my_password")
};

smtp.Send(mm); //the "Cannot Access a Closed Stream" error is thrown here

ধন্যবাদ !!!

সম্পাদনা:

এই প্রশ্নের উত্তর খুঁজতে কাউকে সাহায্য করার জন্য, ফাইলটি শারীরিকভাবে তৈরি না করেই কোনও ইমেলের সাথে সংযুক্ত একটি পিডিএফ ফাইল প্রেরণের কোডটি নীচে রয়েছে (ইচিবান এবং ব্রায়ংকে ধন্যবাদ):

var doc = new Document();
MemoryStream memoryStream = new MemoryStream();
PdfWriter writer = PdfWriter.GetInstance(doc, memoryStream);

doc.Open();
doc.Add(new Paragraph("First Paragraph"));
doc.Add(new Paragraph("Second Paragraph"));

writer.CloseStream = false;
doc.Close();
memoryStream.Position = 0;

MailMessage mm = new MailMessage("username@gmail.com", "username@gmail.com")
{
    Subject = "subject",
    IsBodyHtml = true,
    Body = "body"
};

mm.Attachments.Add(new Attachment(memoryStream, "filename.pdf"));
SmtpClient smtp = new SmtpClient
{
    Host = "smtp.gmail.com",
    Port = 587,
    EnableSsl = true,
    Credentials = new NetworkCredential("username@gmail.com", "password")

};

smtp.Send(mm);

4
এই প্রশ্নটি জিজ্ঞাসা করার জন্য ধন্যবাদ, এটি ঠিক আমি যা খুঁজছিলাম।
হার্ডওয়্যারগুই

4
লাইন জন্য ধন্যবাদ position=0। আমাকে বাঁচাতে!
ইয়েস্রোয়েল এম ওলেউস্কি

4
ঠিক আমার যা প্রয়োজন নিখুঁতভাবে কাজ করে তাই আপনাকে অনেক ধন্যবাদ! আমি দস্তাবেজটি বন্ধ করতে আটকে গিয়েছিলাম তবে স্ট্রিমটি নয়: Writer.CloseStream = false; এটা আমার জন্য পরিষ্কার।
ব্যাক্সটার

4
@ সিমিল যখন কোনও গৃহীত উত্তর সহ কোনও পুরানো প্রশ্নের উপর অনুদান রাখেন, তখন আপনাকে উত্তরটি কীভাবে মিস করবেন তা সত্যিই নির্দেশ করা উচিত।
এমকেএল

Writer.CloseStream = false; আমাকেও বাঁচিয়েছে, অনুপস্থিত ছিল যে কোনও পদ্ধতিতে HTML কে পিডিএলে পরিণত করতে আইটেক্সটশার্প ব্যবহার করে। এর আগে, মেমরির প্রবাহটি আমার মেল ফাংশনে প্রবাহ বন্ধ হয়ে যাওয়ার কারণে ব্যর্থ হয়েছিল। ধন্যবাদ
অ্যালেক মেনকোনি

উত্তর:


81

আপনি চেষ্টা করেছেন:

PdfWriter writer = PdfWriter.GetInstance(doc, memoryStream);

// Build pdf code...

writer.CloseStream = false;
doc.Close();

// Build email

memoryStream.Position = 0;
mm.Attachments.Add(new Attachment(memoryStream, "test.pdf"));

যদি আমার স্মৃতি আমাকে সঠিকভাবে পরিবেশন করে, এটি আগের প্রকল্পে একই রকম সমস্যার সমাধান করেছে।

Http://forums.asp.net/t/1093198.aspx দেখুন


4
Set_CloseStream পদ্ধতিটি কেবল জাভা সংস্করণে উপলভ্য। এটি আইটেক্সটশার্প (। নেট)
ইচিবান

দুঃখিত, আবার আমি কিছুক্ষণের জন্য iTextSharp (.NET) ব্যবহার করি নি, যদিও আমি যে সংস্করণটি ব্যবহার করেছি তা অবশ্যই_ক্লোজস্ট্রিম সেট করেছে।
ব্রায়ানং

4
Writer.CloseStream এ পরিবর্তিত হয়েছে এবং সম্পর্কিত লিঙ্ক অন্তর্ভুক্ত রয়েছে।
brianng

4
ব্রায়ানং, আমি সত্যিই আপনার সহায়তার প্রশংসা করি। আমি বুঝতে পারি যে আপনি এবং ইচিবান এক ধরণের মাধ্যমে আমার হাত ধরেছিলেন। ধন্যবাদ!
গাস কাভালকান্তি

আমরা যদি লেখককে বাঁচিয়ে রাখি, writer.Flush()তবে আমরা কখন অনুমান করি ?
ব্লেইস

18

আমি ব্রায়ানং দ্বারা পোস্ট করা কোডটি চেষ্টা করেছি এবং এটি কার্যকর হয়েছে। কোডের উপরের অংশটি এইটিতে পরিবর্তন করুন:

var doc = new Document();
MemoryStream memoryStream = new MemoryStream();
PdfWriter writer = PdfWriter.GetInstance(doc, memoryStream); //capture the object
doc.Open();
doc.Add(new Paragraph("First Paragraph"));
doc.Add(new Paragraph("Second Paragraph"));
writer.CloseStream = false; //set the closestream property
doc.close(); //close the document without closing the underlying stream
memoryStream.Position = 0;

/* remainder of your code stays the same*/

4
যাচাই করার জন্য সময় দেওয়ার জন্য ধন্যবাদ!
bianng

4
হাই ইচিবান, এটি সংকলন করে এবং এটি সংযুক্তির সাথে ইমেলটি প্রেরণ করে তবে সংযুক্ত পিডিএফ নথিটি 0 কেবি দিয়ে আসে। আপনি কি পিডিএফটি কোনও ইমেল প্রেরণ করেছেন?
গাস কাভালকান্তি

4
@ গুস্তাভো, ফাইলটি অ্যাক্রোব্যাট দর্শনে সঠিকভাবে খোলে। এটি প্রায় 900 বাইট। নিশ্চিত করুন যে আপনি লাইনটি রেখেছেন: মেমরিস্ট্রিম.পজিশন = 0; ডক পরে ডান। ক্লোজ ()। আমি এটা উল্লেখ করতে ভূলে গেছি। (উপরে আপডেট দেখুন)
ichiban

4
হ্যাঁ! আপনাদেরকে অনেক ধন্যবাদ. এটি অবশেষে কাজ করে। যেহেতু ইছিবানের উত্তর ব্রায়ানংয়ের উপর ভিত্তি করে ছিল, তাই আমি মনে করি ব্রায়ানংয়ের উত্তরটিকে সঠিক হিসাবে চিহ্নিত করা ন্যায়সঙ্গত।
গাস কাভালকান্তি

3

আপনি কি দস্তাবেজ বা মেমরি স্ট্রিমটি ফ্লাশ করতে পারেন এবং এটি সংযুক্ত করার পরে এটি বন্ধ করতে পারেন?


হাই জেমস. আমি এটি করেছি এবং ফলাফলটি পরিবর্তন হয়নি - আমি এখনও "বন্ধ স্ট্রিম অ্যাক্সেস করতে পারি না" ত্রুটি পেয়েছি। :( অন্যান্য ধারণা?
Gus Cavalcanti

3

সম্ভবত ডক কল করে (ক্লোজ করুন) অন্তর্নিহিত স্ট্রিমটি নিষ্পত্তি করে। দস্তাবেজ অপসারণের চেষ্টা করুন () এবং সেই লাইনের পরিবর্তে মেমরি স্ট্রিম সেট করুন P অবস্থান = 0;

বিকল্পভাবে আপনি একটি অস্থায়ী ফাইল ব্যবহার করতে পারেন:

var tempFilePath = Path.GetTempFileName();

try 
{           
    var doc = new Document();

    PdfWriter.GetInstance(doc, File.OpenWrite(tempFilePath));
    doc.Open();
    doc.Add(new Paragraph("First Paragraph"));
    doc.Add(new Paragraph("Second Paragraph"));

    doc.Close();

    MailMessage mm = new MailMessage("username@gmail.com", "username@gmail.com")
    {
        Subject = "subject",
        IsBodyHtml = true,
        Body = "body"
    };

    mm.Attachments.Add(new Attachment(tempFilePath, "test.pdf"));
    SmtpClient smtp = new SmtpClient
    {
        Host = "smtp.gmail.com",
        Port = 587,
        EnableSsl = true,
        Credentials = new NetworkCredential("username@gmail.com", "my_password")
    };

    smtp.Send(mm);
}
finally
{
    File.Delete(tempFilePath);
}

হুসিআইন্ট, আমি আপনার পরামর্শ মতো করেছি এবং পিডিএফ ফাইলটি প্রেরণ করা হয়েছে, তবে এটি কেবল 15 বাইট দীর্ঘ। আমি যখন এটি খোলার চেষ্টা করি তখন এটি দূষিত হয়। আমি মনে করি আপনার পরামর্শ নিয়ে আমি প্রায় সেখানে আছি। অন্য কোন ধারণা? ধন্যবাদ!
গুস ক্যাভালকান্তি

তারপরে মেমরিস্ট্রিম.ফ্লুশ () চেষ্টা করুন; অবস্থান সংযোজনা করার আগে
huseyint

একই জিনিস. ফাইলটি প্রায় খালি এবং দূষিত পাঠানো হয়েছে। :(
গাস কাভালকান্তি

আপনি কি "একটি টেম্প ফাইল তৈরি করা" দিয়েছিলেন?
huseyint

আমি এখনই এটিতে কাজ করছি এবং শীঘ্রই আপনাকে জানাতে হবে। ধন্যবাদ!
গাস কাভালকান্তি

1

আমারও একই সমস্যা ছিল এবং আমি সমাধান করতে এই পোস্টটি ব্যবহার করেছি b ব্রায়ানং দ্বারা লিখিত কোডে

PdfWriter writer = PdfWriter.GetInstance(doc, memoryStream);

// Build pdf code...

writer.CloseStream = false;
doc.Close();

// Build email

memoryStream.Position = 0;
mm.Attachments.Add(new Attachment(memoryStream, "test.pdf"));

আমি লেখার পরিবর্তে ভাবি

writer.CloseStream = false and memoryStream.Position = 0;

কেবল একটি নতুন স্ট্রিম তৈরি করুন

MemoryStream m = new MemoryStream(memoryStream);

এবং তারপর কল

mm.Attachments.Add(new Attachment(memoryStream, "test.pdf"));

উভয়ই কাজ করে তবে আমি মনে করি যে নতুন প্রবাহটি তৈরি করা ভাল


নতুন স্ট্রিম তৈরি করা কেন ভাল?
অ্যান্ডি 19

এটা না। এটি মেমরি এবং সিপিইউ সময় নষ্ট করে কারণ বাইটগুলি এক থেকে অন্যটিতে অনুলিপি করতে হয়।
সেরগেই ফেদোরভ

কেন আমি বললাম এটি আরও ভাল তা মনে রাখবেন না। আমি মনে করি আমি বোঝাতে চাইছি এটি পরিষ্কার। দুঃখিত শুধু এটি দেখেছি। অনেক দিন হয়েছে :)
জেইন স্লেইমান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.