Как извлечь шрифт из pdf файла

Обновлено: 04.07.2024

Я знаю, что обычно встроенные шрифты в файлах PDF являются только подмножествами шрифтов. Во всяком случае, есть ли способ сделать это?

3 ответа

Я бы использовал Font Forge, потому что это бесплатное, открытое и кросс-платформенное решение, которое может извлекать данные шрифта из файлов PDF.

Используйте файл> Откройте пункт меню.

FontForge также может читать (многие) шрифты из pdf-файла. FontForge обычно не перечисляет pdf-файлы (поскольку они не разработаны в качестве механизмов для транспортировки шрифтов, и большинство таких шрифтов будет неполным из-за подмножества и других оптимизаций), но вы всегда можете ввести имя напрямую (или использовать [Фильтр], чтобы определить фильтр для файлов PDF).

Здесь я продвигаю свой предыдущий комментарий к ответу, согласно предложению HackSlash.

Существует идентичный вопрос в Stackoverflow, который уже имеет превосходный и высокоподдерживаемый принятый answer .

Он проиллюстрировал несколько методов, которые я буду перечислять только кратко:

Кроме того, я хотел бы указать, что существует несколько бесплатный онлайн услуги , которые предлагают сделать именно это.

Комментарий: Я не собираюсь «выбирать лучший вариант», так как best часто субъективен и действительно зависит от конкретной ситуации. Проще всего было бы использовать онлайн-сервис, но это не было бы жизнеспособным вариантом, если бы материал оставался частным. FontForge выглядит очень хорошо, особенно для тех, кто уже может использовать его для создания или редактирования шрифтов. Если среда рабочего стола не доступна, то pdftops (и другие параметры командной строки) будут хорошим выбором для автоматизации.

Обратите внимание, что в зависимости от исходной программы и автора они, возможно, решили «преобразовать шрифты в контуры», и в этом случае фактические данные живого шрифта не встроены. Это часто было необходимо в дни выхода Postscript, и практика по-прежнему сохраняется в течение сегодняшнего дня, хотя это действительно не обязательно.

Вы читаете PDF-файл, и вам нравится тип шрифта. Он четкий, легко читаемый и красиво выглядит. Вы хотите узнать название шрифта, возможно, извлеките файл шрифта, чтобы вы могли использовать его в своей работе. Но как?

Файлы PDF поддерживают форматированный текст, который включает тексты и изображения. Контент может быть написан любым шрифтом и размером, и есть из нескольких вариантов на выбор. Выбор правильного типа шрифта может оказаться непосильной задачей.

Иногда, читая электронные книги, вы сталкиваетесь с шрифтом, который вам нравится, и вы, возможно, захотите использовать, но не знаете названия.

Это легко. Воспользуйтесь одним из инструментов ниже для извлечения шрифтов из PDF-файлов в Интернете. Без лишних слов, приступим.

1. ExtractPDF

Как вы можете видеть на скриншоте выше, он определил некоторые типы шрифтов, которые использовались в загруженном мной образце PDF. Он также покажет пример жирным шрифтом и курсивом, если он был использован в PDF.

Чтобы загрузить этот шрифт, щелкните имя шрифта и сохраните его локально на жестком диске. Размер файла ограничен 14 МБ.

Выше вы заметите больше вкладок для различных типов данных, которые он собрал, таких как изображения и метаданные, которые вы можете использовать.

2. AConvert

В то время как ExtractPDF может извлекать все данные, которые он может собрать из PDF, AConvert использует избирательный подход. Когда вы посещаете сайт, он попросит вас выбрать файл PDF и тип данных, которые вы хотите извлечь.

3. Конвертер

Вы можете загрузить zip-файл с файлами шрифтов в формате TTF, готовыми к использованию. Вы также можете загружать вложения вместе со шрифтами.

Обратите внимание, что когда вы загружаете вложения вместе со шрифтами, формат выходного файла будет CFF вместо TTF. Лучше выбирать только шрифты, если это действительно то, что вам нужно.

Хотя не упоминается, как долго файлы будут храниться на сервере, рядом с кнопкой загрузки есть кнопка удаления. Лимит размера файла не разглашается.

4. Преобразование PDF в онлайн

Во время моего теста на преобразование одного файла размером 500 КБ ушло более 5 минут, что показалось мне вечностью. Возможно, в то время у них были проблемы с сервером, поэтому я позволю им сомневаться. Никаких подробностей о размере файла не упоминалось.

5. FontForge

После тестирования нескольких онлайн-инструментов для извлечения шрифтов из файлов PDF я нашел бесплатное программное обеспечение для Windows. FontForge не является онлайн-решением, но полезно, если ваша работа связана со шрифтами.

Загрузите исполняемый файл Windows по ссылке ниже и установите пакет. Вам будет предложено указать свой адрес электронной почты, но подтверждать это не нужно. Итак, вы можете скачать, не получая информационных бюллетеней.

Запустите FontForge и используйте раскрывающееся меню (Фильтр), чтобы выбрать опцию Извлечь из PDF.

Выберите файл PDF на жестком диске. FontForge автоматически обнаружит и покажет список всех шрифтов, используемых в файле PDF.

Дважды щелкните любой шрифт, чтобы создать набор символов для этого конкретного шрифта, который затем можно сохранить на жесткий диск.

Выбор правильного шрифта

Когда вы не уверены, лучше взять то, что уже работает, и использовать это в своей работе. Экономит много времени и сил.

Итак, это были одни из лучших инструментов для извлечения шрифтов из файлов PDF в Интернете. Если вы хотите узнать, как преобразовать PDF-файл в формат Word, чтобы вы могли его редактировать, ознакомьтесь с публикацией ниже.

Сразу следует сказать, что лучшей информации по формату, чем много мегабайтный PDFReference с сайта Adobe не существует. Для тех, кто пишет на С++ есть готовое решение — XPDF. В линуксе это самая полнофункциональная замена продуктам Adobe. Русскоязычные материалы на эту тему поверхностны и служат лишь для ознакомления, а не для практической работы. Но я рассчитываю, что с ними, а лучше с PDFReference вы уже знакомы. Я решил описать конкретный упрощенный пример извлечения из файла PDF truetype шрифтов, потому что этот вопрос очень часто звучит в сети и остается без ответа. Мне известна только одна такая программа, которая работает с ошибками и без исходников. Напоминаю, что пользоваться извлеченными шрифтами не всегда законно, можно только выводить встроенным шрифтом текст из документа.

Кто интересовался вопросом, то знают, что PDF состоит из заголовка, таблицы перекрестных ссылок (XRef), тела и трайлера (прицепа). Все элементы кроме заголовка могут быть разбросаны частями и в нескольких экземплярах по всему документу. Для начала надо прочитать таблицу XRef. Рекомендую оформить её классом. Для поиска адреса таблицы читаем файл с конца, пока не встретим тег %%EOF. Продолжаем читать задом наперед до тега startxref. теперь можно считать число, которое следует за этим тегом.
Вот пример конца файла:

startxref
173
%%EOF
число 173 — это смещение от начала данных файла к началу первой таблицы XRef. Переместившись в эту точку, мы видим что-то вроде этого:
xref
7628 42
0000000016 00000 n
0000001195 00000 f
и тд.

На 7628 пока не будем обращать внимание (это имя первого объекта, где записана информация о количестве страниц, например, а так же много чего другого). А 42 — это количество записей в данной части таблицы. Далее совсем просто: считываем в 10 байтный буфер первое слово, пропускаем пробел и считываем 5 байтный буфер, читаем отдельный символ. И так 42 раза. Преобразованные к целым строки имеют следующее значение — смещение от начала данных к ссылочному объекту, номер генерации. Последний символ интерпретируется так: n — объект используется, f — объект не используется, но как я говорил, у таблицы XRef могут быть продолжения в потоке файла. Как их найти? после таблицы всегда следует тег trailer. Когда он встретится надо искать строку /Prev — если она есть, то следом идет смещение к следующей таблице.

Таким образом прочитываем все таблицы, если их больше одной. Закончить чтение можно, если в следующем трайлере будет отсутствовать ключ /Prev. Признаком последней таблицы может служить и то, что она начинается с записи 0000000000 65535 f. Надо сказать, что мы читаем таблицы задом наперед, последняя при чтении является первой, которая появилась при создании самого документа, а первая при чтении возникла после последнего редактирования.

Используя полученные данные мы можем перемещаться к любому ссылочному объекту документа. Правда есть еще прямые объекты, адреса которых не внесены в XRef, но об этом позже. Теперь мы можем перебирать объекты документа, проверяя их тип и делая с ними, что душе угодно. Объект начинается так:

7626 0 obj
содержимое объекта
endobj

7626 — номер (имя) объекта, а 0 — номер генерации, который должен совпадать с подобным значением в таблице ссылок для этого объекта. Как я понял, если объект меняется, редактируется, то и номер генерации увеличивается. Мы собрались искать шрифты, для этого надо прочитать словарь объекта, который представляет собой лексему, заключенную в теги <<… >>. Если элементы словаря имеют такую структуру, например:

где слово после слеша — ключ, а необязательное значение после пробела — значение. При парсинге надо помнить, что значение может содержать любые данные, любой вложенности, в том числе и другие словари. Так что рекурсию вам в руки, впрочем, можно и без рекурсии, если мы работаем над конкретной задачей извлечения шрифтов. Указанное значение может также включать вложенные или не вложенные элементы следующих типов:

(… ) -текстовые строки
<… > — hex-строки
[… ] — массивы

Строка значения продолжается до следующего слеша или до перевода строки. Чтобы идентифицировать объект шрифта надо найти в словаре комбинацию:

/Type /Font
Теперь фильтруем Truetype шрифты по содержанию в словаре последовательности:
/Subtype /TrueType

Остальные ключи игнорируем, потому что мы просто хотим извлечь шрифты. Но самого шрифта мы в этом объекте, скорее всего не найдем. Только набор ненужных нам ключей. Читаем один из них:

/FontDescriptor 1675 0 R

Если такой ключ отсутствует, то шрифт внешний и не встроен в документ. Далее номер генерации этого объекта, а символ R обозначает, что это ссылка. Таблицу XRef мы уже прочитали и теперь можем переместиться к данным шрифта, через поиск смещения для объекта с номером 1675. Правда, возможен такой вариант:

/FontDescriptor << словарь и (или) данные шрифта >>

Будем считать, что мы переместились по ссылке к прямому объекту. В его словаре должны быть такие ключи:

В этом объекте тоже много полезных сведений о шрифте, но самого шрифта опять нет. Не моя вина — все претензии к компании Adobe. Нам нужен такой ключ

/FontFile2 1676 0 R

Знакомая конструкция. Переходим к следующему объекту. Если мы все сделали правильно, то это потоковый объект. Он состоит из словаря потока и из бинарных данных, заключенных между тегами stream… endstream. Вот тут надо сказать, что наличие бинарных данных не дает использовать готовые текстовые парсеры. Перепробовал много и пришлось написать свой с нуля. Бинарные данные можно считывать разом, так как в словаре потока имеется ключ /Length с длиной потока. Если попробовать сохранить извлеченный поток в файл с расширением TTF, то система объявит, что это никакой не шрифт. Все правильно, надо его разжать.

Шрифт чаще сжат с помощью zip, но для верности можно это проверить по наличию ключа /FlateDecode. Если работаем в Delphi, то используем стандартный ZLib. Мы можем получить размер буфера для разжатых данных из словаря потока по ключу /Length1. Ну и нужно знать, что встроенный в документ шрифт содержит только те глифы, которые в документе используются.

Думаю, что после этих наметок можно брать в одну руку hex-вьвер, в другую — PDFReference и стоить собственный АкробатРидер.

Я знаю утилиту pdftk.exe , которая может указывать, какие шрифты используются PDF файлом, а также они встроены или нет.

Теперь проблема: если у меня есть файлы PDF со встроенными шрифтами - как я могу извлечь эти шрифты так, чтобы их можно было повторно использовать в качестве обычных файлов шрифтов? Существуют ли (предпочтительно свободные) инструменты, которые могут это сделать? Также: можно ли это сделать программно, скажем, iText?

ОТВЕТЫ

Ответ 1

У вас есть несколько вариантов. Все эти методы работают как с Linux, так и с Windows или Mac OS X. Однако имейте в виду, что большинство PDF файлов не включают полный, полный шрифт, когда у них есть встроенный шрифт. В основном они включают только подмножество глифов, используемых в документе.

Использование pdftops

Один из наиболее часто используемых методов для этого в системах * nix состоит из следующих шагов:

  • Преобразование PDF в PostScript, например, с помощью XPDF pdftops (в Windows: pdftops.exe вспомогательная программа.
  • Теперь шрифты будут внедрены в формат .pfa (PostScript) +, вы можете извлечь их с помощью текстового редактора .
  • Вам может потребоваться преобразовать .pfa (ASCII) в .pfb (двоичный) файл с помощью t1utils и pfa2pfb .
  • В файлах PDF нет встроенных файлов .pfm или .afm (шрифтовых метрических файлов) (поскольку просмотрщик PDF имеет внутренние знания об этом). Без них файлы шрифтов вряд ли пригодны для использования визуально приятным способом.

Использование fontforge

Другой метод - использовать редактор бесплатных шрифтов FontForge:

  • Используйте диалоговое окно "Открыть шрифт", используемое при открытии файлов.
  • Затем выберите "Извлечь из PDF" в разделе фильтра диалога.
  • Выберите PDF файл с подлежащим извлечению шрифтом.
  • Откроется диалоговое окно "Выбрать шрифт" - выберите здесь, какой шрифт открыть.

Проверьте руководство FontForge. Вам может потребоваться выполнить несколько конкретных шагов, которые не обязательно являются простыми, чтобы сохранить извлеченные данные шрифта в качестве файла, который можно повторно использовать.

Использование mupdf

Примечание. pdfextract.exe - это программа командной строки. Чтобы использовать его, сделайте следующее:

Эта команда будет выгружать все извлекаемые файлы из файла pdf, указанного в текущем каталоге. Как правило, вы увидите множество файлов: изображения, а также шрифты. К ним относятся PNG, TTF, CFF, CID и т.д. Имена изображений будут похожи на img-0412.jpg, если номер объекта PDF для изображения был 412. Шрифты будут похожи на FGETYK + LinLibertineI-0966.ttf, если шрифт Номер объекта PDF был 966.

Файлы CFF (Compact Font Format) являются признанным форматом, который может быть преобразован в другие форматы с помощью различных преобразователей для использования в разных операционных системах.

Опять же: имейте в виду, что большинство этих файлов шрифтов могут иметь только подмножество символов и не могут представлять полный шрифт.

Обновление: (июль 2013 г.) Последние версии mupdf видели внутреннюю перестановку и переименование их двоичных файлов не один раз, а несколько раз. Основная утилита, которая использовалась как "швейцарский нож", называлась mubusy (название, вдохновленное busybox?), Которое в последнее время было переименовано в mutool . Они поддерживают подкоманды info , clean , extract , poster и show . К сожалению, официальная документация по этим инструментам не является актуальной (пока). Если вы используете Mac с помощью "MacPorts": тогда утилита была переименована во избежание конфликтов имен с другими утилитами с использованием одинаковых имен, и вам может понадобиться использовать mupdfextract .

Чтобы достичь (примерно) эквивалентных результатов с помощью mutool , как было показано в предыдущем инструменте pdfextract , просто запустите mubusy extract . . *

Чтобы извлечь шрифты и изображения, вам может потребоваться выполнить одну из следующих команд:

Использование gs (Ghostscript)

Затем Ghostscript также может извлекать шрифты непосредственно из PDF файлов. Однако он нуждается в помощи специальной утилиты с именем extractFonts.ps , написанный на языке PostScript, который доступен из репозитория исходного кода Ghostscript.

Теперь используйте его, вам нужно запустить оба, этот файл extractFonts.ps и ваш файл PDF. Ghostscript затем будет использовать инструкции из программы PostScript для извлечения шрифтов из PDF. Это похоже на Windows (да, Ghostscript понимает "прямую косую черту", ​​/, как разделитель путей и в Windows!):

или в Linux, Unix или Mac OS X:

Я испытал метод Ghostscript несколько лет назад. В то время он действительно извлекал *.ttf(TrueType) просто отлично. Я не знаю, будут ли вообще удалены другие типы шрифтов, и если это так, то можно использовать повторно. Я не знаю, действительно ли утилита блокирует извлечение шрифтов, отмеченных как защищенные.

Использование pdf-parser.py

Наконец, Didier Stevens pdf-parser.py: этот, вероятно, не так прост в использовании, потому что вам нужно иметь некоторые ноу-хау о внутренних структурах PDF. pdf-parser.py - это Python script, который может делать много других вещей. Он также может распаковывать и извлекать произвольные потоки из объектов, и поэтому он также может извлекать встроенные файлы шрифтов.

Но вам нужно знать, что искать. Посмотрим на это с примером. У меня есть файл с именем big.pdf. В качестве первого шага я использую параметр -s для поиска PDF файла для любого вхождения ключевого слова FontFile ( pdf-parser.py не требует поиска с учетом регистра):

В моем случае, для моего big1.pdf, я получаю этот результат:

Он говорит мне, что внутри PDF есть два экземпляра FontFile2 , и они находятся в объектах PDF no. 15 и №. 16, соответственно. Номер объекта. 15 содержит /FontFile2 для шрифта /ArialMT, номер объекта. 16 содержит /FontFile2 для шрифта /Arial -BoldMT.

Чтобы показать это более четко:

Быстрый просмотр в спецификации PDF показывает, что ключевое слово /FontFile2 относится к "потоку, содержащему программу шрифтов TrueType" ( /FontFile будет относиться к "потоку, содержащему программу шрифтов типа 1" и /FontFile3 относятся к "потоку, содержащему программу шрифтов, формат которой указан в записи подтипа в словаре потока" (следовательно, является либо типом Type1C, либо подтипом CIDFontType0C).

Чтобы посмотреть на объект PDF нет. 15 (который содержит шрифт /ArialMT ), можно использовать параметр -o 15 :

Этот вывод pdf-parser.py сообщает нам, что этот объект содержит поток (который он не будет отображать непосредственно), длина которого составляет 1.581.435 байт и кодируется (== "сжата" ) с помощью ASCIIHexEncode и должна быть расшифрована (== "де-сжатый" или "отфильтрованный" ) с помощью стандартного фильтра /ASCIIHexDecode .

Чтобы выгрузить любой поток из объекта, pdf-parser.py можно вызвать с параметром -d dumpname . Позвольте сделать это:

Наш извлеченный дамп данных будет находиться в файле с именем dumped-data.ext. Посмотрим, насколько это велико:

Посмотрите, это 1.581.435 байт. Мы увидели эту цифру в предыдущем выпуске команды. Открытие этого файла текстовым редактором подтверждает, что его содержимое является шестнадцатеричным кодированным ASCII-данным.

Открытие файла с помощью инструмента для чтения шрифтов, такого как otfinfo (это часть пакета lcdf-typetools ) приведет к некоторому разочарованию:

ОК, это потому, что мы еще не допустили pdf-parser.py использовать его полную магию: чтобы сбросить отфильтрованный, декодированный поток. Для этого мы должны добавить параметр -f :

Каков размер этого нового файла?

О, посмотрите, что точное число также было сохранено в объекте PDF no. 15 в качестве значения для клавиши /Length1 .

Что думает file ?

Что сообщает otfinfo об этом?

Итак, Bingo!, у нас есть победитель: pdf-parser.py действительно извлек правильный файл шрифта для нас. Учитывая размер этого файла (778,552 байта), похоже, что этот шрифт был встроен даже полностью в PDF.

Мы могли бы переименовать его в arial-regular.ttf и установить его как таковой и с радостью использовать его.

Предостережение:

В любом случае вам необходимо выполнить лицензию, применимую к шрифту. Некоторые лицензии на шрифты не разрешают бесплатное использование и/или распространение. Пиратские шрифты похожи на пиратство любого программного обеспечения или другого материала, защищенного авторскими правами.

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

Прочитайте также о преимуществах и (более) недостатках в отношении усилий по извлечению шрифтов:

Ответ 2

Ответ 3

В конце концов нашел пакет установщика Windows FontForge и открыл PDF через установленную программу. Работал, так счастлив.

Ответ 4

Ответ 5

PDF2SVG версия 6.0 из PDFTron делает разумную работу. По умолчанию он создает шрифты OpenType ( .otf ). Используйте --preserve_fontnames , чтобы сохранить "схему именования шрифтов/шрифтов", полученную из исходного файла.

PDF2SVG - это коммерческий продукт, но вы можете загрузить бесплатный демонстрационный исполняемый файл (который включает водяные знаки на выходе SVG, но не ограничивает его использование). Могут быть другие продукты PDFTron, которые также извлекают шрифты, но я только недавно обнаружил сам PDF2SVG.

Читайте также: