У вас есть несколько вариантов. Все эти методы работают в Linux, а также в Windows или Mac OS X. Однако имейте в виду, что большинство PDF-файлов не включают полный, полный шрифт, если в них встроен шрифт. В основном они включают только подмножество глифов, используемых в документе.
Использование pdftops
Один из наиболее часто используемых способов сделать это в системах * nix состоит из следующих шагов:
- Преобразуйте PDF в PostScript, например, используя
pdftops
в XPDF. (в 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 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 (компактный формат шрифта) - это признанный формат, который можно преобразовать в другие форматы с помощью различных конвертеров для использования в разных операционных системах.
Еще раз: имейте в виду, что большинство этих файлов шрифтов могут иметь только подмножество символов и могут не представлять полный шрифт.
Обновление: (июль 2013 г.) В последних версиях mupdf
двоичные файлы подвергались внутренней перестановке и переименованию, причем не один раз, а несколько раз. Раньше основной утилитой был бинарный файл, похожий на «швейцарский нож», с именем mubusy
(название навеянным busybox?), Который недавно был переименован в mutool
. Они поддерживают подкоманды info
, clean
, extract
, poster
и show
. К сожалению, официальная документация для этих инструментов не обновлена (пока). Если вы используете MacPorts на Mac: тогда утилита была переименована, чтобы избежать конфликтов имен с другими утилитами, использующими идентичные имена, и вам может потребоваться использовать mupdfextract
.
Чтобы получить (примерно) эквивалентные результаты с mutool
, как это делал его предыдущий инструмент pdfextract
, просто запустите _28 _. *
Поэтому для извлечения шрифтов и изображений вам может потребоваться запустить одну из следующих командных строк:
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
>>
Он сообщает мне, что в PDF-файле есть два экземпляра FontFile2
, и они находятся в объектах 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' em> и /FontFile3
будут относиться к 'потоку, содержащему программу шрифтов, формат которой задан записью Subtype в словаре потока' {, следовательно, либо Type1C, либо < em> CIDFontType0C subtype}.)
Чтобы посмотреть конкретно на объект 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 словаря в качестве значения ключа _63 _...
Что это 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-regular.ttf, установить как таковой и с радостью использовать.
Предостережения:
В любом случае вам необходимо соблюдать лицензию, которая распространяется на шрифт. Некоторые лицензии на шрифты не позволяют бесплатное использование и / или распространение. Пиратские шрифты схожи с пиратством любого программного обеспечения или других материалов, защищенных авторским правом.
Большинство распространенных PDF-файлов в любом случае не включают полный шрифт, а только его подмножества. Извлечение подмножества шрифта полезно только в очень ограниченном объеме, если вообще возможно.
Пожалуйста, прочтите также следующее о плюсах и (больше) минусах, связанных с извлечением шрифтов:
person
Kurt Pfeifle
schedule
15.08.2010