如何通过 PDFSharp 提取 PDF 文件中使用的字体?

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

我正在尝试通过 PDFSharp (http://www.pdfsharp.net/) 提取 PDF 文档中使用的字体。

不幸的是,我无法这样做,因为我不断得到奇怪的结果,而且我不知道如何解释它们。在程序集中我见过像

PdfFontTable
等类,但它们都是内部的。再次反编译
PdfResources
类时,与字体相关的所有内容都是内部的。

我尝试访问资源以获取字体:

var reader = Reader.Open(stream, PdfDocumentOpenMode.InformationOnly);
foreach (var page in reader.Pages)
{
    var resources = page.Resources;
    var fonts = resources.Elements.GetValue("/Font");
}

但这给了我一个难以理解的回应:

有没有办法提取所使用的字体列表,就像我在 Adobe Acrobat Reader 中看到的那样?

c# fonts pdfsharp
2个回答
0
投票

没有直接的 API 方式来查询字体。但可以查询内部文档数据结构。以下代码有效并返回带有字体的列表。

List<string> fonts = new List<string>();
PdfDocument pdfDoc = PdfReader.Open("YourFileName.pdf");
foreach (PdfObject obj in pdfDoc.Internals.GetAllObjects())
{
    if ("dictionary" == obj.Internals.TypeID)
    {
        for (int i = 0; i < ((PdfDictionary)obj).Elements.Count; ++i)
        {
            if (((PdfDictionary)obj).Elements.ContainsKey("/BaseFont"))
            {
                PdfItem item = ((PdfDictionary)obj).Elements.GetValue("/BaseFont");
                string fontname = item.ToString();
                int idx = fontname.IndexOf('+');
                if (idx > 0)
                {
                    fontname = fontname.Substring(idx + 1).Trim();
                    if (!fonts.Contains(fontname))
                        fonts.Add(fontname);
                }
            }
        }
    }
}

0
投票

最终我通过注册

IEventListener
并处理
TextRenderInfo
让它正常工作。

public class FontReader : IEventListener 
{
    private ICollection<FontData> _fonts;

    /// <summary>
    ///     Gets all fonts used in a PdfDocument.
    /// </summary>
    public ICollection<FontData> GetFonts(PdfDocument document)
    {
        _fonts = new List<FontData>();
        var processor = new PdfCanvasProcessor(this);
        for (var i = 1; i <= document.GetNumberOfPages(); i++)
        {
            var page = document.GetPage(i);
            processor.ProcessPageContent(page);
        }

        return _fonts;
    }

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

       var font = ((TextRenderInfo)data).GetFont();
       var name = font.GetFontProgram().GetFontNames().GetFontName();
       var type = font.GetPdfObject().GetAsName(PdfName.Subtype).GetValue();
       ...
       _fonts.Add(...);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.