2014-11-18 4 views
0

iTextsharp를 사용하여 gridview 데이터를 PDF로 내보내려고합니다. gridview 데이터에는 페르시아어/아랍어 데이터가 들어 있습니다. 그것은 그냥 빈 PDF 파일에 결과 ... 왜 그럴 수 있을까? 당신이 발생하는 문제가 아랍어를 사용하고 있다는 사실에 의해 발생되지 않기 때문에itext를 사용하여 아랍어 데이터를 pdf로 내보내기

GridView1.DataSource = Session("dt") 
    GridView1.AllowPaging = False 
    GridView1.DataBind() 

    Dim bf As BaseFont = BaseFont.CreateFont(Environment.GetEnvironmentVariable("windir") & "\fonts\tahoma.ttf", BaseFont.IDENTITY_H, True) 
    Dim font As New iTextSharp.text.Font(bf, 10, iTextSharp.text.Font.NORMAL) 
    Dim table As New iTextSharp.text.pdf.PdfPTable(GridView1.Columns.Count) 
    Dim widths As Integer() = New Integer(GridView1.Columns.Count - 1) {} 
    For x As Integer = 0 To GridView1.Columns.Count - 1 
     widths(x) = CInt(GridView1.Columns(x).ItemStyle.Width.Value) 
     Dim cellText As String = Server.HtmlDecode(GridView1.HeaderRow.Cells(x).Text) 
     Dim cell As New iTextSharp.text.pdf.PdfPCell(New Phrase(12, cellText, font)) 
     cell.BackgroundColor = New BaseColor(GridView1.HeaderStyle.BackColor) 
     'cell.BackgroundColor = New BaseColor(System.Drawing.ColorTranslator.FromHtml("#008000")) 
     cell.RunDirection = PdfWriter.RUN_DIRECTION_RTL 
     table.AddCell(cell) 
    Next 
    table.SetWidths(widths) 

    For i As Integer = 0 To GridView1.Rows.Count - 1 
     If GridView1.Rows(i).RowType = DataControlRowType.DataRow Then 
      For j As Integer = 0 To GridView1.Columns.Count - 1 
       Dim cellText As String = Server.HtmlDecode(GridView1.Rows(i).Cells(j).Text) 
       Dim cell As New iTextSharp.text.pdf.PdfPCell(New Phrase(12, cellText, font)) 
       'Set Color of Alternating row 
       If i Mod 2 <> 0 Then 
        'cell.BackgroundColor = New BaseColor(System.Drawing.ColorTranslator.FromHtml("#C2D69B")) 
        cell.BackgroundColor = New BaseColor(GridView1.RowStyle.BackColor) 
       End If 
       cell.RunDirection = PdfWriter.RUN_DIRECTION_RTL 
       table.AddCell(cell) 
      Next 
     End If 
    Next 

    'Create the PDF Document 
    Dim pdfDoc As New Document(PageSize.A4, 10.0F, 10.0F, 10.0F, 0.0F) 
    PdfWriter.GetInstance(pdfDoc, Response.OutputStream) 
    pdfDoc.Open() 
    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]() 
+0

이 질문을 확인하면 도움이 될 것입니다. http://stackoverflow.com/questions/16080741/convert-arabicunicode-content-html-or-xml-to-pdf-using-itextsharp –

답변

1

귀하의 질문은 다소 오해의 소지가 : 다음

내 코드입니다. 문서를 파일에 쓰면 파일이 정상임을 알 수 있습니다.

이 라인에 심각한 오류가 있습니다 :

PdfWriter.GetInstance(pdfDoc, Response.OutputStream) 
... 
Response.ContentType = "application/pdf" 
Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.pdf") 
Response.Cache.SetCacheability(HttpCacheability.NoCache) 
Response.Write(pdfDoc) 
Response.[End]() 

먼저 당신이 다음 콘텐츠 헤더를 설정 Response 개체를 사용하여, 그것을 PDF 바이트를 기록 할 Response.OutputStream를 사용합니다. 이것은 잘못된 구문입니다. 항상 헤더를 정의해야합니다.은 출력 스트림에 바이트를 보내기 전에 을 정의해야합니다.

Furtermore : PDF 바이트를 Document 개체가 아닌 출력 스트림에 써야합니다. 다음과 같은 질문에 대한 답변을 읽을 수는 Response.OutputStreamcontent 바이트를 전송하는 방법에 대한 예를 들어

Response.Write(pdfDoc) 

: 다음 줄이 완료되지 않은 감각 iTextSharp generated PDF: How to send the pdf to the client and add a prompt?

당신이 만드는 방법을 모르는 경우 content 바이트,이 코드에서 살펴 :

using (MemoryStream myMemoryStream = new MemoryStream()) {  
    Document document = new Document();  
    PdfWriter PDFWriter = PdfWriter.GetInstance(document, myMemoryStream); 
    document.Open(); 
    ... 
    document.Close(); 
    byte[] content = myMemoryStream.ToArray(); 
    ... 
} 

항상 byte[]를 사용, 같은 출력 스트림에 document으로 객체를 작성하지 마십시오.