Tidak dapat membuka file terlampir - Aplikasi Xamarin.Forms

Saya membuat aplikasi Xamarin.Forms. Saya membuat PDF dengan contoh sederhana dengan bantuan Syncfusion untuk menghasilkan PDF dan mengonversinya secara streaming. PDF dibuat, dikirim dan berukuran sekitar 27KB. Tetapi ketika saya membuka email saya dan membukanya saya mendapatkan We can't open this file dari 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");

Bagaimana menemukan apa masalah pembukaannya?


person Rajzer    schedule 15.03.2021    source sumber
comment
Sudahkah Anda mencoba menyetel ulang stream.Position ke 0 setelah doc.Save(stream)?   -  person mkl    schedule 15.03.2021
comment
@mkl hmmm menurut saya itu menyelesaikan masalah saya. Tapi saya tidak mengerti kenapa?   -  person Rajzer    schedule 15.03.2021


Jawaban (1)


Kelas MemoryStream dapat digunakan untuk menulis dan membaca tetapi hanya memiliki satu properti Position yang digunakan untuk kedua tugas tersebut. Jadi, jika seseorang menggunakan satu instance untuk penulisan dan pembacaan aliran, biasanya seseorang harus menyetel ulang properti Position ke awal setelah mengeksekusi kode penulisan agar kode pembacaan dapat mengambil semua konten aliran.

Dalam kasus Anda, itu berarti Anda harus menyetel stream.Position ke 0 setelah doc.Save(stream).

person mkl    schedule 15.03.2021