如何使用iText7确定Type 3 PDF字体的实际字体名称?

问题描述 投票:0回答:1

我正在尝试使用iText7读取PDF中使用的所有字体。为此,我创建了一个IEventListener,它从TextRenderInfo中读取字体为:

private class FontReader : IEventListener
{
    public ICollection<string> Fonts { get; }

    public FontReader()
    {
        Fonts = new List<string>();
    }

    public void EventOccurred(IEventData data, EventType type)
    {
        if (!(data is TextRenderInfo)) return;

        var font = ((TextRenderInfo) data).GetFont();
        var fontName = font.GetFontProgram().GetFontNames().GetFontName();
        if (!string.IsNullOrEmpty(fontName) && !Fonts.Contains(fontName))
        {
            Fonts.Add(fontName);
        }
    }

    public ICollection<EventType> GetSupportedEvents()
    {
        return new HashSet<EventType> {EventType.RENDER_TEXT};
    }
}

这似乎工作正常,可以读取所有Type 1字体。但是,调用Type 3字体的GetFontProgram().GetFontNames().GetFontName();会返回null。

尽管在Acrobat Reader中查看字体确实显示了Type 3字体的名称(请参见屏幕截图)。如何在C#中通过iText7查找此名称?

Type 3 font name in Acrobat Reader

c# pdf fonts itext itext7
1个回答
0
投票

您可以访问相应的PDF对象,并使用var fontName = font.GetPdfObject().GetAsName(PdfName.Name)指令从中获取字体名称。

完整代码示例:

private class FontReader : IEventListener
{
    public ICollection<string> Fonts { get; }

    public FontReader()
    {
        Fonts = new List<string>();
    }

    public void EventOccurred(IEventData data, EventType type)
    {
        if (!(data is TextRenderInfo)) return;

        var font = ((TextRenderInfo) data).GetFont();
        var fontName = font.GetPdfObject().GetAsName(PdfName.Name)
    }

    public ICollection<EventType> GetSupportedEvents()
    {
        return new HashSet<EventType> {EventType.RENDER_TEXT};
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.