Как проверить встроенный шрифт в PDF с помощью iText - PullRequest
1 голос
/ 16 мая 2019

Я хотел бы проверить встроенные шрифты в PDF, используя Itext / Itextsharp

Я использовал 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 голосов
/ 17 мая 2019

Как поясняется в комментарии, ОП хочет знать , как проверить, встроен ли шрифт .

Пожалуйста, ознакомьтесь с разделом Программы для встроенных шрифтов в спецификациях PDF, например. в разделе 9.9 в старом ISO 32000-1:

Таблица 126 суммирует способы, в которых программы шрифтов должны быть встроены в файл PDF, в зависимости от представления программы шрифтов. Ключ должен быть именем, используемым в дескрипторе шрифта для ссылки на поток файла шрифта; подтип должен быть значением ключа Subtype , если он есть, в словаре потока файлов шрифтов. Более подробная информация о конкретных представлениях программы шрифтов приведена ниже.

Таблица 126 - Организация встроенных шрифтов для различных типов шрифтов

Ключ - Подтип - Описание

FontFile - - - Программа шрифта Type 1 в оригинальном (некомпактном) формате, описанном в Формат шрифта Adobe Type 1 . Эта запись может появиться в дескрипторе шрифта для словаря шрифтов Type1 или MMType1 .

FontFile2 - - - (PDF 1.1) Программа шрифтов TrueType, как описано в Справочном руководстве TrueType . Эта запись может появиться в дескрипторе шрифта для словаря шрифтов TrueType или (PDF 1.3) для словаря CIDFontType2CIDFont .

FontFile3 - Type1C - (PDF 1.2) Программа, эквивалентная шрифту типа 1, представленная в формате Compact Font Format (CFF), как описано в Технической ноте Adobe № 5176, Спецификация формата компактного шрифта . Эта запись может появиться в дескрипторе шрифта для словаря шрифтов Type1 или MMType1 .

FontFile3 - CIDFontType0C - (PDF 1.3) Программа CIDFont типа 0 представлена ​​в формате Compact Font Format (CFF), как описано в Технической ноте Adobe № 5176, Спецификация формата компактного шрифта . Эта запись может появиться в дескрипторе шрифта для словаря CIDFontType0 CIDFont.

FontFile3 - OpenType - (PDF 1.6) Программа шрифтов OpenType®, как описано в Спецификация OpenType v.1.4 (см. Библиографию). OpenType является расширением TrueType, которое позволяет включать программы шрифтов, которые используют компактный формат шрифта (CFF). ...

Таким образом, вы должны искать эти ключи в словаре FontDescriptor соответствующего шрифта, т. Е. По сути то, что вы сделали в своем коде с desc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...