首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ITextSharp使用多个字体样式在一起。下划线斜体字..。等

ITextSharp使用多个字体样式在一起。下划线斜体字..。等
EN

Stack Overflow用户
提问于 2016-07-25 17:00:35
回答 1查看 2K关注 0票数 2

我试图使用Itextsharp.dll (不确定哪个版本)来编写动态PDF。一切都很顺利,直到我需要用粗体和下划线写一个短语。但是,看起来itextSharp的字体类不允许这样做。它允许粗体/斜体,但不允许粗体/下划线,斜体/下划线,或所有这三者。不能将带下划线的样式与任何其他样式组合。不允许字体同时加下划线和其他内容似乎相当愚蠢。我到处都找过了,什么也没看到。有没有人知道解决这个问题的方法,或者我是不是遗漏了一些显而易见的东西?

我通常会像这样建造我的字体。

代码语言:javascript
运行
复制
iTextSharp.text.Font myFont = new Font(iTextSharp.text.Font.FontFamily.TIMES_ROMAN, 9, iTextSharp.text.Font.BOLDITALIC, BaseColor.BLACK);

您可以看到第三个参数是一个表示字体的FontStyle的整数,但是没有任何枚举可以使某些内容具有下划线和粗体、下划线和斜体,或者这三者都可用。一定有办法这样做的。我很难相信ITextSharp不会考虑下划线和粗体文本。有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-25 18:49:18

如果您查看BOLDITALIC的定义,您将看到:

代码语言:javascript
运行
复制
public const int BOLDITALIC    = BOLD | ITALIC;

这向您展示了如何使用位| (or)运算符组合这些样式。当然,您可以随意地重新定义这些内容,但是您通常会看到它们是这样使用的:

代码语言:javascript
运行
复制
var myFont = new Font(iTextSharp.text.Font.FontFamily.TIMES_ROMAN, 9, Font.BOLD | Font.UNDERLINE, BaseColor.BLACK);

编辑

从源代码来看,BOLD1UNDERLINE4,当您将它们组合在一起时,就会得到与您发布的值相同的5。您可以使用下面的代码测试所有5种样式的每个组合。

代码语言:javascript
运行
复制
//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();
        }
    }
}

此代码生成以下文本:

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38573590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档