Извлечение встроенных PDF-шрифтов во внешний файл ttf с помощью некоторой утилиты или скрипта - PullRequest
1 голос
/ 17 декабря 2009

Можно ли извлечь шрифты, встроенные в файл PDF, во внешний файл ttf с помощью какой-либо утилиты или скрипта?

  1. Если в системе присутствуют шрифты, которые встроены (или не встроены) в файл PDF. Используя инструменты pdf2swf и swfextract из swftools, я могу определить имена шрифтов, используемых в файле PDF. Затем я могу скомпилировать соответствующий системный шрифт во время выполнения, а затем загрузить его в мое приложение AIR.

  2. НО, если шрифты, используемые в PDF, отсутствуют в системе, есть две возможности:

    2,1. Если они также отсутствуют в файлах PDF (не встроены), мы можем использовать только аналогичный системный шрифт, основываясь на имени шрифта.

    2,2. Если они встроены в файл PDF, то я хочу знать, возможно ли вообще извлечь их из внешнего файла ttf, чтобы я мог скомпилировать каждый из них в отдельные файлы swf во время выполнения?

Ответы [ 5 ]

6 голосов
/ 09 февраля 2010

Я знаю, что прошло много времени с тех пор, как вы спросили об этом, но я подумал, что смогу помочь.

Я не знаю, есть ли какая-нибудь утилита, которая позволит вам извлекать файлы шрифтов, но вы можете сделать это вручную.

В основном PDF-файл - это текстовый файл с различными объектами. Вы можете открыть его в любом текстовом редакторе и найти шрифты.

Шрифты указываются в объектах FontDescriptor, например:

<</Type/FontDescriptor/FontName/ABCDEE+Algerian ... /FontFile2 24 0 R>>

В основном это говорит о том, что шрифт с именем Algerian указан для объекта 24. Вы можете искать документ 24 для объекта со строкой «24 0 obj», после этой строки он отображает свойства потока с файл шрифта и после ключевого слова stream он запускается (его длина определяется в строке после obj).

Этот поток содержит сжатый файл ttf, для его распаковки вы можете использовать этот метод:

  private static byte[] DecodeFlateDecodeData(byte[] data)
  {
     MemoryStream outputStream;
     using (outputStream = new MemoryStream())
     {
        using (var compressedDataStream = new MemoryStream(data))
        {
           // Remove the first two bytes to skip the header (it isn't recognized by the DeflateStream class)
           compressedDataStream.ReadByte();
           compressedDataStream.ReadByte();

           var deflateStream = new DeflateStream(compressedDataStream, CompressionMode.Decompress, true);

           var decompressedBuffer = new byte[1024];
           int read;
           while ((read = deflateStream.Read(decompressedBuffer, 0, decompressedBuffer.Length)) != 0)
           {
              outputStream.Write(decompressedBuffer, 0, read);
           }
           outputStream.Flush();
           compressedDataStream.Close();
        }
        return GetStreamBytes(outputStream);
     }
  }

Надеюсь, это поможет вам ... или поможет кому-то еще

2 голосов
/ 28 сентября 2011

Незначительное обновление - некоторые PDF-файлы содержат шрифты, встроенные в другой уникальный формат, как файлы .CID. Этот формат предназначен для шрифтов, которые поддерживают много символов (например, шрифты азиатских языков) и не отображают глифы на буквы обычным способом.

Вы по-прежнему можете использовать используемые шрифты из файла .CID, вам просто нужно добавить шаг к моему ответу выше. Запустите ваш PDF через программу PStill (GPStill). Сайт находится здесь: http://www.wizards.de/~frank/pstill.html

При выборе входа измените раскрывающийся список с файла Postscript на PDF-файл. Ваш выходной PDF будет добавлен _new к нему. Если вам нужно разблокировать PDF, вы можете использовать Advanced PDF Password Recovery от Elcomsoft.

Этот шаг заключается в преобразовании шрифтов CID, встроенных в PDF, в шрифты PFA типа 1. Поэтому после запуска PDFextract вместо набора ненужных файлов .CID у вас есть файлы .PFA, которые можно импортировать в Fontlab и, возможно, в Crossfont. Помните, что буквы, вероятно, не будут отображаться правильно, поэтому вы действительно хотите, чтобы что-то вроде Fontlab перемещало их так, например, ввод A на клавиатуре не приводит к букве R.

Как всегда, если шрифт был встроен только как подмножество, вы не получите весь шрифт, только ограниченный набор букв.

2 голосов
/ 29 августа 2011

Ссылка для получения cfftot1.exe была изменена на ftp: //tug.org/texlive/Contents/live/bin/i386-linux/

2 голосов
/ 22 июня 2011

Несколько лет назад я разработал специальный шрифт. Это заняло у меня около года работы. Однажды мой жесткий диск Maxtor умер, и я никак не мог восстановить свою работу. Но у меня был шрифт, встроенный в некоторые файлы PDF для моих клиентов. Тогда у меня есть идея извлечь шрифты из этих файлов. После года или около того поиска ответа в Интернете я разработал метод извлечения шрифтов из PDF. Я представил этот метод в своем блоге на http://pdffontextract.blogspot.com. С тех пор, как я нашел это решение, появилось много альтернатив, но с разнообразием все в порядке. Я сделал этот пост, чтобы помочь другим, которые должны восстановить свою потерянную работу. Веселитесь, и если вам нужна помощь, не стесняйтесь обращаться ко мне.

2 голосов
/ 07 апреля 2011

Это поздний ответ, но я нашел способ сделать это с помощью свободно доступных программ для Windows. Не требует сценариев, компиляции или Cygwin. Это несколько шагов, но не так плохо, как кажется.

  1. Установить mupdf ссылка - http://mupdf.googlecode.com/files/mupdf-0.8.15-windows.zip и скопируйте ваш pdf в папку установки mupdf. Допустим, он называется «что угодно» .pdf.

  2. Открыть окно / командную строку. Перейдите в папку установки mupdf. пример: cd C: \ Program Files \ mupdf ... Если все пройдет гладко, ваше приглашение должно выглядеть следующим образом: C: \ Program Files \ mupdf> Теперь введите следующую команду: pdfextract what.pdf

После этого в папке программы mupdf у вас будет один или несколько файлов шрифтов. У них будут имена вроде ABCDEF + Fontname-12.cff ... Сейчас они в непригодном для использования формате .cff, но мы исправим это. Я рекомендую переименовать это на что-то менее неловкое ... например what.cff

  1. Больше DOS, извините. Вам нужен инструмент с именем cfftot1.exe. Вот ссылка: FTP: //tug.org/texlive/Contents/live/bin/win32/cfftot1.exe ... Скопируйте его в папку mupdf. Затем введите это: cfftot1 бы то ни было .cff what.pfb

  2. Теперь у вас есть почти пригодный для использования файл шрифтов, который называется what.pfb. Я говорю «почти», потому что обычно файлы шрифтов PFB также идут со вторым файлом, файлом PFM, который содержит информацию о пробелах. Без этого файла шрифт не будет установлен и интервал будет испорчен. Но шрифт будет по-прежнему открываться в таких редакторах, как fontlab Вы можете сохранить шрифт оттуда в TTF или OTF. Вы также можете попробовать исправить расстояние самостоятельно.

Если у вас нет редактора шрифтов, вы можете использовать crossfont. Crossfont может взять PFB и сгенерировать необходимый файл PFM, чтобы вы могли хотя бы установить и использовать шрифт. ссылка - http://crossfont.en.softonic.com/

Вот и все.

...