【问题标题】:How can I extract the Fonts used in a PDF file via PDFSharp?如何通过 PDFSharp 提取 PDF 文件中使用的字体?
【发布时间】:2020-03-25 14:40:15
【问题描述】:

我正在尝试通过 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");
}

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

有没有办法提取所用字体列表,就像我在 Adob​​e Acrobat Reader 中看到的一样?

【问题讨论】:

    标签: c# fonts pdfsharp


    【解决方案1】:

    没有直接的 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);
                    }
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 2018-08-25
      • 2016-01-29
      • 2011-03-30
      • 1970-01-01
      相关资源
      最近更新 更多