gpt4 book ai didi

c# - 如何从PDF中获取文本的字体名称?

转载 作者:太空宇宙 更新时间:2023-11-03 21:10:49 25 4
gpt4 key购买 nike

我希望提取 PDF 文件中文本的所有不同字体名称。我正在使用 iTextSharp DLL,下面给出了我的代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using iTextSharp.text.pdf.parser;
using iTextSharp.text.pdf;

namespace GetFontName
{
class Program
{
static void Main(string[] args)
{
PdfReader reader = new PdfReader("C:/Users/agnihotri/Downloads/Test.pdf");
HashSet<String> names = new HashSet<string>();
PdfDictionary resources;
for (int p = 1; p <= reader.NumberOfPages; p++)
{
PdfDictionary dic = reader.GetPageN(p);
resources = dic.GetAsDict(PdfName.RESOURCES);
if (resources != null)
{
//gets fonts dictionary
PdfDictionary fonts = resources.GetAsDict(PdfName.FONT);
if (fonts != null)
{

PdfDictionary font;

foreach (PdfName key in fonts.Keys)
{
font = fonts.GetAsDict(key);
string name = font.GetAsName(iTextSharp.text.pdf.PdfName.BASEFONT).ToString();

//check for prefix subsetted font

if (name.Length > 8 && name.ToCharArray()[7] == '+')
{
name = String.Format("%s subset (%s)", name.Substring(8), name.Substring(1, 7));

}
else
{
//get type of fully embedded fonts
name = name.Substring(1);
PdfDictionary desc = font.GetAsDict(PdfName.FONTDESCRIPTOR);
if (desc == null)
name += "no font descriptor";
else if (desc.Get(PdfName.FONTFILE) != null)
name += "(Type1) embedded";
else if (desc.Get(PdfName.FONTFILE2) != null)
name += "(TrueType) embedded ";
else if (desc.Get(PdfName.FONTFILE3) != null)
name += name;//("+font.GetASName(PdfName.SUBTYPE).ToString().SubSTring(1)+")embedded';
}

names.Add(name);
}
}
}
}
var collections = from name in names
select name;
foreach (string fname in collections)
{
Console.WriteLine(fname);
}
Console.Read();

}
}
}

对于作为输入的每个 pdf 文件,我得到的输出是“Glyphless Font”no font descriptor”。输入文件的链接如下:

https://drive.google.com/open?id=0B6tD8gqVZtLiM3NYMmVVVllNcWc

最佳答案

我已经在 Adob​​e Acrobat 中打开了您的 PDF,并查看了字体面板。这是我看到的:

enter image description here

您有一个嵌入的 LiberationMono 子集,这意味着字体的名称将作为 ABCDEF+LiberationMono 存储在文件中(其中 ABCDEF 是一系列 6 个随机但唯一的字符),因为字体是子集。参见 What are the extra characters in the font name of my PDF?

现在让我们看一下在 iText RUPS 中打开的同一个文件:

enter image description here

我们找到/Font对象,它有一个/FontDescriptor。在 /FontDescriptor 中,我们找到格式为我们预期的 /FontName:BAAAAA+LiberationMono

现在您知道在哪里可以找到该名称,您可以调整您的代码。

关于c# - 如何从PDF中获取文本的字体名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37814245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com