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

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

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

152
задан Kurt Pfeifle 15 August 2010 в 21:42
поделиться

1 ответ

У вас есть несколько вариантов. Все эти методы работают в Linux, а также в Windows или Mac OS X. Тем не менее, имейте в виду, что большинство PDF-файлов не включают полный, полный шрифт, если в них встроен шрифт. В основном они включают только подмножество глифов, используемых в документе.


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

Один из наиболее часто используемых методов для этого в системах * nix состоит из следующих шагов:

  1. Преобразование PDF в PostScript, например, с помощью XPDF pdftops (в Windows: вспомогательная программа pdftops.exe .
  2. Теперь шрифты будут встроены в формат .pfa (PostScript) + вы можете извлечь их, используя текст ) редактор .
  3. Возможно, вам потребуется преобразовать .pfa (ASCII) в .pfb (двоичный) файл с помощью t1utils и pfa2pfb .
  4. В PDF-файлы никогда не встроены файлы .pfm или .afm (файлы с метрикой шрифтов) (поскольку программа просмотра PDF имеет внутренние знания об этом). Без них файлы шрифтов вряд ли будут визуально удобными.

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

Другой метод - использование бесплатного редактора шрифтов FontForge :

  1. Используйте Диалоговое окно «Открыть шрифт» , используемое при открытии файлы.
  2. Затем выберите «Извлечь из PDF» в разделе фильтра диалогового окна.
  3. Выберите файл PDF со шрифтом для извлечения.
  4. A Откроется диалоговое окно «Выберите шрифт» - выберите здесь, какой шрифт открыть.

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

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

382
ответ дан 23 November 2019 в 22:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: