iTextSharp打印gridview

时间:2012-06-19 15:00:48

标签: c# asp.net printing fonts itextsharp

我使用iTextSharp打印网格视图但我遇到了一些问题:

  1. 根本没有阿拉伯字符出现。

  2. 方向是LTR而我改为RTL。

  3. gridview中的一些列是templatefields(label,imagebutton,...),我无法处理这种情况。我不会展示所有这些内容(例如删除按钮,...)

  4. 代码:

     protected void ExportToPDF(GridView gvReport, bool LandScape)
            {
                int noOfColumns = 0, noOfRows = 0;
                DataTable tbl = null;
    
                if (gvReport.AutoGenerateColumns)
                {
                    tbl = gvReport.DataSource as DataTable; // Gets the DataSource of the GridView Control.
                    noOfColumns = tbl.Columns.Count;
                    noOfRows = tbl.Rows.Count;
                }
                else
                {
                    noOfColumns = gvReport.Columns.Count;
                    noOfRows = gvReport.Rows.Count;
                }
    
                float HeaderTextSize = 8;
                float ReportNameSize = 10;
                float ReportTextSize = 8;
                float ApplicationNameSize = 7;
    
                // Creates a PDF document
    
                Document document = null;
                if (LandScape == true)
                {
                    // Sets the document to A4 size and rotates it so that the     orientation of the page is Landscape.
                    document = new Document(PageSize.A4.Rotate(), 0, 0, 15, 5);
                }
                else
                {
                    document = new Document(PageSize.A4, 0, 0, 15, 5);
                }
    
                // Creates a PdfPTable with column count of the table equal to no of columns of the gridview or gridview datasource.
                iTextSharp.text.pdf.PdfPTable mainTable = new iTextSharp.text.pdf.PdfPTable(noOfColumns);
    
                // Sets the first 4 rows of the table as the header rows which will be repeated in all the pages.
                mainTable.HeaderRows = 4;
    
                // Creates a PdfPTable with 2 columns to hold the header in the exported PDF.
                iTextSharp.text.pdf.PdfPTable headerTable = new iTextSharp.text.pdf.PdfPTable(2);
    
                // Creates a phrase to hold the application name at the left hand side of the header.
                Phrase phApplicationName = new Phrase("Contact List", FontFactory.GetFont("Arial", ApplicationNameSize, iTextSharp.text.Font.TIMES_ROMAN));
    
                // Creates a PdfPCell which accepts a phrase as a parameter.
                PdfPCell clApplicationName = new PdfPCell(phApplicationName);
                // Sets the border of the cell to zero.
                clApplicationName.Border = PdfPCell.NO_BORDER;
                // Sets the Horizontal Alignment of the PdfPCell to left.
                clApplicationName.HorizontalAlignment = Element.ALIGN_LEFT;
    
                // Creates a phrase to show the current date at the right hand side of the header.
                Phrase phDate = new Phrase(DateTime.Now.Date.ToString("dd/MM/yyyy"), FontFactory.GetFont("Arial", ApplicationNameSize, iTextSharp.text.Font.NORMAL));
    
                // Creates a PdfPCell which accepts the date phrase as a parameter.
                PdfPCell clDate = new PdfPCell(phDate);
                // Sets the Horizontal Alignment of the PdfPCell to right.
                clDate.HorizontalAlignment = Element.ALIGN_RIGHT;
                // Sets the border of the cell to zero.
                clDate.Border = PdfPCell.NO_BORDER;
    
                // Adds the cell which holds the application name to the headerTable.
                headerTable.AddCell(clApplicationName);
                // Adds the cell which holds the date to the headerTable.
                headerTable.AddCell(clDate);
                // Sets the border of the headerTable to zero.
                headerTable.DefaultCell.Border = PdfPCell.NO_BORDER;
    
                // Creates a PdfPCell that accepts the headerTable as a parameter and then adds that cell to the main PdfPTable.
                PdfPCell cellHeader = new PdfPCell(headerTable);
                cellHeader.Border = PdfPCell.NO_BORDER;
                // Sets the column span of the header cell to noOfColumns.
                cellHeader.Colspan = noOfColumns;
                // Adds the above header cell to the table.
                mainTable.AddCell(cellHeader);
    
                // Creates a phrase which holds the file name.
                Phrase phHeader = new Phrase("Contact List", FontFactory.GetFont("Arial", ReportNameSize, iTextSharp.text.Font.BOLD));
                PdfPCell clHeader = new PdfPCell(phHeader);
                clHeader.Colspan = noOfColumns;
                clHeader.Border = PdfPCell.NO_BORDER;
                clHeader.HorizontalAlignment = Element.ALIGN_CENTER;
                mainTable.AddCell(clHeader);
    
                // Creates a phrase for a new line.
                Phrase phSpace = new Phrase("\n");
                PdfPCell clSpace = new PdfPCell(phSpace);
                clSpace.Border = PdfPCell.NO_BORDER;
                clSpace.Colspan = noOfColumns;
                mainTable.AddCell(clSpace);
    
                // Sets the gridview column names as table headers.
                for (int i = 0; i < noOfColumns; i++)
                {
                    Phrase ph = null;
    
                    if (gvReport.AutoGenerateColumns)
                    {
                        ph = new Phrase(tbl.Columns[i].ColumnName, FontFactory.GetFont("Arial", HeaderTextSize, iTextSharp.text.Font.BOLD));
                    }
                    else
                    {
                        ph = new Phrase(gvReport.Columns[i].HeaderText, FontFactory.GetFont("Arial", HeaderTextSize, iTextSharp.text.Font.BOLD));
                    }
    
                    mainTable.AddCell(ph);
                }
    
                // Reads the gridview rows and adds them to the mainTable
                for (int rowNo = 0; rowNo < noOfRows; rowNo++)
                {
                    for (int columnNo = 0; columnNo < noOfColumns; columnNo++)
                    {
                        if (gvReport.AutoGenerateColumns)
                        {
                            string s = gvReport.Rows[rowNo].Cells[columnNo].Text.Trim();
                            Phrase ph = new Phrase(s, FontFactory.GetFont("Arial", ReportTextSize, iTextSharp.text.Font.NORMAL));
                            mainTable.AddCell(ph);
                        }
                        else
                        {
                            if (gvReport.Columns[columnNo] is TemplateField)
                            {
                                try
                                {
                                    Label lc = gvReport.Rows[rowNo].Cells[columnNo].Controls[1] as Label;
    
                                    string s = lc.Text.Trim();
                                    Phrase ph = new Phrase(s, FontFactory.GetFont("Arial", ReportTextSize, iTextSharp.text.Font.NORMAL));
                                    mainTable.AddCell(ph);
                                }
                                catch (NullReferenceException ee)
                                {
                                    noOfColumns--;
                                }
                                catch (Exception ee)
                                {
                                    noOfColumns--;
                                }
                            }
                            else
                            {
                                string s = gvReport.Rows[rowNo].Cells[columnNo].Text.Trim();
                                Phrase ph = new Phrase(s, FontFactory.GetFont("Arial", ReportTextSize, iTextSharp.text.Font.NORMAL));
                                mainTable.AddCell(ph);
                            }
                        }
                    }
    
                    // Tells the mainTable to complete the row even if any cell is left incomplete.
                    mainTable.CompleteRow();
                }
    
                // Gets the instance of the document created and writes it to the output stream of the Response object.
                PdfWriter.GetInstance(document, Response.OutputStream);
    
                // Creates a footer for the PDF document.
                HeaderFooter pdfFooter = new HeaderFooter(new Phrase(), true);
                pdfFooter.Alignment = Element.ALIGN_CENTER;
                pdfFooter.Border = iTextSharp.text.Rectangle.NO_BORDER;
    
                // Sets the document footer to pdfFooter.
                document.Footer = pdfFooter;
                // Opens the document.
                document.Open();
                // Adds the mainTable to the document.
                document.Add(mainTable);
                // Closes the document.
                document.Close();
    
                Response.ContentType = "application/pdf";
                Response.AddHeader("content-disposition", "attachment; filename= ContactList.pdf");
                Response.End();
            }
    

    原始版本为Here

    我更改了这一行并添加了try和catch以避免异常(问题3):

    DataBoundLiteralControl lc = gvReport.Rows[rowNo].Cells[columnNo].Controls[0] as DataBoundLiteralControl;
    

    Label lc = gvReport.Rows[rowNo].Cells[columnNo].Controls[1] as Label;
    

    如何解决这些问题?

2 个答案:

答案 0 :(得分:8)

enter image description here

在输出中你可以看到LTR上的英文列和RTL上的阿拉伯语专栏。如果要在RTL页面上显示GridView,可以使用<div dir="rtl">Put the Grid View here</div>。 GridView的:

 <asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" AutoGenerateColumns="False">
        <Columns>
            <asp:TemplateField HeaderText="العربية" SortExpression="العربية">
                <ItemTemplate>
                    <asp:Label ID="arabic" runat="server" Text='<%# Eval("العربية")%>' />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
        <Columns>
            <asp:TemplateField HeaderText="English" SortExpression="English">
                <ItemTemplate>
                    <asp:Label ID="english" runat="server" Text='<%# Eval("English") %>' />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:Button ID="deleteButton" runat="server" Text="Delete" />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:HyperLink ID="open" runat="server" Text="Open" NavigateUrl="~/Default.aspx"/>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
        SelectCommand="SELECT [English], [العربية] FROM [Test]"></asp:SqlDataSource>
    <br />
    <asp:Button ID="btnExport" runat="server" OnClick="btnExport_Click" Text="Export to PDF" />

CS代码:

 protected void ExportPDF(GridView gridViewReport)
    {
        int columnNumber = 0, rowNumber = 0;
        DataTable tbl = null;

        if (gridViewReport.AutoGenerateColumns)
        {
            tbl = gridViewReport.DataSource as DataTable; // Gets the DataSource of the GridView Control.
            columnNumber = tbl.Columns.Count;
            rowNumber = tbl.Rows.Count;
        }
        else
        {
            columnNumber = gridViewReport.Columns.Count;
            rowNumber = gridViewReport.Rows.Count;
        }
        // Creates a PDF document
        Document document = null;
        document = new Document(PageSize.A4, 0, 0, 15, 5);
        PdfPTable _table = new PdfPTable(GridView1.Columns.Count);
        _table.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
        BaseFont baseFont = BaseFont.CreateFont("c:\\\\windows\\\\fonts\\\\tahoma.ttf", BaseFont.IDENTITY_H, true); // Font which has Arabic characters
        iTextSharp.text.Font font = new iTextSharp.text.Font(baseFont, 10, iTextSharp.text.Font.NORMAL);

        // Sets the gridview column names as table headers.
        for (int i = 0; i < columnNumber; i++)
        {
            iTextSharp.text.pdf.PdfPCell ph = null;

            if (gridViewReport.AutoGenerateColumns)
            {
                ph = new PdfPCell(new Phrase(10, tbl.Columns[i].ColumnName, font));
            }
            else
            {
                ph = new PdfPCell(new Phrase(10, gridViewReport.Columns[i].HeaderText, font));
            }
            if (ph != null && gridViewReport.Columns[i].HeaderText != "")
            {
                if (Regex.IsMatch(gridViewReport.Columns[i].HeaderText, "^[a-zA-Z0-9 ]*$")) // Check if Header Text is English
                {
                    ph.RunDirection = PdfWriter.RUN_DIRECTION_LTR; // Left to Right
                    BaseColor color = new BaseColor(Color.Red);
                    ph.BackgroundColor = color;
                    _table.AddCell(ph);
                }
                else
                {
                    ph.RunDirection = PdfWriter.RUN_DIRECTION_RTL; //Right to Left
                    BaseColor color = new BaseColor(Color.Red);
                    ph.BackgroundColor = color;
                    _table.AddCell(ph);
                }
            }
            else
            {
                ph.Border = iTextSharp.text.Rectangle.NO_BORDER;
                _table.AddCell(ph);
            }
        }
        // Get the gridview rows and adds them to the _table
        for (int rowIteration = 0; rowIteration < rowNumber; rowIteration++)
        {
            for (int columnIteration = 0; columnIteration < columnNumber; columnIteration++)
            {
                if (gridViewReport.AutoGenerateColumns) //Check if AutoGenrated Colunms
                {
                    string s = gridViewReport.Rows[rowIteration].Cells[columnIteration].Text.Trim();
                    PdfPCell ph = new PdfPCell(new Phrase(10, s, font));
                    _table.AddCell(ph);
                }
                else
                {
                    if (gridViewReport.Columns[columnIteration] is TemplateField) // Check if Item Template
                    {
                        PdfPCell ph = null;
                        Label lc = gridViewReport.Rows[rowIteration].Cells[columnIteration].Controls[1] as Label; // Label
                        Button btn = gridViewReport.Rows[rowIteration].Cells[columnIteration].Controls[1] as Button;// Button
                        HyperLink hyperLink = gridViewReport.Rows[rowIteration].Cells[columnIteration].Controls[1] as HyperLink; // HyperLink

                        if (lc != null)
                        {

                            string s = lc.Text.Trim();
                            ph = new PdfPCell(new Phrase(10, s, font));
                            if (Regex.IsMatch(s, "^[a-zA-Z0-9 ]*$")) //Check if cell string is English
                            {   ph.RunDirection = PdfWriter.RUN_DIRECTION_LTR; // Left to Right
                                _table.AddCell(ph); 
                            }
                            else
                            {
                                ph.RunDirection = PdfWriter.RUN_DIRECTION_RTL; // Right to Left
                                _table.AddCell(ph);
                            }

                        }
                        else if (btn != null)
                        {
                            ph = new PdfPCell(new Phrase(10, btn.Text, font));
                            ph.Phrase.Clear(); // Clear the Cell Phrase
                            ph.Border = iTextSharp.text.Rectangle.NO_BORDER;

                            _table.AddCell(ph);
                        }
                        else if (hyperLink != null)
                        {
                            ph = new PdfPCell(new Phrase(10, hyperLink.Text, font));
                            ph.Phrase.Clear(); //Clear the Cell Phrase
                            ph.Border = iTextSharp.text.Rectangle.NO_BORDER; 
                            _table.AddCell(ph);
                        }
                        else
                        {
                            _table.AddCell("--");
                        }
                    }
                    else
                    {
                        string s = gridViewReport.Rows[rowIteration].Cells[columnIteration].Text.Trim();
                        PdfPCell ph = new PdfPCell(new Phrase(10, s, font));
                        _table.AddCell(ph);
                    }
                }
            }
            _table.CompleteRow();
        }
        PdfWriter.GetInstance(document, Response.OutputStream);
        // Opens the document.
        document.Open();
        // Adds the _table to the document.
        document.Add(_table);
        // Closes the document.
        document.Close();
        Page.Response.ContentType = "application/pdf";
        Page.Response.AddHeader("content-disposition", "attachment;filename=MyGrid.pdf");
        Page.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Page.Response.Write(document);
        Page.Response.End();

    }

此代码可能不是完美编码,但我希望这可以帮助您获得所需的结果。

答案 1 :(得分:4)

This GridView exporting library支持RTL。 您也可以尝试PdfReport库。