将数据导出为 pdf 时,如何将网格视图上的行数据附加到结束事件页面的标题?

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

我致力于

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);

          


           


          
        }
        
    }
}

图像显示问题如下

在此输入图片描述

asp.net c#-4.0 itext itext7 webmethod
1个回答
0
投票

我建议你采用某种报告系统。

问题是您尝试使用 GridView,而不仅仅是将 GridView 转换为 PDF(如您所见,这可能需要相当多的工作)。

但是,“更多”的挑战是现在您希望 GridView 标题出现在每个页面的顶部。可能稍后,有人会要求您提供页码。也许稍后,有人想要在报告中进行分组。也许稍后,您需要一份包含总计的报告。

换句话说,结果是您将编写大量代码,并且所有这些代码都将难以维护、难以更改、难以添加新的简单功能,例如每页顶部的标题、页码等.然后,当所有工作完成后,您就需要 PDF 格式的结果。

因此,我建议您不要手动编写输出代码,不要尝试制作 PDF,也不要尝试将 GridView 转换和更改为某种“报告”系统。

有一些很棒的工具可以实现此目的。事实上,webforms甚至vs2022仍然支持使用所谓的RDL报告(RDL=报告定义语言)。因此,我建议您确保安装了 RDL 报告工具,然后考虑使用报告。

因此,对于酒店的简单报告,然后与报告撰写者一起,我将其布局如下:

enter image description here

现在,网页和报告如下所示:

enter image description here

请非常密切地注意报告系统如何导出到 Excel、Word 或 PDF。请注意上面甚至有一个打印 PDF 按钮。当我选择 PDF 时,它会为我下载 PDF(再次节省大量代码)。请注意,在上面的第二页非常接近,标题是重复的。

所以,我建议你采用报告制度。 RDL 和报表设计器是免费的,并且是 asp.net webforms 的一部分。虽然报告编写者和设计者确实有一个学习曲线,但上面的报告是在我不需要编写任何代码的情况下创建的!现在,我以前的大部分经验都来自桌面和 MS-Access(它拥有我用过的最好的报告编写器)。因此,我一开始发现 RDL 设计器工具有点挑战,但花一天时间学习这个系统,然后您就拥有了一个可以使用多年的非常高质量的报告系统。更棒的是出色的打印机支持,更棒的是自动输出为 PDF。随着时间的推移,我怀疑您需要更多报告,而使用 GridiView 并不是为此目的而设计的,因此您现有的斗争。

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