Як я можу витягувати вбудовані шрифти з PDF як дійсні файли шрифтів?


161

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

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

Відповіді:


405

У вас є кілька варіантів. Усі ці методи працюють як в 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. Відкриється діалогове вікно "Вибір шрифту" - тут виберіть, який шрифт відкрити.

Перевірте посібник FontForge. Можливо, вам доведеться виконати кілька конкретних кроків, які не обов'язково є простими, щоб зберегти витягнуті дані шрифту як файл, який можна повторно використовувати.


Використання mupdf

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

Знову ж таки: пам’ятайте, що більшість цих файлів шрифтів можуть мати лише підмножину символів і не можуть представляти повний шрифт.

Оновлення: (липень 2013 р.) Останні версії mupdfне лише одного разу, а кілька разів бачили внутрішню перестановку та перейменування своїх бінарних файлів. Головною утилітою раніше називався двійковий код, схожий на "швейцарський ніж" mubusy(ім'я, натхнене зайнятим?), До якого нещодавно було перейменовано 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

Нарешті, 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 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

Отже, Бінго !, у нас є переможець: pdf-parser.pyдійсно витяг дійсний файл шрифту для нас. Враховуючи розмір цього файлу (778.552 байт), схоже, цей шрифт був повністю вбудований у PDF ...

Ми можемо перейменувати його на arial-regular.ttf та встановити його як такий і радісно використовувати його.


Застереження:

  • У будь-якому випадку потрібно дотримуватися ліцензії, яка стосується шрифту. Деякі ліцензії на шрифт не дозволяють безкоштовно використовувати та / або розповсюджувати. Піратські шрифти - це як піратство будь-якого програмного забезпечення або іншого захищеного авторським правом матеріалу.

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

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


3
@ kizzx2: не соромтеся підняти чи зняти будь-яку іншу мою відповідь [PDF] або [Ghostscript] :-)
Kurt Pfeifle

Якщо ви перебуваєте на Mac і встановлюєте mupdf з портів (а може бути і з двійкового), вилучення також називається mupdfextract. Ви можете запустити його з терміналу, доки він знаходиться на шляху.
Орвелофіл

@Orwellophile: дякую за підказку. Я скористався цією можливістю оновити деякі свої підказки щодо mupdf. Дивіться також це ...
Курт Пфайфл

Я перевірю їх. І просто це не безглуздий коментар: ваш процес спрацював НАВІДОМО ... (проголосував) ... він вилучив і назвав 3 варіанти шрифту, а потім я використовував fontforge (також вільний від макпортів) для злиття. На жаль, у моєму шрифті досі відсутня
велика

1
@Chris: так, це два різних підмножини (які можуть перетинатися навіть у величезній частині). Немає можливості автоматичного їх злиття.
Курт Пфайфл

27

Використовуйте Інтернет-сервіс http://www.extractpdf.com . Не потрібно нічого встановлювати.


У моєму випадку він міг витягувати лише шрифти типу 1, а не TrueType
koppor

Я вилучив шрифти за допомогою цього веб-сайту і скопіював його на ~/.fonts, і копія та вставка працювала!
Едуардо Сантана



3

Незважаючи на те, що цьому питанню 10 років, воно все ще є дійсним, і коли технології змінюються, це робить і вагомий відповідь.

Під час пошуку поточних відповідей жоден із них не відзначає WOFF (Web Open Font Format) ( W3C ) ( Wikipedia ), який можна використовувати для відтворення окремих символів (гліфів) та відображення їх на веб-сторінці точно.

Використовуючи безкоштовну веб-сторінку IDR Solutions, PDF у HTML5 ( посилання ), конвертуйте PDF у поштовий файл. У отриманому zip буде каталог шрифтів типів файлів woff. Поточні веб-браузери підтримують файли woff, якщо ви не знали про це. ( довідка ) Їх можна ознайомити на веб-сайті FontDrop! ( посилання ).

Файли WOFF можна конвертувати в / з OTF або TTF на WOFFer - конвертер шрифтів WOFF

Також zip-файл від PDF до HTML5 міститиме HTML-файл для кожної сторінки PDF, який можна відкрити в Інтернет-браузері і є одним з найкращих та найточніших перекладів PDF, які я знайшов чи побачив.

Хоча я лише вчусь використовувати файли WOFF, це варто пройти далі. Насолоджуйтесь.

PS, я, мабуть, оновлю додаткову інформацію, оскільки я дізнаюся більше про використання типів файлів woff, але оскільки це творчі спільноти, сміливо відредагуйте цю відповідь, якщо у вас є щось цінне для передачі.


Дякую! Це рішення працює для мене (як і при створенні дійсного TTF), тоді як інші, які я намагався, не роблять. Це тому, що WOFF краще обробляє неповні шрифти?
Даан

@Daan Is it because WOFF handles incomplete fonts better?Я поняття не маю. Ваша здогадка була б такою ж доброю міною. Як я зазначив, я просто дізнаюся про WOFF сам.
Гай Кодер

@Daan Можливо, ви повинні поставити Is it because WOFF handles incomplete fonts better?як нове запитання про те, і інші, хто має більше знань, побачать і, сподіваємось, дадуть змістовну відповідь.
Гай Кодер

Я можу це зробити. Дякую.
Даан

2

PDF2SVG версії 6.0 від PDFTron робить розумну роботу. За .otfзамовчуванням він створює шрифти OpenType ( ). Використовуйте --preserve_fontnamesдля збереження "схеми імен шрифту / сім'ї шрифтів, отриманої з вихідного файлу."

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


На жаль --preserve_fontnames, не працює, якщо у вас є шрифти, що перекриваються, часткові шрифти - здається, вони не містять префікса, наприклад, MSCIYGв MSCIYG+Ge'ez-1, тому перезаписуються попередні партії.
Кріс


0

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

  1. Після відкриття PDF-файлу та вибору потрібного шрифту вам потрібно вибрати опцію "Файл -> Створити шрифти ...".
  2. Якщо у файлі є помилки, ви можете ігнорувати їх або зберегти файл та відредагувати їх. Більшість помилок можна виправити автоматично, якщо достатньо разів натиснути "Виправити".
  3. Клацніть "Елемент -> Інформація про шрифт ...", а "Ім'я шрифту", "Прізвище" та "Ім'я для людей" встановлені у значення, яке вам подобається. Якщо ні, змініть їх і збережіть файл кудись. Ці назви визначатимуть, як ваш шрифт відображатиметься в системі.
  4. Виберіть ім'я файлу та натисніть "Зберегти ..."

Щойно у вас є файл TTF, ви можете встановити його у вашій системі

  1. Копіюючи його в папку /usr/share/fonts(як root)
  2. Запуск fc-cache -f /usr/share/fonts/(як корінь)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.