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

<p>мне известно об утилите <code>pdftk.exe</code>, которая может указывать, какие шрифты используются в pdf-файле, и в зависимости от того, встроены они или нет.</p><p>теперь проблема: учитывая, что у меня есть pdf файлы со встроенными шрифтами - как я могу извлечь эти шрифты таким образом, чтобы их можно было повторно использовать как обычные файлы шрифтов? есть ли (желательно бесплатные) инструменты, которые могут это сделать? также: можно ли это сделать программно, скажем, с помощью itext?</p>

<p>у вас есть несколько вариантов. все эти методы работают как в linux, так и в windows или mac os x. однако следует помнить, что большинство pdf-файлов не включают в себя полный и полный шрифт, если в них встроен шрифт. в основном они включают только <em>subset</em> глифов, используемых в документе.</p><hr><h3>использование <code>pdftops</code></h3><p>один из наиболее часто используемых методов для этого в системах * nix состоит из следующих шагов:</p><ol> <li>преобразуйте pdf в postscript, например, с помощью xpdf's <a href="http://www.foolabs.com/xpdf/download.html"><strong><code>pdftops</code></strong></a> (в windows: <code>pdftops.exe</code> вспомогательная программа ,.</li> <li>теперь шрифты будут встроены в формат <code>.pfa</code> (postscript) + вы можете извлечь их с помощью <strong> текстового редактора </strong>.</li> <li>вам может потребоваться преобразовать <code>.pfa</code> (ascii) в <code>.pfb</code> (двоичный) файл, используя <code>t1utils</code> и <code>pfa2pfb</code>.</li> <li>в pdf-файлах никогда не внедряются файлы <code>.pfm</code> или <code>.afm</code> (файлы метрики шрифта) (потому что pdf средство просмотра обладает внутренними знаниями об этом). без них файлы шрифтов вряд ли можно использовать визуально приятным способом.</li> </ol><hr><h3>использование <code>fontforge</code></h3><p>другой способ - использовать бесплатный редактор шрифтов <a href="http://fontforge.sourceforge.net/"><strong> fontforge </strong></a> :</p><ol> <li>используйте диалоговое окно <em>"open font"</em>, используемое при открытии файлов.</li> <li>затем выберите <em>"извлечь из pdf"</em> в разделе фильтра диалогового окна.</li> <li>выберите файл pdf со шрифтом, который нужно извлечь.</li> <li>a <em>"pick a font"</em> открывается диалоговое окно - выберите здесь, какой шрифт открыть.</li> </ol><p>проверьте руководство fontforge. возможно, вам придется выполнить несколько конкретных шагов, которые не обязательно просты, чтобы сохранить извлеченные данные шрифта в виде файла, который можно использовать повторно.</p><hr><h3>использование <code>mupdf</code></h3><p>далее <a href="http://mupdf.com/"><strong> mupdf </strong></a> . это приложение поставляется с утилитой <code>pdfextract</code> (в windows: <code>pdfextract.exe</code>), которая может извлекать шрифты и изображения из pdf-файлов. (в случае, если вы не знаете о mupdf, который все еще относительно неизвестен и является новым: <em>"mupdf является свободным облегченным pdf средством просмотра и инструментарием, написанным на переносимом языке c."</em>, написано от разработчиков программного обеспечения artifex, той же компании, которая подарила нам ghostscript.)<br> <sub>(<strong> обновление: </strong> более новые версии mupdf перенесли прежнюю функциональность <em>'pdfextract'</em> в команду <em>'mutool extract '</em>. загрузите его здесь: <strong> <a href="http://mupdf.com/downloads/">mupdf.com/downloads</a> </strong>)</sub></p><p>примечание: <code>pdfextract.exe</code> - это программа командной строки. чтобы использовать это, сделайте следующее:</p><pre><code>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 символов и могут не представлять полную гарнитуру.<strong> обновление: </strong> (июль 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) </code></pre><p>загрузки здесь: <strong> <a href="http://mupdf.com/downloads/">mupdf.com/downloads</a> </strong></p><hr><h3>использование <code>gs</code> (ghostscript)</h3><p>тогда <a href="http://www.ghostscript.com/releases/"><strong> ghostscript </strong></a> также может извлекать шрифты непосредственно из pdf-файлов. однако для этого нужна специальная служебная программа с именем <a href="http://git.ghostscript.com/?p=ghostpdl.git;a=blob;f=toolbin/extractfonts.ps"><strong><code>extractfonts.ps</code></strong></a> , написанная на языке postscript, доступная из - <a href="http://git.ghostscript.com/?p=ghostpdl.git;a=tree">хранилище исходного кода ghostscript</a> .</p><p>теперь используйте его, вам нужно запустить и этот файл <code>extractfonts.ps</code> и ваш файл pdf. затем ghostscript будет использовать инструкции из программы postscript для извлечения шрифтов из pdf. в windows это выглядит так (да, ghostscript понимает "косую черту", /, как разделитель пути и в windows!):</p><pre><code>gswin32c.exe ^ -q -dnodisplay ^ c:/path/to/extractfonts.ps ^ -c "(c:/path/to/your/pdffile.pdf) extractfonts quit" </code></pre><p>или в linux, unix или mac os x:</p><pre><code>gs \ -q -dnodisplay \ /path/to/extractfonts.ps \ -c "(/path/to/your/pdffile.pdf) extractfonts quit" </code></pre><p>я тестировал метод ghostscript несколько лет назад. в то время он действительно извлекал * .ttf (truetype) просто отлично. я не знаю, будут ли вообще извлечены другие типы шрифтов, и если да, то для повторного использования. я не знаю, блокирует ли утилита извлечение шрифтов, помеченных как защищенные.</p><hr><h3>использование <code>pdf-parser.py</code></h3><p>наконец, didier stevens ' <a href="http://blog.didierstevens.com/programs/pdf-tools/"><strong> pdf-parser.py </strong></a> : этот, вероятно, не так прост в использовании, потому что вам нужно иметь некоторые ноу-хау о внутренних pdf структурах. <code>pdf-parser.py</code> - это сценарий python, который также может выполнять множество других задач. он также может распаковывать и извлекать произвольные потоки из объектов, и, следовательно, он также может извлекать файлы встроенных шрифтов.</p><p>но вам нужно знать, что искать. давайте посмотрим на это на примере. у меня есть файл с именем <em>big.pdf</em>. в качестве первого шага я использую параметр <strong><code>-s</code></strong> для поиска в pdf любого вхождения ключевого слова <em>fontfile</em> = (<code>pdf-parser.py</code> не требует поиска с учетом регистра):</p><pre><code>pdf-parser.py -s fontfile big.pdf </code></pre><p>в моем случае для моего <em>big1.pdf</em> я получаю такой результат:</p><pre><code>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 >> </code></pre><p>он говорит мне, что есть два экземпляра <code>fontfile2</code> внутри pdf, и они находятся в pdf объектах №. 15 и нет. 16 соответственно. № объекта 15 содержит <code>/fontfile2</code> для шрифта <em>/ arialmt</em>, объект №. 16 содержит <code>/fontfile2</code> для шрифта <em>/ arial-boldmt</em>.</p><p>чтобы показать это более четко:</p><pre><code>pdf-parser.py -s fontfile big1.pdf | grep -i fontfile /fontfile2 15 0 r /fontfile2 16 0 r </code></pre><p>быстрый просмотр спецификации pdf показывает, что ключевое слово <code>/fontfile2</code> относится к <em>'потоку, содержащему программу шрифтов truetype'</em> (<code>/fontfile</code> будет относиться к потоку <em>', содержащему программа шрифтов типа 1 '</em> и <code>/fontfile3</code> будут относиться к потоку <em>', содержащему программу шрифтов, формат которой указан в записи подтипа в словаре потоков '</em> {и, следовательно, либо <em>type1c</em> или <em>cidfonttype0c</em> подтип}.)</p><p>чтобы посмотреть конкретно на pdf объект №. 15 (который содержит шрифт <em>/ arialmt</em>), можно использовать параметр <strong><code>-o 15</code></strong>:</p><pre><code>pdf-parser.py -o 15 big1.pdf obj 15 0 type: referencing: contains stream << /length1 778552 /length 1581435 /filter /asciihexdecode >> </code></pre><p>этот вывод <code>pdf-parser.py</code> говорит нам, что этот объект содержит поток (который он не будет отображать напрямую), который имеет длину 1.581.435 байт и закодирован (== "сжат") с помощью asciihexencode и должен быть декодирован (== "de -сжатый "или" отфильтрованный ") с помощью стандартного фильтра <code>/asciihexdecode</code>.</p><p>для вывода любого потока из объекта можно вызвать <code>pdf-parser.py</code> с параметром <strong><code>-d dumpname</code></strong>. давай сделаем это:</p><pre><code>pdf-parser.py -o 15 -d dumped-data.ext big1.pdf </code></pre><p>наш извлеченный дамп данных будет в файле с именем <em>dumped-data.ext</em>. посмотрим, насколько он большой:</p><pre><code>ls -l dumped-data.ext -rw-r--r-- 1 kurtpfeifle staff 1581435 apr 11 00:29 dumped-data.ext </code></pre><p>о, смотри, это 1.581.435 байт. мы видели эту цифру в выводе предыдущей команды. открытие этого файла в текстовом редакторе подтверждает, что его содержимое является ascii шестнадцатеричными данными.</p><p>открытие файла с помощью инструмента чтения шрифтов, такого как <code>otfinfo</code> (это часть пакета <strong> <a href="http://www.lcdf.org/type/"><code>lcdf-typetools</code></a> </strong>), приведет к разочарованию вначале:</p><pre><code>otfinfo -i dumped-data.ext otfinfo: dumped-data.ext: not an opentype font (bad magic number) </code></pre><p>хорошо, это потому, что мы (пока) не позволили <code>pdf-parser.py</code> использовать всю его магию: сбросить отфильтрованный, декодированный поток. для этого мы должны добавить параметр <strong><code>-f</code></strong>:</p><pre><code>pdf-parser.py -o 15 -f -d dumped-data-decoded.ext big1.pdf </code></pre><p>каков размер этого нового файла?</p><pre><code>ls -l dumped-data-decoded.ext -rw-r--r-- 1 kurtpfeifle staff 778552 apr 11 00:39 dumped-data-decoded.ext </code></pre><p>о, смотрите: это точное число также уже было сохранено в объекте pdf. 15 словарь в качестве значения для ключа <code>/length1</code>...</p><p>что думает <code>file</code>?</p><pre><code>file dumped-data-decoded.ext dumped-data-decoded.ext: truetype font data </code></pre><p>что <code>otfinfo</code> говорит нам об этом?</p><pre><code>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 </code></pre><p>итак, bingo !, у нас есть победитель: <code>pdf-parser.py</code> действительно извлек для нас правильный файл шрифта. учитывая размер этого файла (778,552 байт), похоже, что этот шрифт был встроен даже <em>полностью</em> в pdf ...</p><p>мы могли бы переименовать его в <em>arial-регулярно.ttf</em> и установить его как таковой и счастливо использовать его.</p><hr><h2>предостережения:</h2><ul> <li> <p><strong> <em>в любом случае вам необходимо следовать лицензии, которая применяется к шрифту. некоторые лицензии на шрифты не разрешают свободное использование и/или распространение. пиратство шрифтов похоже на пиратство любого программного обеспечения или других материалов, защищенных авторским правом.</em> </strong></p> </li> <li> <p><strong> <em>большинство pdf-файлов, которые находятся там, не содержат полного шрифта, а только подмножества. извлечение подмножества шрифта полезно только в очень ограниченном объеме, если вообще.</em> </strong></p> </li> </ul><p>пожалуйста, прочитайте также о плюсах и минусах относительно извлечения шрифтов:</p><ul> <li> <a href="http://typophile.com/node/34377">http://typophile.com/node/34377</a> - <strong> больше недоступен </strong>, но его можно увидеть на wayback machine по адресу - <a href="https://web.archive.org/web/20110717120241/typophile.com/node/34377">https://web.archive.org/web/20110717120241/typophile.com/node/34377</a> </li> </ul>

<p>воспользуйтесь онлайн-сервисом <a href="http://www.extractpdf.com">http://www.extractpdf.com</a> . не нужно ничего устанавливать.</p>

<p>в конце концов нашел <a href="http://www.mpetroff.net/software/fontforge-windows/">пакет установщика fontforge для windows</a> и открыл pdf через установленную программу. работал угощение, так счастлив.</p>

<p> <a href="http://www.verypdf.com/app/pdf-font-extractor/pdf-font-extracting-tool.html">http://www.verypdf.com/app/pdf-font-extractor/pdf-font-extracting-tool.html</a> имо самый простой способ извлечь шрифты (windows).</p>

<p> <a href="http://www.pdftron.com/pdf2svg/">pdf2svg</a> версия 6.0 из <a href="http://www.pdftron.com/">pdftron</a> делает разумную работу. по умолчанию он создает шрифты opentype (<code>.otf</code>). используйте <code>--preserve\_fontnames</code>, чтобы сохранить "схему именования font/font-family, полученную из исходного файла".</p><p>pdf2svg является коммерческим продуктом, но вы можете загрузить бесплатный демонстрационный исполняемый файл (который включает водяные знаки в выводе svg, но не ограничивает использование). могут быть и другие продукты pdftron, которые также извлекают шрифты, но я только недавно обнаружил pdf2svg.</p>

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

<p>это продолжение раздела <code>font-forge</code> <a href="https://stackoverflow.com/a/3489099/2988730">ответ @ kurt pfeifle</a> , относящегося к red hat (и, возможно, к другим дистрибутивам linux).</p><ol> <li>открыв pdf и выбрав нужный шрифт, вы захотите выбрать опцию "файл -> создать шрифты ...".</li> <li>если в файле есть ошибки, вы можете игнорировать их или сохранить файл и отредактировать их. большинство ошибок можно исправить автоматически, если вы нажмете "исправить" достаточно раз.</li> <li>нажмите "элемент -> информация о шрифте ...", и для "fontname", "family name" и "name for humans" будут установлены все значения, которые вам нравятся. если нет, измените их и сохраните файл где-нибудь. эти имена будут определять, как ваш шрифт будет отображаться в системе.</li> <li>выберите имя файла и нажмите "сохранить ..."</li> </ol><p>получив файл ttf, вы можете установить его в своей системе:</p><ol> <li>копирование его в папку <code>/usr/share/fonts</code> (как root)</li> <li>запуск <code>fc-cache -f /usr/share/fonts/</code> (как root)</li> </ol>