很久以前,创建了一个可以在线销售电子门票的应用程序。
电子门票为PDF格式。
该软件使用旧的库(itextsharp.dll),但它仍然可以完美运行。
例如,当某人购买 4 张门票时,系统会创建 1 个 PDF 文件(共 4 页)并通过电子邮件将其作为附件发送。
我现在想要的是系统创建 4 个单独的 PDF 文件并将它们作为 4 个附件发送。
正如我现在所看到的,PDF 被放置在 MemoryStream 中,然后该 MemoryStream(1 个 PDF,4 页)作为附件发送。这效果很好!
是否可以将 4 个单独的 PDF 对象放入 MemoryStream 中,然后将它们作为附件发送?这样收件人就会收到 4 个单独的 PDF 文件?
当然,不可能提前预测有人会购买多少张电子机票。
下面是一段 C# 代码,现在可确保所有页面最终都为 1 个 PDF。
你有办法给我吗?
PhonepageBytes = Phonestream.ToArray();
PhonepagesAll.Add(PhonepageBytes);
}
MemoryStream Phonetickets = new MemoryStream();
Document Phonedoc = new Document();
PdfSmartCopy Phonecopy = new PdfSmartCopy(Phonedoc, Phonetickets);
Phonedoc.Open();
Phonedoc.OpenDocument();
foreach (var b in PhonepagesAll)
{
Phonedoc.NewPage();
Phonecopy.AddPage(copy.GetImportedPage(new PdfReader(b), 1));
// Create a new output PDF document (and save it into memorystream)
}
Phonecopy.CloseStream = false;
Phonecopy.Close();
SendTickets(fullName, emailAddress, Phonetickets);
我实在是没有头绪。 :-(
该代码可以完美地创建 1 个 PDF,每页都有一张电子机票。 我想要每张电子机票都有一个单独的 PDF,并将所有这些 PDF 作为附件发送。
检查以下代码。
List<MemoryStream> ticketStreams = new List<MemoryStream>();
foreach (var ticketData in PhonepagesAll)
{
MemoryStream ticketStream = new MemoryStream();
Document ticketDoc = new Document();
PdfSmartCopy ticketCopy = new PdfSmartCopy(ticketDoc, ticketStream);
ticketDoc.Open();
ticketDoc.OpenDocument();
ticketDoc.NewPage();
ticketCopy.AddPage(new PdfReader(ticketData));
ticketCopy.CloseStream = false;
ticketCopy.Close();
// Add the ticket MemoryStream to the list
ticketStreams.Add(ticketStream);
}
SendTicket(emailAddress, ticketStreams)
void SendTicket(string emailAddress, List<MemoryStream> ticketStreams)
{
MailMessage mail = new MailMessage();
mail.From = new MailAddress("[email protected]");
mail.To.Add(new MailAddress(emailAddress));
mail.Subject = "Your Tickets";
// Attach all the ticket MemoryStreams to the email
int ticketNo = 0;
foreach (var ticketStream in ticketStreams)
{
ticketNo++;
ticketStream.Position = 0; // Reset stream position to start
Attachment attachment = new Attachment(ticketStream, $"Ticket-{ticketNo}.pdf");
mail.Attachments.Add(attachment);
}
SmtpClient smtpClient = new SmtpClient("your_smtp_server");
smtpClient.Send(mail);
}
上述代码将为每张电子机票创建单独的
MemoryStreams
,将它们添加到列表中,然后将每个 MemoryStream
作为单独的附件附加到单个电子邮件中。
这里我使用了SMTP
客户端来发送带有所有附件票证的电子邮件,您需要实现您的电子邮件发送逻辑。