iText 7 和 C# 从 MemoryStream 写入 PDF 文件?

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

我有一个 PDF 文档(使用 iText 7/C# 4.01),我正在 MemoryStream 中创建它,最后,我想将其写到一个文件中。我在内存流中创建它的部分原因是我想在最后在其上标记页眉表和页脚,并希望避免将其写入文件,然后读回文件,标记,然后写出一个新文件(就像我在 iText 网站上不断找到的示例一样)。然而,我在下面的代码中似乎遇到了某种先有鸡还是先有蛋的情况。看来您必须 Close() 文档才能使 iText 完全形成它。但是,如果我 Close() 它,那么在尝试编写它时会收到 ObjectDisposeException(下面的简化示例)。我必须在这里错过一些简单的东西,对吧?谢谢

    MemoryStream baos = new MemoryStream();
    PdfWriter writer = new PdfWriter(baos);
    PdfDocument pdfDocument = new PdfDocument(writer.SetSmartMode(true));
    //writer.SetCloseStream(true);
    //pdfDocument.SetCloseWriter(true);
    //pdfDocument.SetCloseReader(true);
    //pdfDocument.SetFlushUnusedObjects(true);
    Document d = new Document(pdfDocument, iText.Kernel.Geom.PageSize.LETTER);
    d.Add(new Paragraph("Hello world!"));
    //d.Close();

    FileStream file = new FileStream("C:\test.pdf", 
    FileMode.Create, FileAccess.Write);
    baos. WriteTo(file);
    file.Close();
    //baos.Close();
    //d.Close();
c# pdf itext memorystream
2个回答
2
投票

试试这个

我没有用于测试的 IDE,但我认为这个可行

MemoryStream baos = new MemoryStream();
PdfWriter writer = new PdfWriter(baos);
PdfDocument pdfDocument = new PdfDocument(writer.SetSmartMode(true));

Document d = new Document(pdfDocument, iText.Kernel.Geom.PageSize.LETTER);
d.Add(new Paragraph("Hello world!"));

d.Close();

byte[] byte1 = baos.ToArray();
File(byte1, "application/pdf", "C:\\iTextTester\\test.pdf");

0
投票
public IActionResult ExportToPDF()
{
    using (MemoryStream memoryStream = new MemoryStream())
    {
        // Initialize PDF components
        var writer = new PdfWriter(memoryStream);
        var pdf = new PdfDocument(writer);
        var document = new Document(pdf);

        // Add header to the document
        Paragraph header = new Paragraph("2024 Soccer Player Goals Report")
                                .SetTextAlignment(iText.Layout.Properties.TextAlignment.CENTER)
                                .SetFontSize(16);
        document.Add(header);

        // Create a table for report data with 50% width for each column
        Table table = new Table(UnitValue.CreatePercentArray(2).SetAll(50))
                        .AddHeaderCell("Player Name")
                        .AddHeaderCell("Goal Count");

        // Materialize ReportData into a list
        List<BaseReport> reportDataList = ReportData.ToList();

        // Populate table with report data
        foreach (var item in reportDataList)
        {
            table.AddCell(item.Name)
                 .AddCell(item.Count.ToString());
        }

        // Add table to the document
        document.Add(table);

        // Close the document
        document.Close();

        // Return the PDF file
        return File(memoryStream.ToArray(), "application/pdf", $"{DateTime.Now.ToString("dd-MM-yyyy")}-Report.pdf");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.