如何使用iText检查PDF中的嵌入式字体

时间:2019-05-16 17:14:36

标签: c# pdf itext

我想使用Itext / Itextsharp检查PDF中的嵌入式字体

我已经使用Itexthsarp从PDF获取字体,下面的代码获取了PDF的字体集             bool embeededFont = false;

       iTextSharpLGPV.PdfReader reader = new iTextSharpLGPV.PdfReader(fileName);
        HashSet<String> names = new HashSet<string>();
        iTextSharpLGPV.PdfDictionary resources;
        for (int p = 1; p <= reader.NumberOfPages; p++)
        {
            iTextSharpLGPV.PdfDictionary dic = reader.GetPageN(p);
            resources = dic.GetAsDict(iTextSharpLGPV.PdfName.Resources);
            if (resources != null)
            {
                //gets fonts dictionary
                iTextSharpLGPV.PdfDictionary fonts = resources.GetAsDict(iTextSharpLGPV.PdfName.Font);
                if (fonts != null)
                {

                    iTextSharpLGPV.PdfDictionary font;

                    foreach (iTextSharpLGPV.PdfName key in fonts.Keys)
                    {
                        font = fonts.GetAsDict(key);
                        string name = font.GetAsName(iTextSharpLGPV.PdfName.Basefont).ToString();

                        //check for prefix subsetted font

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

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

                        names.Add(name);
                    }
                }
            }
        }

1 个答案:

答案 0 :(得分:0)

正如评论中所阐明的,OP希望了解如何检查字体是否嵌入

请查看PDF规范中的嵌入式字体程序部分,例如在旧版ISO 32000-1中的9.9节中:

  

表126总结了取决于字体程序表示形式的将字体程序嵌入PDF文件的方式。密钥应是字体描述符中用于引用字体文件流的名称;子类型应为字体文件流字典中 Subtype 键的值(如果存在)。特定字体程序表示的更多详细信息在下面给出。

     

表126 –各种字体类型的嵌入式字体组织

     

键-   子类型-   说明

     

字体文件-   -   类型1字体程序,格式为 Adob​​e类型1字体格式中所述的原始(非紧凑型)格式。此项可能出现在 Type1 MMType1 字体字典的字体描述符中。

     

FontFile2 -   -   (PDF 1.1)TrueType字体程序,如 TrueType参考手册中所述。此项可能出现在 TrueType 字体字典的字体描述符中,或者(PDF 1.3)出现在 CIDFontType2CIDFont 字典的字体描述符中。

     

FontFile3 -    Type1C -   (PDF 1.2)Type 1 –等效于紧凑字体格式(CFF)的字体程序,如Adobe技术注释#5176,紧凑字体格式规范中所述。此项可能出现在 Type1 MMType1 字体字典的字体描述符中。

     

FontFile3 -    CIDFontType0C -   (PDF 1.3)0型CIDFont程序,以紧凑字体格式(CFF)表示,如Adobe技术注释#5176,紧凑字体格式规范中所述。此项可能出现在 CIDFontType0 CIDFont词典的字体描述符中。

     

FontFile3 -    OpenType -   (PDF 1.6)OpenType®字体程序,如 OpenType Specification v.1.4 中所述(请参见参考书目)。 OpenType是TrueType的扩展,它允许包含使用紧凑字体格式(CFF)的字体程序。 ...

因此,您应该在相应字体的 FontDescriptor 词典中查找这些键,即从本质上讲,您在代码中使用desc所做的操作。