从现有PDF获取字体时,iTextsharp返回null

时间:2014-06-30 18:57:11

标签: itextsharp

我正在处理一些在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中看到四种字体的列表。虽然它们是嵌入式和子集的。这些文件是可见的,将打印高速打印机。

0 个答案:

没有答案