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