HTML в PDF некоторые символы отсутствуют (itextsharp) - PullRequest
9 голосов
/ 24 августа 2009

Я хочу экспортировать gridview в pdf с помощью библиотеки itextsharp. Проблема в том, что в документе PDF отсутствуют некоторые турецкие символы, такие как İ, ı, Ş, ş и т. Д. Код, используемый для экспорта PDF:

 protected void LinkButtonPdf_Click(object sender, EventArgs e)
    {
        Response.ContentType = "application/pdf";
        Response.ContentEncoding = System.Text.Encoding.UTF8;
        Response.AddHeader("content-disposition", "attachment;filename=FileName.pdf");
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        System.IO.StringWriter stringWrite = new StringWriter();
        System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
        GridView1.RenderControl(htmlWrite);
        StringReader reader = new StringReader(textConvert(stringWrite.ToString()));
        Document doc = new Document(PageSize.A4);
        HTMLWorker parser = new HTMLWorker(doc);
        PdfWriter.GetInstance(doc, Response.OutputStream);
        doc.Open();
        parser.Parse(reader);
        doc.Close();
    }
    public static string textConvert(string S)
    {
        if (S == null) { return null; }
        try
        {
            System.Text.Encoding encFrom = System.Text.Encoding.UTF8;
            System.Text.Encoding encTo = System.Text.Encoding.UTF8;
            string str = S;
            Byte[] b = encFrom.GetBytes(str);
            return encTo.GetString(b);
        }
        catch { return null; }
    }

Примечание. Когда я хочу вставить символы в документ PDF, в нем отображаются отсутствующие символы. Я вставляю символы с этим кодом:

   BaseFont bffont = BaseFont.CreateFont("C:\\WINDOWS\\Fonts\\arial.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        Font fontozel = new Font(bffont, 12, Font.NORMAL, new Color(0, 0, 0));
        doc.Add(new Paragraph("İİııŞŞşşĞĞğğ", fontozel));

Ответы [ 11 ]

7 голосов
/ 26 августа 2009

Наконец, я думаю, что нашел решение, я немного изменил исходный код itextsharp, чтобы показать турецкие символы.

Я добавляю «public const string CP1254 = "Cp1254";» к [BaseFont.cs] в исходном коде.

После этого я изменяю [FactoryProperties.cs]. Я изменился следующим образом;

public Font GetFont(ChainedProperties props)
{
I don't write the whole code.I changed only code below;
------------Default itextsharp code------------------------------------------------------
  if (encoding == null)
                encoding = BaseFont.WINANSI;
            return fontImp.GetFont(face, encoding, true, size, style, color);
-------------modified code--------------------------------------------

            encoding = BaseFont.CP1254;
            return fontImp.GetFont("C:\\WINDOWS\\Fonts\\arial.ttf", encoding, true, size, style, color);
}

.После того, как я скомпилирую новую DLL, будут показаны отсутствующие символы.

5 голосов
/ 13 октября 2009

Нет необходимости изменять исходный код.

Попробуйте это:

iTextSharp.text.pdf.BaseFont STF_Helvetica_Turkish = iTextSharp.text.pdf.BaseFont.CreateFont("Helvetica","Cp1254", iTextSharp.text.pdf.BaseFont.NOT_EMBEDDED);    

iTextSharp.text.Font fontNormal = new iTextSharp.text.Font(STF_Helvetica_Turkish, 12, iTextSharp.text.Font.NORMAL);
3 голосов
/ 10 апреля 2014

Большое спасибо всем, кто разместил образцы ..

Я использую приведенное ниже решение из codeproject, и были проблемы с турецким набором символов из-за шрифта.

Если вы используете htmlworker, вы должны зарегистрировать шрифт и перейти к htmlworker

http://www.codeproject.com/Articles/260470/PDF-reporting-using-ASP-NET-MVC3

      StyleSheet styles = new iTextSharp.text.html.simpleparser.StyleSheet();
                styles.LoadTagStyle("h3", "size", "5");
                styles.LoadTagStyle("td", "size", ".6");
                FontFactory.Register("c:\\windows\\fonts\\arial.ttf", "Garamond");   // just give a path of arial.ttf 
                styles.LoadTagStyle("body", "face", "Garamond");
                styles.LoadTagStyle("body", "encoding", "Identity-H");
                styles.LoadTagStyle("body", "size", "12pt");
                using (var htmlViewReader = new StringReader(htmlText))
                {
                    using (var htmlWorker = new HTMLWorker(pdfDocument, null, styles))
                    {
                        htmlWorker.Parse(htmlViewReader);
                    }
                }
2 голосов
/ 29 марта 2011

Вы можете использовать:

iTextSharp.text.pdf.BaseFont Vn_Helvetica = iTextSharp.text.pdf.BaseFont.CreateFont(@"C:\Windows\Fonts\arial.ttf", "Identity-H", iTextSharp.text.pdf.BaseFont.EMBEDDED);
iTextSharp.text.Font fontNormal = new iTextSharp.text.Font(Vn_Helvetica, 12, iTextSharp.text.Font.NORMAL);
2 голосов
/ 24 августа 2009

Я не знаком с библиотекой iTextSharp; однако, вы, кажется, конвертируете выходные данные своего компонента gridview в строку и читаете из этой строки, чтобы создать свой PDF-документ. У вас также происходит странное преобразование из UTF-8 в UTF-8.

Из того, что я вижу (учитывая, что ваш GridView правильно выводит символы), если вы выводите символы в строку, они будут представлены в памяти как UTF-16. Возможно, вам нужно будет передать эту строку непосредственно в библиотеку PDF (например, как вы передаете необработанную строку UTF-16 .NET "İııŞŞşşĞĞğğ" как есть).

1 голос
/ 01 сентября 2010
BaseFont bF = BaseFont.CreateFont("c:\\arial.ttf","windows-1254",true);
Font f = new Font(bF,12f,Font.NORMAL);
Chunk c = new Chunk();
c.Font = f;
c.Append("Turkish characters: ĞÜŞİÖÇ ğüşıöç");
document.Add(c);

В первой строке вы можете написать их вместо «windows-1254». Все работы:

  • Cp1254
  • ISO-8859-9
  • окна-1254
1 голос
/ 25 августа 2009

для турецкой кодировки

CultureInfo ci = new CultureInfo("tr-TR");
Encoding enc = Encoding.GetEncoding(ci.TextInfo.ANSICodePage);

Если вы выводите HTML, попробуйте другие теги DOCTYPE вверху страницы.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

Обратите внимание, что при использовании HTML вам может понадобиться кодировать символы HTMLE.

Server.HTMLEncode ()

HttpServerUtility.HtmlEncode ()

0 голосов
/ 05 июля 2014

Я настоятельно рекомендую не изменять исходный код itextsharp для решения этой проблемы. Посмотрите на мой другой комментарий по этому вопросу: https://stackoverflow.com/a/24587745/1138663

0 голосов
/ 29 января 2014

Я наконец нашел способ решения этой проблемы, этим вы можете напечатать всех турецких персонажей.

String htmlText = html.ToString ();

    Document document = new Document();

    string filePath = HostingEnvironment.MapPath("~/Content/Pdf/");
    PdfWriter.GetInstance(document, new FileStream(filePath + "\\pdf-"+Name+".pdf", FileMode.Create));
    document.Open();

    iTextSharp.text.html.simpleparser.HTMLWorker hw = new iTextSharp.text.html.simpleparser.HTMLWorker(document);
    FontFactory.Register(Path.Combine(_webHelper.MapPath("~/App_Data/Pdf/arial.ttf")),  "Garamond");   // just give a path of arial.ttf 
    StyleSheet css = new StyleSheet();
    css.LoadTagStyle("body", "face", "Garamond");
    css.LoadTagStyle("body", "encoding", "Identity-H");
    css.LoadTagStyle("body", "size", "12pt");

    hw.SetStyleSheet(css);

     hw.Parse(new StringReader(htmlText));
0 голосов
/ 13 декабря 2012

Не меняйте исходный код iTextSharp. Определите новый стиль:

        var styles = new StyleSheet();
        styles.LoadTagStyle(HtmlTags.BODY, HtmlTags.FONTFAMILY, "tahoma");
        styles.LoadTagStyle(HtmlTags.BODY, HtmlTags.ENCODING, "Identity-H");

и затем передайте его методу HTMLWorker.ParseToList.

...