将样式应用于具有类名iTextSharp的div

时间:2014-01-14 05:34:28

标签: itextsharp

我已将我的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。

1 个答案:

答案 0 :(得分:0)

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

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

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

//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();
        }
    }
}