【问题标题】:Cannot parse hebrew HTML file to pdf with itextsharp无法使用 itextsharp 将希伯来语 HTML 文件解析为 pdf
【发布时间】:2019-07-25 19:11:50
【问题描述】:

我正在尝试使用 iTEXTsharp 和 xmlworker 5.5.13 在 MVC 应用程序中解析包含希伯来语到 pdf 的 HTML 字符串。我无法让希伯来语出现在页面上。我试图模仿这个post,但我所做的似乎无济于事。我已将 HTML 简化为以下内容:

<!DOCTYPE html>
   <html dir="rtl">
   <head>
    <meta charset="utf-8" /> 
   </head>
   <body>
   <div dir="rtl" style="font-family: David"></div>
    <div class="container body-content">
     <div> שלום עולם  </div>
    <div>hello world</div>
    </div>   
   </body>
   </html>
pdf 文件中只显示“hello world”。这是我的pdf代码。下面是我生成pdf的代码。我尝试过不同的字体,包括 Arial、NotoSansHebrew,但结果是一样的。删除cssfile也不能解决问题。
公共 MemoryStream 合并pdfs(字符串 myserverpath, ControllerContext mycc,字符串 Viewname,对象模型) { 文档 mydoc = new Document(); MemoryStream mystream = new System.IO.MemoryStream();
       PdfWriter writer = PdfWriter.GetInstance(mydoc, mystream);
        writer.CloseStream = false;
        mydoc.Open();
        PdfReader reader;
        PdfContentByte cb = writer.DirectContent;
        PdfImportedPage Pdfim;
        string myxhtml;
        myxhtml = (function that generates HTML shown above);
        this.createpagefromxhtml(mydoc, writer, myxhtml, true);

        mydoc.Close();

        return mystream;
    }
    public bool createpagefromxhtml(Document mydoc, PdfWriter mywriter, string myxhtml, bool isnewpage)
    {
        StringReader sr = new System.IO.StringReader(myxhtml);
        try
        {
            using (mydoc)
            {
                if (isnewpage)
                { mydoc.NewPage();}

                FontFactory.RegisterDirectories();

                // Set factories
                ICSSResolver cssResolver = new StyleAttrCSSResolver();
                XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
                fontProvider.Register("C:\\Windows\\Fonts\\David.ttf");
                CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);

                var htmlContext = new HtmlPipelineContext(null);
                htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());

                // Set css
               cssResolver.AddCssFile(HttpContext.Current.Server.MapPath("~/Content/Site.css"), true);
                cssResolver.AddCssFile(HttpContext.Current.Server.MapPath("~/Content/bootstrap.min.css"), true);
                cssResolver.AddCssFile(HttpContext.Current.Server.MapPath("~/Content/bootstrap-rtl.min.css"), true);

                // Export
                IPipeline pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext, new PdfWriterPipeline(mydoc, mywriter)));
                var worker = new XMLWorker(pipeline, true);
                var xmlParse = new XMLParser(true, worker);
                xmlParse.Parse(sr);
                xmlParse.Flush();
                return true;
            }
        }
        catch (Exception ex)
        {  return false;}
    }

(流被保存到数据库并作为文件打开,尽管我尝试保存到磁盘并得到相同的结果。)

【问题讨论】:

  • 您的 ttf 文件是否类似于:“resources/fonts/NotoSansHebrew-Regular.ttf” 从这里尝试 TTF:github.com/jenskutilek/free-fonts/tree/master/Open/…
  • 如果我使用“resources/fonts/....ttf”我会得到一个错误。我必须使用 windows 字体目录。我尝试了 NotoSansHebrew,它给出了相同的结果。

标签: c# pdf itext hebrew xmlworker


【解决方案1】:

我终于让它工作了。我不得不将我的 html 包装在一个 div 中

&lt;div dir="rtl" style="font-family:  David"&gt; .... text... &lt;/div&gt;
我想关键是将页面的字体系列定义为与 fontfamily.register 方法中的字体相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-25
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 2016-03-11
    • 1970-01-01
    • 2011-09-02
    相关资源
    最近更新 更多