iTextSharp для печати gridview
Я использую iTextSharp для печати сетки, но я сталкиваюсь с некоторыми проблемами:
никаких арабских символов не появляется вообще.
направление ltr и я затухающий вместо РТЛ.
некоторые столбцы в 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 ответов
В 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 библиотека.