it-swarm.com.ru

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

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

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

148
simplybest55

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


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

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

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

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

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

  1. Используйте диалоговое окно "Open Font", используемое при открытии файлов.
  2. Затем выберите "Извлечь из PDF" в разделе фильтра диалогового окна.
  3. Выберите файл PDF со шрифтом, который нужно извлечь.
  4. A "Pick a font" открывается диалоговое окно - выберите здесь, какой шрифт открыть.

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


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

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

Снова: имейте в виду, что большинство из этих файлов шрифтов могут иметь только subset ​​символов и могут не представлять полную гарнитуру.

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

Но вам нужно знать, что искать. Давайте посмотрим на это на примере. У меня есть файл с именем 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 и должен быть декодирован (== "de -сжатый "или" отфильтрованный ") с помощью стандартного фильтра /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-регулярно.ttf и установить его как таковой и счастливо использовать его.


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

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

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

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

371
Kurt Pfeifle

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

22
igo

В конце концов нашел пакет установщика FontForge для Windows и открыл PDF через установленную программу. Работал угощение, так счастлив.

5
Dapizz

http://www.verypdf.com/app/pdf-font-extractor/pdf-font-extracting-tool.html ИМО самый простой способ извлечь шрифты (Windows).

4
l00k

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

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

2
Sean Leather

Одним из лучших онлайн-инструментов, доступных в настоящее время для извлечения PDF-шрифтов, является http://www.pdfconvertonline.com/extract-pdf-fonts-online.html

1
Riyafa Abdul Hameed

Это продолжение раздела font-forgeответ @ Kurt Pfeifle , относящегося к Red Hat (и, возможно, к другим дистрибутивам Linux).

  1. Открыв PDF и ​​выбрав нужный шрифт, вы захотите выбрать опцию "Файл -> Создать шрифты ...".
  2. Если в файле есть ошибки, вы можете игнорировать их или сохранить файл и отредактировать их. Большинство ошибок можно исправить автоматически, если вы нажмете "Исправить" достаточно раз.
  3. Нажмите "Элемент -> Информация о шрифте ...", и для "Fontname", "Family Name" и "Name for Humans" будут установлены все значения, которые вам нравятся. Если нет, измените их и сохраните файл где-нибудь. Эти имена будут определять, как ваш шрифт будет отображаться в системе.
  4. Выберите имя файла и нажмите "Сохранить ..."

Получив файл TTF, вы можете установить его в своей системе:

  1. Копирование его в папку /usr/share/fonts (как root)
  2. Запуск fc-cache -f /usr/share/fonts/ (как root)
0
Mad Physicist