我致力于
itextcharp
库将网格视图导出为 pdf 。
我面临数据中标题列显示的问题,它必须
显示上面的数据 所以我的问题数据行显示在标题上方 完全正确。
我需要在顶部显示标题,然后详细说明行数据与标题的一致性
我需要在每个页面上显示标题数据 header 表示列标题
那么如何解决这个问题.
class pageeventhelper
的结束页面事件我添加标题数据,因为我需要在每个页面上显示标题
我尝试如下:
[WebMethod]
public byte[] ExportGridViewToPdf(string[][] gridData, string[] columnNames)
{
try
{
Document document = new Document(PageSize.A4, 10f, 10f, 10f, 0f);
var ms = new MemoryStream();
var writer = PdfWriter.GetInstance(document, ms);
var tahomaFontFile = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.Fonts),
"Tahoma.ttf");
var tahomaBaseFont = BaseFont.CreateFont(tahomaFontFile,
BaseFont.IDENTITY_H,
BaseFont.EMBEDDED);
var tahomaFont = new Font(tahomaBaseFont, 8, Font.NORMAL);
PageEventHelper pageEventHelper = new PageEventHelper(columnNames, tahomaFont, gridData);
writer.PageEvent = pageEventHelper;
document.Open();
var table = new PdfPTable(columnNames.Length)
{
RunDirection = PdfWriter.RUN_DIRECTION_RTL
};
table.WidthPercentage = 100;
foreach (var row in gridData)
{
var cells = new PdfPCell[columnNames.Length];
for (int i = 0; i < columnNames.Length; i++)
{
cells[i] = new PdfPCell(new Phrase(row[i], tahomaFont));
cells[i].FixedHeight = 25f;
table.AddCell(cells[i]); // Add each cell individually
}
}
document.Add(table);
document.Close();
writer.Close();
HttpContext.Current.Response.ContentType = "application/pdf";
return ms.ToArray();
}
catch (Exception ex)
{
throw new Exception("Error exporting GridView to PDF: " + ex.Message);
}
}
using iText.Kernel.Pdf;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Web;
namespace EREG.BusinessLayer
{
public class PageEventHelper : PdfPageEventHelper
{
private int pageNumber = 0;
private int totalPages = 0;
PdfTemplate footerTemplate;
BaseFont bf = null;
PdfContentByte cb;
private readonly string[] _columnNames;
private readonly iTextSharp.text.Font _tahomaFont;
private readonly string[][] _gridData;
public PageEventHelper(string[] columnNames, iTextSharp.text.Font tahomaFont, string[][] gridData)
{
_columnNames = columnNames;
_tahomaFont = tahomaFont;
_gridData = gridData;
}
public override void OnOpenDocument(iTextSharp.text.pdf.PdfWriter writer, Document document)
{
try
{
bf = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
cb = writer.DirectContent;
footerTemplate = cb.CreateTemplate(50, 50);
}
catch (DocumentException de)
{
//handle exception here
}
catch (System.IO.IOException ioe)
{
//handle exception here
}
}
public override void OnStartPage(iTextSharp.text.pdf.PdfWriter writer, Document document)
{
base.OnStartPage(writer, document);
pageNumber++;
}
public override void OnCloseDocument(iTextSharp.text.pdf.PdfWriter writer, Document document)
{
base.OnCloseDocument(writer, document);
//totalPages = writer.PageNumber;
footerTemplate.BeginText();
footerTemplate.SetFontAndSize(bf, 12);
footerTemplate.SetTextMatrix(0, 0);
footerTemplate.ShowText((writer.PageNumber - 1).ToString());
footerTemplate.EndText();
}
public override void OnEndPage(iTextSharp.text.pdf.PdfWriter writer, Document document)
{
base.OnEndPage(writer, document);
// Create a new PdfContentByte instance
PdfContentByte cb = writer.DirectContent;
// Add page number at the bottom
string pageNumberText = $"Page {writer.PageNumber} of ";
float pageNumberWidth = bf.GetWidthPoint(pageNumberText, 12);
float pageNumberX = (document.PageSize.Width - pageNumberWidth) / 2;
float pageNumberY = document.BottomMargin;
cb.BeginText();
cb.SetFontAndSize(bf, 12);
cb.SetTextMatrix(pageNumberX, pageNumberY);
cb.ShowText(pageNumberText);
cb.EndText();
// Add the total pages placeholder
cb.AddTemplate(footerTemplate, pageNumberX + pageNumberWidth, pageNumberY);
// Create and add the header table
PdfPTable headerTable = new PdfPTable(_columnNames.Length) { RunDirection = iTextSharp.text.pdf.PdfWriter.RUN_DIRECTION_RTL };
foreach (var columnName in _columnNames)
{
var cell = new PdfPCell(new Phrase(columnName, _tahomaFont));
cell.BackgroundColor = new BaseColor(System.Drawing.Color.LightGray);
cell.HorizontalAlignment = Element.ALIGN_CENTER;
headerTable.AddCell(cell);
}
headerTable.WriteSelectedRows(0, -1, document.LeftMargin, document.PageSize.Height - document.TopMargin - 20, cb);
}
}
}
图像显示问题如下
我建议你采用某种报告系统。
问题是您尝试使用 GridView,而不仅仅是将 GridView 转换为 PDF(如您所见,这可能需要相当多的工作)。
但是,“更多”的挑战是现在您希望 GridView 标题出现在每个页面的顶部。可能稍后,有人会要求您提供页码。也许稍后,有人想要在报告中进行分组。也许稍后,您需要一份包含总计的报告。
换句话说,结果是您将编写大量代码,并且所有这些代码都将难以维护、难以更改、难以添加新的简单功能,例如每页顶部的标题、页码等.然后,当所有工作完成后,您就需要 PDF 格式的结果。
因此,我建议您不要手动编写输出代码,不要尝试制作 PDF,也不要尝试将 GridView 转换和更改为某种“报告”系统。
有一些很棒的工具可以实现此目的。事实上,webforms甚至vs2022仍然支持使用所谓的RDL报告(RDL=报告定义语言)。因此,我建议您确保安装了 RDL 报告工具,然后考虑使用报告。
因此,对于酒店的简单报告,然后与报告撰写者一起,我将其布局如下:
现在,网页和报告如下所示:
请非常密切地注意报告系统如何导出到 Excel、Word 或 PDF。请注意上面甚至有一个打印 PDF 按钮。当我选择 PDF 时,它会为我下载 PDF(再次节省大量代码)。请注意,在上面的第二页非常接近,标题是重复的。
所以,我建议你采用报告制度。 RDL 和报表设计器是免费的,并且是 asp.net webforms 的一部分。虽然报告编写者和设计者确实有一个学习曲线,但上面的报告是在我不需要编写任何代码的情况下创建的!现在,我以前的大部分经验都来自桌面和 MS-Access(它拥有我用过的最好的报告编写器)。因此,我一开始发现 RDL 设计器工具有点挑战,但花一天时间学习这个系统,然后您就拥有了一个可以使用多年的非常高质量的报告系统。更棒的是出色的打印机支持,更棒的是自动输出为 PDF。随着时间的推移,我怀疑您需要更多报告,而使用 GridiView 并不是为此目的而设计的,因此您现有的斗争。