Как вытащить шрифт из pdf

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

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

У вас есть несколько вариантов. Все эти методы работают как с 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

Далее, MuPDF. Это приложение поставляется с утилитой под названием pdfextract (в Windows: pdfextract.exe ), которая может извлекать шрифты и изображения из PDF файлов. (Если вы не знаете о MuPDF, который по-прежнему остается относительно неизвестным и новым: "MuPDF — это бесплатный легкий просмотрщик PDF и инструментарий, написанный на портативном компьютере C.", написанный разработчиками программного обеспечения Artifex, той же компанией, которая дала нам Ghostscript. )
(Обновление:). Новые версии MuPDF перенесли прежнюю функциональность "pdfextract" в команду "Извлечение mutool". Загрузите ее здесь: mupdf.com/downloads)суб >

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

Эта команда будет выгружать все извлекаемые файлы из файла pdf, указанного в текущем каталоге. Как правило, вы увидите множество файлов: изображения, а также шрифты. К ним относятся PNG, TTF, CFF, CID и т.д. Имена изображений будут похожи на img-0412.png, если номер объекта 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 . . *

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

Загрузки находятся здесь: mupdf.com/downloads

Использование 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 файлов, которые находятся в дикой природе, в любом случае не вставляют полный шрифт, а только подмножества. Извлечение подмножества шрифта полезно только в очень ограниченной области, если вообще.

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

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

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

6 ответов

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

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

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

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

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

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

  1. Используйте диалоговое окно «Открыть шрифт», используемое при открытии файлов.
  2. Затем выберите «Извлечь из PDF» в разделе фильтра диалога.
  3. Выберите файл PDF с шрифтом для извлечения.
  4. Откроется диалоговое окно «Выбор шрифта» — выберите здесь, какой шрифт открыть.

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

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

Далее MuPDF . Это приложение поставляется с утилитой pdfextract (в Windows: pdfextract.exe ), которая может извлекать шрифты и изображения из PDF-файлов. (В случае, если вы не знаете о MuPDF, который все еще относительно неизвестен и является новым: «MuPDF — это бесплатный легкий просмотрщик PDF и инструментарий, написанный на переносимом языке C.» , написанный разработчиками Artifex Software, той же самой компании, которая подарила нам Ghostscript. )
( Обновление: в более новых версиях MuPDF прежняя функциональность pdfextract перенесена в команду «mutool extract» . Загрузите ее здесь: mupdf.com/downloads )

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

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

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

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

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

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

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

Загрузки здесь: mupdf.com/downloads

Использование 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

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

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

Читайте также:  Как настроить хром чтобы не закрывались вкладки

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

Он говорит мне, что есть два экземпляра FontFile2 внутри PDF, и они находятся в объектах PDF нет. 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 " или "отфильтрован") с помощью стандартного фильтра /ASCIIHexDecode .

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

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

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

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

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

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

О, смотрите: это точное число также уже было сохранено в объекте PDF №. 15 словарь как значение для ключа /Length1 .

Что file думает, что это?

Что otfinfo говорит нам об этом?

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

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

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

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

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

Пожалуйста, прочитайте также о плюсах и минусах относительно извлечения шрифтов:

Есть ли способ извлечь шрифты из файлов PDF?

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

3 ответа

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

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

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

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

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

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

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

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

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

Adblock
detector