ไม่สามารถเปิดไฟล์แนบได้ - แอป Xamarin.Forms

ฉันกำลังสร้างแอป Xamarin.Forms ฉันสร้าง PDF ด้วยตัวอย่างง่ายๆ ด้วยความช่วยเหลือของ Syncfusion เพื่อสร้าง PDF และแปลงเป็นสตรีม PDF ถูกสร้างขึ้น ส่ง และมีขนาดประมาณ 27KB แต่เมื่อฉันไปที่เมลและเปิดมัน ฉันได้รับ We can't open this file จาก Adobe Reader:

//Create a new PDF document.
PdfDocument doc = new PdfDocument();
//Add a page.
PdfPage page = doc.Pages.Add();
//Create a PdfGrid.
PdfGrid pdfGrid = new PdfGrid();
//Add values to list
List<object> data1 = new List<object>();
Object row1 = new { ID = "E01", Name = "Clay" };
Object row2 = new { ID = "E02", Name = "Thomas" };
Object row3 = new { ID = "E03", Name = "Andrew" };
Object row4 = new { ID = "E04", Name = "Paul" };
Object row5 = new { ID = "E05", Name = "Gray" };
data1.Add(row1);
data1.Add(row2);
data1.Add(row3);
data1.Add(row4);
data1.Add(row5);
//Add list to IEnumerable
IEnumerable<object> dataTable = data;
//Assign data source.
pdfGrid.DataSource = dataTable;
//Draw grid to the page of PDF document.
pdfGrid.Draw(page, new PointF(10, 10));
//Save the PDF document to stream.
MemoryStream stream = new MemoryStream();
doc.Save(stream);
//Close the document.
doc.Close(true);

var message = new MailMessage();
message.From = new MailAddress("admin.server.com");
message.To.Add("[email protected]");
message.Subject = "Subject";
message.Body = "Body";
message.Attachments.Add(new Attachment(stream, "Test.pdf", "application/pdf"));

SmtpClient SmtpServer = new SmtpClient("mail.server.com");
SmtpServer.Host = "mail.server.com";
SmtpServer.Port = 587;
SmtpServer.EnableSsl = false;
SmtpServer.UseDefaultCredentials = false;
SmtpServer.Credentials = new System.Net.NetworkCredential("admin.server.com", "1234567");

จะทราบได้อย่างไรว่าปัญหาการเปิดคืออะไร?


person Rajzer    schedule 15.03.2021    source แหล่งที่มา
comment
คุณได้ลองรีเซ็ต stream.Position เป็น 0 หลังจาก doc.Save(stream) แล้วหรือยัง?   -  person mkl    schedule 15.03.2021
comment
@mkl อืมฉันคิดว่านั่นช่วยแก้ปัญหาของฉันได้ แต่ฉันไม่เข้าใจว่าทำไม?   -  person Rajzer    schedule 15.03.2021


คำตอบ (1)


คลาส MemoryStream สามารถใช้ทั้งสำหรับการเขียนและการอ่าน แต่มีคุณสมบัติ Position เดียวที่ใช้สำหรับทั้งสองงาน ดังนั้น หากใครใช้อินสแตนซ์เดียวทั้งสำหรับการเขียนและการอ่านสตรีม เรามักจะต้องรีเซ็ตคุณสมบัติ Position เป็นจุดเริ่มต้นหลังจากรันโค้ดการเขียนเพื่อให้โค้ดการอ่านดึงเนื้อหาทั้งหมดของสตรีมได้

ในกรณีของคุณ นั่นหมายความว่าคุณควรตั้งค่า stream.Position เป็น 0 หลัง doc.Save(stream)

person mkl    schedule 15.03.2021