gpt4 book ai didi

c# - iTextSharp 打印 gridview

转载 作者:太空狗 更新时间:2023-10-29 18:23:02 25 4
gpt4 key购买 nike

我使用 iTextSharp 打印 GridView ,但我遇到了一些问题:

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

  2. 方向是 LTR,我想它是 RTL。

  3. gridview 中的某些列是模板字段(标签、图像按钮等),我无法处理这种情况。我不会显示所有这些(例如删除按钮,...)

代码:

 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;

如何解决这些问题?

最佳答案

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

}

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

关于c# - iTextSharp 打印 gridview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11103771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com