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