ปัญหา iTextSharp: Export PDF จาก GridView ไม่สามารถแสดง ภาษาไทยได้
Code
private void ExportToPDF(string strFileName, GridView dg)
{
Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition",
"attachment;filename=myGridView.pdf");
Response.Cache.SetCacheability(HttpCacheability.NoCache);
BaseFont EnCodefont = BaseFont.CreateFont(Server.MapPath("/font/ANGSA.TTF"), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font Nfont = new Font(EnCodefont, 18, Font.NORMAL);
StringWriter sw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(sw);
myGridView.RenderControl(hw);
StringReader sr = new StringReader(sw.ToString());
Document pdfDoc = new Document(PageSize.A4, 30, 20, 40, 40);
HTMLWorker htmlworker = new HTMLWorker(pdfDoc);
PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
pdfDoc.Open();
pdfDoc.Add(new Paragraph("รายงานข้อมูลประจำวันที่ " + System.DateTime.Now.ToString("dd/MM/yyyy"), Nfont));
pdfDoc.Add(new Paragraph("ทดสอบ", Nfont));
htmlworker.Parse(sr);
pdfDoc.Close();
Response.Write(pdfDoc);
Response.End();
พอดีจะทำการ export gridview แต่ว่า ภาษาไทยนั้น show ได้แต่ใน Paragraph ที่มีการ เรียก Nfont ที่มีการกำหนด font ไว้แล้ว...
โดยปกติแล้ว default front ของ itextsharp นั้นเป้น HELVETICA มันไม่ support ภาษาไทย..
แต่ว่าเวลาดึงเอา data มาจาก gridview นั้นใช้คำสั่ง htmlworker.Parse(sr); ซึ่งไม่รู้ว่าจะเอา font ภาษาไทยไป..แทรกไว้ตรงไหน
รบกวนผู้รู้ช่วยแนะนำด้วยครับ...
ลองใช้ FontFactory.GetFont กับ FontFactory.Register แล้วก็ได้ไม่ได้..
ลองใช้ code ที่เป็น Table แล้วไปดึงแต่ล่ะ cell มาก็ แทรกภาษาที่กำหนดไว้ไม่ได้อยู่ดี...Tag : .NET, C#
Date :
2011-01-04 11:04:21
By :
Juniper
View :
15602
Reply :
11
ลองใช้ font ของ SIPA หรือยังครับ download มาลองใช้ดูครับ
Date :
2011-01-04 12:10:20
By :
numenoy
เรื่อง font ไม่มีปัญหาครับ... แต่ปัญหาคือจะทำยังไงให้.. เอา data ที่ดึงมาจาก gridview แล้ว export ออกไปเป้น ภาษาไทยครับ
มีหลายๆ ตัวอย่าง เขามีแต่ใช้เป็น Phase , Paragraph ซึ่งสามารถ เอา font ที่กำหนด...มาต่อท้าย ใช้ได้ครับ
Date :
2011-01-04 12:44:57
By :
Juniper
ลองใช้อีก code นึงซึ่งเป็นการ สร้าง table มาแล้วก็ add cell เข้าไป.. ก็หาที่แทรก font ที่กำหนดไว้ ไม่ได้ครับ..
Code
protected void btnExportPDF_Click(object sender, EventArgs e)
{
GridView1.AllowPaging = Convert.ToBoolean(rbPaging.SelectedItem.Value);
GridView1.DataBind();
//Create a table
iTextSharp.text.Table table = new iTextSharp.text.Table(GridView1.Columns.Count);
table.Cellpadding = 5;
//Set the column widths
int[] widths = new int[GridView1.Columns.Count];
for (int x = 0; x < GridView1.Columns.Count; x++)
{
widths[x] = (int)GridView1.Columns[x].ItemStyle.Width.Value ;
string cellText = Server.HtmlDecode(GridView1.HeaderRow.Cells[x].Text);
iTextSharp.text.Cell cell = new iTextSharp.text.Cell(cellText);
//iTextSharp.text.Cell cell = new iTextSharp.text.Cell(new Phrase("Basic Account Information", FontFactory.GetFont(FontFactory.HELVETICA, 9, iTextSharp.text.Font.BOLD)));
cell.BackgroundColor = new Color (System.Drawing.ColorTranslator.FromHtml("#008000"));
table.AddCell(cell);
}
table.SetWidths(widths);
//Transfer rows from GridView to table
for (int i = 0; i < GridView1.Rows.Count; i++)
{
if (GridView1.Rows[i].RowType == DataControlRowType.DataRow)
{
for (int j = 0; j < GridView1.Columns.Count; j++)
{
string cellText = Server.HtmlDecode(GridView1.Rows[i].Cells[j].Text);
iTextSharp.text.Cell cell = new iTextSharp.text.Cell(cellText);
//Set Color of Alternating row
if (i % 2 != 0)
{
cell.BackgroundColor = new Color(System.Drawing.ColorTranslator.FromHtml("#C2D69B"));
}
table.AddCell(cell);
}
}
}
BaseFont EnCodefont = BaseFont.CreateFont(Server.MapPath("/font/ANGSA.TTF"), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font Nfont = new Font(EnCodefont, 18, Font.NORMAL);
Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f);
PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
pdfDoc.Open();
pdfDoc.Add(new Paragraph("รายงานข้อมูลประจำวันที่ " + System.DateTime.Now.ToString("dd/MM/yyyy"), Nfont));
pdfDoc.Add(table);
pdfDoc.Close();
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.pdf");
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Write(pdfDoc);
Response.End();
}
อยากแทรก font ตรง pdfDoc.Add(table); แต่ทำไม่เป้นจริงๆ ครับ.. รบกวนผู้รู้แนะนำด้วยครับ
Date :
2011-01-04 12:50:17
By :
Juniper
แก้ได้แล้วครับ.. ทาง [email protected] เขาแนะนำว่าให้ไปใช้ FontProvider
แล้วพอดีไปเจอเว็บตุรกี http://forum.ceturk.com/archive/index.php/t-22271.html
ก็เลยแก้เอาตามนี้ ด่านล่างนี้ เอาไปใช้ได้เลยครับ หากใครติดปัญหานี้แบบผม...
Code
public class MyFontFactoryImpl : FontFactoryImp
{
Font defaultFont;
public MyFontFactoryImpl()
{
BaseFont tahoma = BaseFont.CreateFont(@"C:\WINDOWS\Fonts\tahoma.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
defaultFont = new Font(tahoma, 12);
}
public override Font GetFont(string fontname, string encoding, Boolean embedded, float size, int style, BaseColor color, Boolean cached )
{
return defaultFont;
}
}
public class HtmlToPdf
{
string _html;
public HtmlToPdf(string html)
{
if (!(FontFactory.FontImp is MyFontFactoryImpl))
FontFactory.FontImp = new MyFontFactoryImpl();
_html = html;
}
public void Render(Stream stream)
{
StringReader sr = new StringReader(_html);
Document pdfDoc = new Document();
PdfWriter.GetInstance(pdfDoc, stream);
HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
pdfDoc.Open();
htmlparser.Parse(sr);
pdfDoc.Close();
}
public void Render(HttpResponse response, string fileName)
{
response.Clear();
response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", fileName));
response.ContentType = "application/octet-stream";
Render(response.OutputStream);
response.End();
}
}
เอาไปใช้งาน..
Code
protected void ImageButton2_Click(object sender, ImageClickEventArgs e)
{
StringWriter sw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(sw);
myGridView.AllowPaging = false;
myGridView.DataBind();
myGridView.RenderControl(hw);
HtmlToPdf htmlToPdf = new HtmlToPdf(sw.ToString());
htmlToPdf.Render(Response, "test.pdf");
}
เหนื่อยจริงๆ เลยครับ ใช้เวลา 3 วันเต็มๆ
http://www.vs2soft.com
Date :
2011-01-05 23:31:01
By :
Juniper
หามานานเหมือนกันค่ะ เกือบมีความหวัง แต่อ่าน code แล้วไม่เข้าใจ แล้วเอามา compile ก็ไม่ผ่านค่ะ เช่น
if (!(FontFactory.FontImp is MyFontFactoryImpl))
แต่ FontProvider เป็นยังไงคะ ใน code นี้ไม่เห็นเลยค่ะ
ขอคำแนะนำด้วยนะคะ
Date :
2011-06-02 16:22:47
By :
Amilin
ขอบคุณค่ะคุณ webmaster คือต้องการจะ parse จาก html ที่มีภาษาไทยไปเป็น pdf เหมือนคุณ Juniper ค่ะ
ถ้าจะให้แสดง text ธรรมา จะเขียน Paragraph paragraph = new Paragraph("Test Create PDF แสดงภาษาไทย", font); ซื่งสามารถกำหนด font ได้ค่ะ อันนี้ไม่มีปัญหา จะมีก็แต่ สระกับวรรณยุกต์ซ้อนกันค่ะ แต่ถ้าใช้ htmlWorker.parse มันไม่มีให้กำหนด font เลยค่ะ
Date :
2011-06-02 17:07:42
By :
Amilin
Code (C#)
iTextSharp.text.Document document = null;
try
{
document = new iTextSharp.text.Document();
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream("HelloWorld.pdf", FileMode.Create));
document.Open();
BaseFont baseFont = BaseFont.CreateFont(@"C:\WINDOWS\Fonts\angsau.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED, true);
Phrase phrase = new Phrase("ผู้กัน", new iTextSharp.text.Font(baseFont));
Paragraph paragraph = new Paragraph();
paragraph.Add(phrase);
document.Add(paragraph);
}
catch (Exception ex) {
throw ex;
}
finally
{
document.Close();
}
วรรณยุกต์ มันกระโดด ใครเคยเจอบอกหน่อยครับ
Date :
2012-09-11 18:25:53
By :
itextsharp
Load balance : Server 02