使用itextsharp 5.5.13.3在.net core 6 mvc中将数据表转换为带有自定义页眉和页脚的pdf?

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

我想使用数据表中的数据生成 pdf 并设置自定义页眉和页脚。

private void ProcessEMICalendarDocument(DocumentGenerationRequestModel item, List<MemoryStream> templateStreams, string userCode)
{
    var dataTable = dao.GetDataforEMICalendar(item.LoanAccountNo, connectionString);

    if (dataTable != null && dataTable.Rows.Count > 0)
    {
       // Create a new MemoryStream for each document
          using (MemoryStream memoryStream = new MemoryStream())
          {
              using (Document document = new Document())
              {
                PdfWriter writer = PdfWriter.GetInstance(document, memoryStream);

                // Create the event handler
                HeaderFooter eventhelper = new HeaderFooter();
                        writer.PageEvent = eventHelper;

               document.Open();
               PdfPTable table = CreatePdfPTable(dataTable, 10);

               if (table.Rows.Count > 0)
               {
                  // Add the table
                  document.Add(table);//here my code is breaking and stoping visual studio
                  document.Close();

                  // Create a new MemoryStream using the existing one's data
                  MemoryStream clonedMemoryStream = new MemoryStream(memoryStream.ToArray());
                  // Reset the position of the cloned MemoryStream to the beginning
                  clonedMemoryStream.Position = 0;
                  // Add the cloned MemoryStream to templateStreams
                            templateStreams.Add(clonedMemoryStream);
                        }
                        else
                        {
                            Console.WriteLine("The PdfPTable has no rows.");
                        }
                    }
                }
            }
            else
            {
                Console.WriteLine("The DataTable is null or empty.");
            }
        }

事件处理程序类

public class HeaderFooter : PdfPageEventHelper
    {
        private bool addHeader = true;
        private bool addFooter = true;

        public override void OnStartPage(PdfWriter writer, Document document)
        {
            if (addHeader)
            {
                PdfPTable header = new PdfPTable(1);
                header.TotalWidth = document.PageSize.Width;
                header.DefaultCell.Border = 0;
                header.AddCell(new Phrase("Your Header Content Here", new Font(Font.FontFamily.HELVETICA, 12, Font.NORMAL)));
                document.Add(header);
            }
        }

        public override void OnEndPage(PdfWriter writer, Document document)
        {
            if (addFooter)
            {
                PdfPTable footer = new PdfPTable(1);
                footer.TotalWidth = document.PageSize.Width;
                footer.DefaultCell.Border = 0;
                footer.AddCell(new Phrase("Your Footer Content Here", new Font(Font.FontFamily.HELVETICA, 12, Font.NORMAL)));
                document.Add(footer);
            }
        }

    }

当我在事件处理程序代码下面评论时,上面的代码正在工作。

HeaderFooter eventhelper = new HeaderFooter();
writer.PageEvent = eventHelper;

它将生成带有数据表中数据的pdf。但是当我取消注释事件处理程序代码以添加页眉和页脚并运行应用程序时。 调试器挂起几秒钟,然后在下面的行停止 Visual Studio

 document.Add(table);//here debugger gets hanged  and stops visual studio 

我唯一想要的就是在pdf中设置页眉和页脚。 在页眉中我想添加公司徽标,在页脚中我想添加公司地址。

任何帮助将不胜感激...

提前致谢。

.net asp.net-core .net-core itext itext7
1个回答
0
投票

您遇到的问题是您在使用 Visual Studio 时遇到的问题,这可能是因为您如何将内容添加到 pdf 文档。

OnStartPage
OnEndPage
这些方法会被递归调用,因为它们内部的
document.Add(header)
document.Add(footer)
会触发额外的页面事件,进而再次调用
OnStartPage
OnEndPage
。此递归调用堆栈可能会导致 Visual Studio 中的溢出或挂起。为了避免无限递归,您可以使用
ColumnText
或直接内容添加方法 (
PdfContentByte
),而不是直接添加到
Document

您可以尝试以下代码:

public class HeaderFooter : PdfPageEventHelper
{
    private Image logo;

    public HeaderFooter(string logoPath)
    {
        try
        {
            logo = Image.GetInstance(logoPath);
            logo.ScalePercent(50);
            logo.Alignment = Image.ALIGN_CENTER;
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: " + ex.Message);
        }
    }

    public override void OnEndPage(PdfWriter writer, Document document)
    {
        Rectangle pageSize = document.PageSize;

        if (logo != null)
        {
            logo.SetAbsolutePosition(pageSize.GetLeft(40), pageSize.GetTop(40) - logo.ScaledHeight);
            writer.DirectContent.AddImage(logo);
        }

        ColumnText.ShowTextAligned(writer.DirectContent, Element.ALIGN_CENTER, 
            new Phrase("Address", new Font(Font.FontFamily.HELVETICA, 10)), 
            pageSize.Width / 2, pageSize.GetBottom(30), 0);
    }
}

创建 pdf 时添加页眉页脚的代码。确保添加徽标路径:

HeaderFooter eventHelper = new HeaderFooter("path/logo.jpg");
writer.PageEvent = eventHelper;
© www.soinside.com 2019 - 2024. All rights reserved.