【问题标题】:Applying style to div having a class name iTextSharp将样式应用于具有类名 iTextSharp 的 div
【发布时间】:2014-02-02 02:37:09
【问题描述】:

我已将我的 html 字符串定义为:

            string html = @"
                <html><body>    
                    <div class='class1'>My Text</div>    
                    </body></html>   
                    ";

为了应用样式,我正在这样做

StyleSheet style = new StyleSheet();

            style.LoadTagStyle("class1", HtmlTags.FACE , "PATH" + "CustomFont.ttf");

这不起作用。但是,使用它会应用字体:

       style.LoadTagStyle(HtmlTags.DIV, HtmlTags.FACE , "PATH"+"CustomFont.ttf");

如何为特定类指定样式?我正在使用 iTextSharp dll 生成 pdf。

【问题讨论】:

  • 您使用的是哪个版本的 iTextSharp?另外,HTMLWorker 已经被弃用了很长时间,取而代之的是 XMLWorker,您是否尝试过?
  • 我使用的是 5.4 版
  • 我切换到 XMLWorker。但同样的问题,无法让自定义字体工作。任何帮助,急需!

标签: itextsharp


【解决方案1】:

您需要创建一个实现IFontProvider 实例的类的实例。 XMLWorker 附带一个已经实现该功能的类,因此您只需使用 XMLWorkerFontProvider 类并通过它注册您的字体。 Register() 方法的第二个参数是可选的,但我建议您使用它来显式地为您的字体指定一个别名。

一旦你有了它,你就可以使用ParseXHtml() 的长格式,它接受HTML 和CSS 的流。如果你从磁盘加载这两个中的任何一个,你应该检查编码。

以下代码是针对 iTextSharp 和 XMLWorker 5.2.4 测试的完整工作示例。有关详细信息,请参阅 cmets。

//File to output
var testFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test.pdf");

//Standard PDF setup, nothing special here
using (var fs = new FileStream(testFile, FileMode.Create, FileAccess.Write, FileShare.None)) {
    using (var doc = new Document()) {
        using (var writer = PdfWriter.GetInstance(doc, fs)) {

            //Open our document for writing
            doc.Open();

            //Our basic HTML
            var html = @"<html><body><div class=""class1"">My Text</div></body></html>";

            //Fully qualified path to our font
            var myFont = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "ALGER.TTF");

            //Register our font and give it an alias to reference in CSS
            var fontProv = new XMLWorkerFontProvider();
            fontProv.Register(myFont, "AlgerianRegular");

            //Create our CSS
            var css = @".class1{font-family: AlgerianRegular; color: #f00; font-size: 60pt;}";

            //Create a stream to read our HTML
            using (var htmlMS = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(html))) {
                //Create a stream to read our CSS
                using (var cssMS = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(css))) {
                    //Get an instance of the generic XMLWorker
                    var xmlWorker = XMLWorkerHelper.GetInstance();

                    //Parse our HTML using everything setup above
                    xmlWorker.ParseXHtml(writer, doc, htmlMS, cssMS, System.Text.Encoding.UTF8, fontProv);
                }
            }

            //Close and cleanup
            doc.Close();
        }
    }
}

【讨论】:

  • 供将来参考:并不是字体系列名称周围没有单引号。我添加它们,xmlworker 将无法工作。
  • 我刚刚针对 5.5.2 版本尝试了上面的代码,在 AlgerianRegular 周围加引号和不加引号,并且都产生了正确的输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
  • 2013-08-10
  • 2017-10-30
  • 1970-01-01
  • 2014-05-01
  • 2013-03-31
相关资源
最近更新 更多