【问题标题】:ITextSharp v5.5.13.0 XMLWorker Turkish character problemITextSharp v5.5.13.0 XMLWorker 土耳其语字符问题
【发布时间】:2018-09-12 12:57:41
【问题描述】:

我使用了 iTextSharp,所有土耳其语字符都消失了。 html inline css 属性也适用于 table 元素,但不适用于 div 元素。

我尝试了很多编码转换示例代码,但没有找到任何结果。

我的示例代码:

public static byte[] HtmlToPdfItextSharp(string HTMLCONTENTSTRING, List<string> cssFiles = null)
{
    using (var ms = new MemoryStream())
    {
        Document pdfDoc = new Document(PageSize.A4.Rotate(), 10, 10, 10, 10);

        BaseFont STF_Helvetica_Turkish = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, "CP1254", BaseFont.NOT_EMBEDDED);
        Font fontNormal = new Font(STF_Helvetica_Turkish, 12, Font.NORMAL, BaseColor.BLACK);


        string fontPath = Path.Combine(Path.Combine(Server.MapPath("~/App_Data/Pdf/arial.ttf")));
        XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
        fontProvider.UseUnicode = true;
        fontProvider.Register(fontPath);
        CssAppliers ca = new CssAppliersImpl(fontProvider);

        var pdfWriter = PdfWriter.GetInstance(pdfDoc, ms);

        pdfDoc.Open();
        pdfWriter.DirectContent.SetFontAndSize(STF_Helvetica_Turkish, 12);
        pdfWriter.CloseStream = false;

        var htmlContext = new HtmlPipelineContext(null);

        htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());

        ICSSResolver cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(false);
        cssFiles.ForEach(e => cssResolver.AddCssFile(e, true));

        var pp = new PdfWriterPipeline(pdfDoc, pdfWriter);
        IPipeline pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext, pp));

        XMLWorker worker = new XMLWorker(pipeline, true);
        XMLParser parser = new XMLParser(worker);


        parser.Parse(new MemoryStream(Encoding.UTF8.GetBytes(HTMLCONTENTSTRING)));

        pdfDoc.Close();

        return ms.GetBuffer();
    }
}

【问题讨论】:

  • 您正在混合各种不应该混合的东西:pdfWriter.DirectContent.SetFontAndSize(STF_Helvetica_Turkish, 12); 在 HTML 到 PDF 的上下文中没有意义。 (BaseFont.TIMES_ROMAN, "CP1254") 没有意义,因为 Times Roman 没有所有的土耳其字形等等。您正在使用仅支持付费客户的旧 iText 版本的 维护 版本。升级到 iText 7 + pdfHTML developers.itextpdf.com/content/…
  • 简而言之:在 iText 7 中 XMLWorker 已被 pdfHTML 取代。有关更多信息,请参阅introduction of the HTML to PDF tutorial。

标签: itext


【解决方案1】:

我更新了我的代码并添加了样式表文件(字体家族:arial;),我解决了字符 但是时间太长了 我的新更新功能如下:

public static byte[] HtmlToPdfItextSharp(string HTMLCONTENTSTRING, List<string> cssFiles = null)
{
    using (var ms= new MemoryStream())
    {
        Document pdfDoc = new Document(PageSize.A4.Rotate(), 10, 10, 7, 10);

        var pdfWriter = PdfWriter.GetInstance(pdfDoc, ms);
        pdfWriter.CloseStream = false;
        pdfDoc.Open();

        var htmlContext = new HtmlPipelineContext(null);

        htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());

        ICSSResolver cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(false);
        cssFiles.ForEach(e => cssResolver.AddCssFile(e, true));

        var pp = new PdfWriterPipeline(pdfDoc, pdfWriter);
        IPipeline pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext, pp));

        XMLWorker worker = new XMLWorker(pipeline, true);
        XMLParser parser = new XMLParser(worker);
        parser.Parse(new MemoryStream(Encoding.UTF8.GetBytes(pHtmlIcerik)));

        pdfDoc.Close();
        return ms.ToArray();
    }
}

CSS代码:

 body {
     font-family:Arial;
}
table{
    font-family:Arial;
}
td{
    font-family:Arial;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 2011-07-22
    • 2014-02-19
    • 1970-01-01
    相关资源
    最近更新 更多