如何使用itext更改模拟粗体字体的权重

时间:2014-05-14 20:28:28

标签: itext

我正在使用iText库生成文本。我正在加载Arial Unicode MS字体,它不包含粗体样式,因此iText正在模拟粗体。这样可以正常工作,但与使用Java API或甚至使用Microsoft Word生成的文本相比,粗体字体的重量显得过重。 我试图从FontDescriptor中获取权重,但返回的值始终为0.0

float weight = font.getBaseFont().getFontDescriptor(BaseFont.FONT_WEIGHT, fontSize);

有没有办法可以改变模拟粗体字体的重量?

2 个答案:

答案 0 :(得分:3)

作为@Chris回答的附录:你不需要构建那些Object[],因为有Chunk便利方法:

    BaseFont arialUnicodeMs = BaseFont.createFont("c:\\Windows\\Fonts\\ARIALUNI.TTF", BaseFont.WINANSI, BaseFont.EMBEDDED);
    Font arial12 = new Font(arialUnicodeMs, 12);

    Paragraph p = new Paragraph();
    for (int i = 1; i < 100; i++)
    {
        Chunk chunk = new Chunk(String.valueOf(i) + " ", arial12);
        chunk.setTextRenderMode(PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE, i/100f, null);
        p.add(chunk);
    }
    document.add(p);

结果

Output of the code above

答案 1 :(得分:0)

修改

很抱歉,我在发布此消息后意识到您正在使用iText但我的答案是针对iTextSharp。但是,您应该能够使用下面的大部分代码。我已更新源代码链接以引用相应的Java源代码。

粗体模拟(人造粗体)是通过用笔划绘制文本来完成的。当要求iText使用非粗体字体绘制粗体文本时,默认情况下应用宽度为字体大小的笔划除以30.您可以在当前source code here中看到这一点。神奇的部分是将块的文本渲染模式设置为您选择的笔划:

//.Net code
myChunk.Attributes[Chunk.TEXTRENDERMODE] = new Object[] { PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE, MAGIC_NUMBER_HERE, null };

//Java code
myChunk.attributes.put(Chunk.TEXTRENDERMODE, new Object[]{Integer.valueOf(PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE), MAGIC_NUMBER_HERE, null});

知道你可以使用相同的逻辑,但使用你的体重偏好。下面的样本创建了四个块,第一个正常,第二个人造粗体,第三个超重型人造粗体和第四个超轻型人造粗体。

//.Net code below but should be fairly easy to convert to Java
//Path to our PDF
var testFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test.pdf");

//Path to our font
var ff = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "ARIALUNI.TTF");

//Normal document 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)) {
            doc.Open();

            //Register our font
            FontFactory.Register(ff, "Arial Unicode MS");

            //Declare a size to use throughout the demo
            var size = 20;

            //Get a normal and a faux-bold version of the font
            var f = FontFactory.GetFont("Arial Unicode MS", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, size, iTextSharp.text.Font.NORMAL);
            var fb = FontFactory.GetFont("Arial Unicode MS", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, size, iTextSharp.text.Font.BOLD);

            //Create a normal chunk
            var cNormal = new Chunk("Hello ", f);

            //Create a faux-bold chunk
            var cFauxBold = new Chunk("Hello ", fb);

            //Create an ultra heavy faux-bold
            var cHeavy = new Chunk("Hello ", f);
            cHeavy.Attributes = new Dictionary<string, object>();
            cHeavy.Attributes[Chunk.TEXTRENDERMODE] = new Object[] { PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE, size / 10f, null };

            //Create a lite faux-bold
            var cLite = new Chunk("Hello ", f);
            cLite.Attributes = new Dictionary<string, object>();
            cLite.Attributes[Chunk.TEXTRENDERMODE] = new Object[] { PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE, size / 50f, null };

            //Add to document
            var p = new Paragraph();
            p.Add(cNormal);
            p.Add(cFauxBold);
            p.Add(cHeavy);
            p.Add(cLite);

            doc.Add(p);

            doc.Close();
        }
    }
}