创建单独的 PDF(每个 PDF 一页)C# ItextSharp

问题描述 投票:0回答:1

很久以前,创建了一个可以在线销售电子门票的应用程序。

电子门票为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 作为附件发送。

c# pdf itext
1个回答
0
投票

检查以下代码。

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
客户端来发送带有所有附件票证的电子邮件,您需要实现您的电子邮件发送逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.