我正在处理一些在resources.GetAsDict(PdfName.FONT)方法上返回null的PDF文件。我能够在使用相同组合工具创建的另一组PDF文件上使用相同的代码。
private static void ExtractFontNamesInPdf(string sourceFileName)
{
using (Stream pdfStream = new FileStream(sourceFileName, FileMode.Open))
{
var pdfReader = new PdfReader(pdfStream);
var set = new List<BaseFont>();
for (var index = 1; index <= pdfReader.NumberOfPages; index++)
{
var resources = pdfReader.GetPageN(index).GetAsDict(PdfName.RESOURCES);
ProcessResource(set, resources);
}
foreach (var item in set)
Console.WriteLine(item.PostscriptFontName + " " + item.FontType.ToString(CultureInfo.InvariantCulture));
Console.WriteLine("{0} Fonts found!", set.Count());
}
}
private static void ProcessResource(ICollection<BaseFont> set, PdfDictionary resources)
{
if (resources == null)
return;
var xObjects = resources.GetAsDict(PdfName.XOBJECT);
if (xObjects != null)
{
foreach (PdfName key in xObjects.Keys)
{
ProcessResource(set, xObjects.GetAsDict(key));
}
}
var fonts = resources.GetAsDict(PdfName.FONT);
if (fonts == null) return;
foreach (PdfName key in fonts.Keys)
{
var iRef = (PRIndirectReference)fonts.Get(key);
if (iRef != null)
set.Add(BaseFont.CreateFont(iRef));
}
}
我可以在Adobe Acrobat Pro中看到四种字体的列表。虽然它们是嵌入式和子集的。这些文件是可见的,将打印高速打印机。