Как я могу извлечь встроенные шрифты из PDF как допустимые файлы шрифтов?

161

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

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

Курт Пфайфл
источник

Ответы:

405

У вас есть несколько вариантов. Все эти методы работают как в 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вставляются .afmфайлы или файлы (файлы метрики шрифта) (поскольку программа просмотра PDF обладает внутренними знаниями об этом). Без них файлы шрифтов вряд ли можно использовать визуально приятным способом.

С помощью fontforge

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

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

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


С помощью mupdf

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

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

c:\>  pdfextract.exe  c:\path\to\filename.pdf         # (on Windows)
$>    pdfextract  /path/tofilename.pdf                # (on Linux, Unix, Mac OS X)

Эта команда выведет все извлекаемые файлы из 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 .... *

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

c:\>  mutool.exe extract filename.pdf      # (on Windows)
$>    mutool     extract filename.pdf      # (on Linux, Unix, Mac OS X)

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


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

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

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

gswin32c.exe                  ^
  -q -dNODISPLAY              ^
   c:/path/to/extractFonts.ps ^
  -c "(c:/path/to/your/PDFFile.pdf) extractFonts quit"

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

gs                          \
  -q -dNODISPLAY            \
   /path/to/extractFonts.ps \
  -c "(/path/to/your/PDFFile.pdf) extractFonts quit"

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


С помощью pdf-parser.py

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

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

pdf-parser.py -s fontfile big.pdf

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

obj 9 0
 Type: /FontDescriptor
 Referencing: 15 0 R
  <<   
    /Ascent 728
    /CapHeight 716
    /Descent -210 
    /Flags 32
    /FontBBox [ -665 -325 2000 1006 ]
    /FontFile2 15 0 R
    /FontName /ArialMT
    /ItalicAngle 0
    /StemV 87
    /Type /FontDescriptor
    /XHeight 519
  >>   

obj 11 0 
 Type: /FontDescriptor
 Referencing: 16 0 R
  <<   
    /Ascent 728
    /CapHeight 716
    /Descent -210 
    /Flags 262176
    /FontBBox [ -628 -376 2000 1018 ]
    /FontFile2 16 0 R
    /FontName /Arial-BoldMT
    /ItalicAngle 0
    /StemV 165
    /Type /FontDescriptor
    /XHeight 519
  >>   

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

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

pdf-parser.py -s fontfile big1.pdf | grep -i fontfile
  /FontFile2 15 0 R
  /FontFile2 16 0 R

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

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

pdf-parser.py -o 15 big1.pdf

 obj 15 0
  Type: 
  Referencing: 
  Contains stream
   <<
     /Length1 778552
     /Length 1581435
     /Filter /ASCIIHexDecode
   >>

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

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

pdf-parser.py -o 15 -d dumped-data.ext big1.pdf

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

ls -l dumped-data.ext
  -rw-r--r--  1 kurtpfeifle  staff  1581435 Apr 11 00:29 dumped-data.ext

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

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

otfinfo -i dumped-data.ext
  otfinfo: dumped-data.ext: not an OpenType font (bad magic number)

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

pdf-parser.py -o 15 -f -d dumped-data-decoded.ext big1.pdf

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

ls -l dumped-data-decoded.ext
  -rw-r--r--  1 kurtpfeifle  staff  778552 Apr 11 00:39 dumped-data-decoded.ext

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

Что fileэто значит?

file dumped-data-decoded.ext
  dumped-data-decoded.ext: TrueType font data

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

otfinfo -i dumped-data-decoded.ext
  Family:              Arial
  Subfamily:           Regular
  Full name:           Arial
  PostScript name:     ArialMT
  Version:             Version 5.10
  Unique ID:           Monotype:Arial Regular:Version 5.10 (Microsoft)
  Designer:            Monotype Type Drawing Office - Robin Nicholas, Patricia Saunders 1982
  Manufacturer:        The Monotype Corporation
  Trademark:           Arial is a trademark of The Monotype Corporation.
  Copyright:           © 2011 The Monotype Corporation. All Rights Reserved.
  License Description: You may use this font to display and print content as permitted by
                       the license terms for the product in which this font is included.
                       You may only (i) embed this font in content as permitted by the 
                       embedding restrictions included in this font; and (ii) temporarily 
                       download this font to a printer or other output device to help
                       print content.
  Vendor ID:           TMC

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

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


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

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

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

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

Курт Пфайфл
источник
3
@ kizzx2: не стесняйтесь повышать или понижать любой другой мой ответ [PDF] или [Ghostscript] :-)
Курт Пфайфл
Если вы работаете на Mac и устанавливаете mupdf из портов (или, возможно, из двоичного файла), извлечение также называется mupdfextract. Вы можете запустить его из терминала, если он находится в пути.
Орвеллофил
@ Orwellophile: спасибо за подсказку. Я использовал это как возможность обновить некоторые из моих подсказок о mupdf. Смотрите также это ...
Курт Пфайфл
Я проверю их. И это просто бессмысленный комментарий: ваш процесс работал ОЧЕНЬ ... (проголосовал) ... он извлек и назвал 3 варианта шрифта, а затем я использовал fontforge (также свободный от macports) для слияния. К сожалению, в моем шрифте все еще отсутствует заглавная буква "X" ... Каковы шансы: p
Orwellophile
1
@Chris: да, это два разных подмножества (которые могут даже частично совпадать). Нет возможности автоматически объединить их.
Курт Пфайфл
27

Воспользуйтесь онлайн-сервисом http://www.extractpdf.com . Не нужно ничего устанавливать.

я иду
источник
В моем случае он мог извлекать только шрифты Type 1, а не TrueType
koppor
Я извлек шрифты с помощью этого сайта и скопировал его на ~/.fonts, а копирование и вставка работали!
Эдуардо Сантана
3

Несмотря на то, что этому вопросу 10 лет, он все еще остается в силе, а с изменением технологии - и правильный ответ.

При поиске текущих ответов никто из них не заметил WOFF (Web Open Font Format) ( W3C ) ( Wikipedia ), который можно использовать для воссоздания отдельных символов (глифов) и точного отображения их на веб-странице.

Используя бесплатную онлайн-страницу IDR Solutions, PDF в HTML5 ( ссылка ), конвертировать PDF в ZIP-файл. В результате zip будет каталогом шрифтов woff типов файлов. Текущие интернет-браузеры поддерживают файлы woff, если вы не знали. ( ссылка ) С ними можно ознакомиться на сайте FontDrop! ( ссылка ).

Файлы WOFF можно конвертировать в / из OTF или TTF в WOFFer - конвертер шрифтов WOFF

Также zip-файл из PDF в HTML5 будет содержать HTML-файл для каждой страницы PDF, который можно открыть в интернет-браузере, и является одним из лучших и наиболее точных переводов PDF, которые я нашел или увидел.

Пока я только учусь использовать файлы WOFF, об этом стоит рассказать. Наслаждаться.

PS, я, вероятно, буду обновлять с большей информацией, поскольку я узнаю больше об использовании типов файлов woff, но так как это творческое достояние, не стесняйтесь редактировать этот ответ, если у вас есть что-то ценное для передачи.

Гай Кодер
источник
Спасибо! Это решение работает для меня (как при создании действительного TTF), тогда как другие, которые я пробовал, не работают. Это потому, что WOFF лучше обрабатывает неполные шрифты?
Даан
@ Даан, Is it because WOFF handles incomplete fonts better?я понятия не имею. Ваше предположение будет так же хорошо, как мина. Как я уже отмечал, я только сам узнаю о ВОВФ.
Гай Кодер
@Daan Возможно, вам следует опубликовать Is it because WOFF handles incomplete fonts better?новый SO вопрос, и другие, обладающие большими знаниями, увидят и, надеюсь, дадут содержательный ответ.
Гай Кодер
Я мог бы сделать это. Спасибо.
Даан
2

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

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

Шон Кожа
источник
К сожалению --preserve_fontnames, не работает, если у вас есть перекрывающиеся, частичные шрифты - похоже, он не включает префикс, например, MSCIYGin MSCIYG+Ge'ez-1, поэтому перезаписывает предыдущие партиалы.
Крис
0

Это продолжение font-forgeраздела ответа @Kurt Pfeifle, посвященного Red Hat (и, возможно, другим дистрибутивам Linux).

  1. После открытия PDF-файла и выбора нужного шрифта вы захотите выбрать опцию «Файл -> Создать шрифты ...».
  2. Если в файле есть ошибки, вы можете игнорировать их или сохранить файл и отредактировать их. Большинство ошибок можно исправить автоматически, если вы нажмете «Исправить» достаточное количество раз.
  3. Нажмите «Элемент -> Информация о шрифте ...», и для «Fontname», «Family Name» и «Name for Humans» будут установлены все значения, которые вам нравятся. Если нет, измените их и сохраните файл где-нибудь. Эти имена будут определять, как ваш шрифт будет отображаться в системе.
  4. Выберите имя файла и нажмите «Сохранить ...»

Получив файл TTF, вы можете установить его в своей системе

  1. Копирование в папку /usr/share/fonts(как root)
  2. Запуск fc-cache -f /usr/share/fonts/(как root)
Безумный физик
источник