我想使用数据表中的数据生成 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中设置页眉和页脚。 在页眉中我想添加公司徽标,在页脚中我想添加公司地址。
任何帮助将不胜感激...
提前致谢。
您遇到的问题是您在使用 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;