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

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

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

Ответ 1

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

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


Использование mupdf

Далее, MuPDF. Это приложение поставляется с утилитой под названием pdfextract (в Windows: pdfextract.exe), которая может извлекать шрифты и изображения из PDF файлов. (Если вы не знаете о MuPDF, который по-прежнему остается относительно неизвестным и новым: "MuPDF - это бесплатный легкий просмотрщик PDF и инструментарий, написанный на портативном компьютере C.", написанный разработчиками программного обеспечения Artifex, той же компанией, которая дала нам Ghostscript. )
(Обновление:). Новые версии MuPDF перенесли прежнюю функциональность "pdfextract" в команду "Извлечение mutool". Загрузите ее здесь: 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

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

Но вам нужно знать, что искать. Посмотрим на это с примером. У меня есть файл с именем 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 no. 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 no. 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-regular.ttf и установить его как таковой и с радостью использовать его.


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

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

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

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

Ответ 2

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

Ответ 5

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

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