iTextSharp для печати gridview

Я использую iTextSharp для печати сетки, но я сталкиваюсь с некоторыми проблемами:

  1. никаких арабских символов не появляется вообще.

  2. направление ltr и я затухающий вместо РТЛ.

  3. некоторые столбцы в gridview являются templatefields (label, imagebutton,...), и я не могу справиться с этим делом. Я не буду показывать их все (например, кнопку delete,...)

код :

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

оригинал здесь

Я меняю эту строку и добавляю try and 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 ответов


enter image description here

В out put вы можете увидеть, что английские столбцы на LTR и арабский столбец на RTL. если вы хотите отобразить GridView на странице с RTL, чем вы можете использовать <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();

    }

этот код может быть не идеально закодирован, но я надеюсь, что это поможет вам получить необходимые результаты.


эта библиотека экспорта GridView поддержка RTL. Также вы можете попробовать PdfReport библиотека.