Мне известна утилита pdftk.exe
, которая может указывать, какие шрифты используются PDF, и неважно, встроены они или нет.
Теперь проблема: учитывая, что у меня были файлы PDF со встроенными шрифтами - как я могу извлечь эти шрифты таким образом, чтобы их можно было повторно использовать в качестве файлов обычных шрифтов? Есть ли (желательно бесплатные) инструменты, которые могут это сделать? Также: это можно сделать программно, скажем, iText?
У вас есть несколько вариантов. Все эти методы работают в Linux, а также в Windows или Mac OS X. Тем не менее, имейте в виду, что большинство PDF-файлов не включают полный, полный шрифт, если в них встроен шрифт. В основном они включают только подмножество глифов, используемых в документе.
pdftops
Один из наиболее часто используемых методов для этого в системах * nix состоит из следующих шагов:
pdftops
(в Windows: вспомогательная программа pdftops.exe
. .pfa
(PostScript) + вы можете извлечь их, используя текст ) редактор . .pfa
(ASCII) в .pfb
(двоичный) файл с помощью t1utils
и pfa2pfb
. .pfm
или .afm
(файлы с метрикой шрифтов) (поскольку программа просмотра PDF имеет внутренние знания об этом). Без них файлы шрифтов вряд ли будут визуально удобными. fontforge
Другой метод - использование бесплатного редактора шрифтов FontForge :
Обратитесь к руководству по 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
. К сожалению, официальная документация для этих инструментов не обновлена (пока). Если вы используете MacPorts на Mac: тогда утилита была переименована, чтобы избежать конфликтов имен с другими утилитами, использующими идентичные имена, и вам может потребоваться использовать 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 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-файлов в любом случае не включают полный шрифт, а только его подмножества. Извлечение подмножества шрифта полезно только в очень ограниченном объеме, если вообще возможно.
Пожалуйста, прочтите также следующее о плюсах и (не только) минусах, связанных с извлечением шрифтов: