简体   繁体   English

ITextSharp一起使用多种字体样式。 即粗体,带下划线,斜体等

[英]ITextSharp using multiple font styles together. ie Bold, Underlined, italic… etc

I am attempting to use Itextsharp.dll (not sure which version) to write a dynamic PDF. 我正在尝试使用Itextsharp.dll (不确定哪个版本)来编写动态PDF。 Everything was going great until I needed to write a phrase with that is bold and underlined. 一切都进行得很好,直到我需要用粗体和下划线写一个短语。 However it appears that itextSharp's font class does not allow for this. 但是,itextSharp的字体类似乎不允许这样做。 It allows for bold/italic, but not bold/underline, italic/ underline, or all three. 它允许使用粗体/斜体,但不允许使用粗体/下划线,斜体/下划线或全部三个。 You cannot combine underlined with any other style. 下划线不能与任何其他样式结合使用。 It seems rather silly to not allow for a font to be both underlined and something else. 不允许同时给字体加下划线和其他东西似乎很愚蠢。 I have looked everywhere and see nothing that mentions it. 我到处都看过,什么也看不到。 Does anyone know a way around this or am I missing something obvious here? 有谁知道解决这个问题的方法,还是我在这里遗漏了一些明显的东西?

I would generally build my Font like so. 我通常会像这样构建我的字体。

iTextSharp.text.Font myFont = new Font(iTextSharp.text.Font.FontFamily.TIMES_ROMAN, 9, iTextSharp.text.Font.BOLDITALIC, BaseColor.BLACK);

You can see the 3rd parameter is an integer signifying the FontStyle for the font, however there are no enums available to make something underlined AND bold ,underlined AND italic, or all three. 您可以看到第3个参数是一个整数,表示字体的FontStyle ,但是没有可用的枚举来使带下划线的字体和粗体,带下划线的字体和斜体或这三个字体都可以。 There has to be a way to do this. 必须有一种方法可以做到这一点。 I find it hard to believe that ITextSharp would not account for underlined and bold text. 我很难相信ITextSharp不会考虑带下划线和粗体的文本。 Any ideas? 有任何想法吗?

If you look at the definition for BOLDITALIC you'll see: 如果查看BOLDITALIC的定义,则会看到:

public const int BOLDITALIC    = BOLD | ITALIC;

This shows you how to combine these styles using a bitwise | 这显示了如何使用按位|组合这些样式| ( or ) operator. or )运算符。 You are of course free to redefine these however you want but you'll usually see them used like this: 当然,您可以随意重新定义它们,但是通常会看到它们像这样使用:

var myFont = new Font(iTextSharp.text.Font.FontFamily.TIMES_ROMAN, 9, Font.BOLD | Font.UNDERLINE, BaseColor.BLACK);

EDIT 编辑

Looking at the source, BOLD is 1 and UNDERLINE is 4 and when you | 从源头看, BOLD1UNDERLINE4 ,当您| them together you get 5 which is the same value that you posted. 他们一起得到5 ,这与您发布的值相同。 You can test every single combination of all 5 styles using the code below. 您可以使用以下代码测试所有5种样式的每种组合。

//Create a test file on our desktop
var testFile = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test.pdf");

//Possible styles
var styles = new Dictionary<string, int>() {
    { "NORMAL" , iTextSharp.text.Font.NORMAL },
    { "BOLD" , iTextSharp.text.Font.BOLD },
    { "ITALIC" , iTextSharp.text.Font.ITALIC },
    { "UNDERLINE" , iTextSharp.text.Font.UNDERLINE },
    { "STRIKETHRU",  iTextSharp.text.Font.STRIKETHRU }
};

//Standard iText bootstrap
using (var fs = new FileStream(testFile, FileMode.Create, FileAccess.Write, FileShare.None)) {
    using(var doc = new Document()) {
        using (var writer = PdfWriter.GetInstance(doc, fs)) {
            doc.Open();

            //We're going to try every possible unique combination of constants, store the
            //previously used ones in this dictionary
            var used = new Dictionary<int, string>();

            //Fixed-number combination hack, just create 5 nested loops.
            foreach (var a in styles) {
                foreach (var b in styles) {
                    foreach (var c in styles) {
                        foreach (var d in styles) {
                            foreach (var g in styles) {

                                //Bitwise OR the values together
                                var k = a.Value | b.Value | c.Value | d.Value | g.Value;

                                //If we didn't previously use this OR'd value
                                if (!used.ContainsKey(k)) {

                                    //Get all of the unique names exclude duplicates
                                    var names = new string[] { a.Key, b.Key, c.Key, d.Key, g.Key }.Distinct().OrderBy(s => s).ToList();

                                    //NORMAL is the "default" and although NORMAL | BOLD is totally valid it just
                                    //messes with your brain when you see it. So remove NORMAL from the description
                                    //when it is used with anything else. This part is optional
                                    if (names.Count() > 1 && names.Contains("NORMAL")) {
                                        names = names.Where(n => n != "NORMAL").ToList();
                                    }

                                    //Merge our names into a comma-separated string
                                    var v = String.Join(", ", names);

                                    //Store it so we don't use it again
                                    used.Add(k, v);

                                    //Create a font using this loop's value
                                    var myFont = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.TIMES_ROMAN, 12, k, BaseColor.BLACK);

                                    //Add it to our document
                                    doc.Add(new Paragraph(k.ToString() + "=" + v, myFont));
                                }
                            }
                        }
                    }
                }
            }

            doc.Close();
        }
    }
}

This code produces this text: 此代码产生以下文本:

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM