iTextSharp打印gridview

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

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

  2. 方向是LTR,而不是RTL。

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

代码 :

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和catch以避免exception(问题3):

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

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

如何解决这些问题?

在此处输入图像描述

在输出中你可以看到LTR上的英文列和RTL上的阿拉伯语专栏。 如果你想在RTL页面上显示GridView,你可以使用

Put the Grid View here

。 网格视图:

                                 

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库。