Jak mogę wyodrębnić osadzone czcionki z pliku PDF jako prawidłowe pliki czcionek?


161

Zdaję sobie sprawę z pdftk.exenarzędzia, które może wskazać, które czcionki są używane w pliku PDF i czy są osadzone, czy nie.

Teraz problem: biorąc pod uwagę, że miałem pliki PDF z osadzonymi czcionkami - jak mogę wyodrębnić te czcionki w taki sposób, aby można je było ponownie wykorzystać jako zwykłe pliki czcionek? Czy istnieją (najlepiej darmowe) narzędzia, które mogą to zrobić? Ponadto: czy można to zrobić programowo za pomocą, powiedzmy, iText?

Odpowiedzi:


405

Masz kilka opcji. Wszystkie te metody działają w systemie Linux, a także w systemie Windows lub Mac OS X. Należy jednak pamiętać, że większość plików PDF nie zawiera pełnej, pełnej czcionki, gdy jest ona osadzona. Przeważnie zawierają tylko podzbiór glifów używanych w dokumencie.


Za pomocą pdftops

Jedna z najczęściej używanych metod w tym celu w systemach * nix składa się z następujących kroków:

  1. Przekonwertuj plik PDF na PostScript, na przykład za pomocą XPDF pdftops(w systemie Windows: pdftops.exeprogram pomocniczy.
  2. Teraz czcionki zostaną osadzone w .pfaformacie (PostScript) + możesz je wyodrębnić za pomocą edytora tekstu .
  3. Może być konieczne przekonwertowanie .pfa(ASCII) na plik .pfb(binarny) przy użyciu t1utilsi pfa2pfb.
  4. W plikach PDF nigdy nie są osadzane pliki .pfmlub .afm(pliki metryczne czcionek) (ponieważ przeglądarka PDF ma wewnętrzną wiedzę na ten temat). Bez nich pliki czcionek nie byłyby możliwe do wykorzystania w przyjemny wizualnie sposób.

Za pomocą fontforge

Inną metodą jest użycie darmowego edytora czcionek FontForge :

  1. Użyj okna dialogowego „Otwórz czcionkę” używanego podczas otwierania plików.
  2. Następnie wybierz „Wyodrębnij z PDF” w sekcji filtrów okna dialogowego.
  3. Wybierz plik PDF zawierający czcionkę do wyodrębnienia.
  4. „Wybierz czcionkę” DialogBox otwiera - wybierz czcionki, które tutaj, aby otworzyć.

Sprawdź podręcznik FontForge. Może być konieczne wykonanie kilku określonych kroków, które niekoniecznie są proste, aby zapisać wyodrębnione dane czcionek jako plik, który można ponownie wykorzystać.


Za pomocą mupdf

Następnie MuPDF . Ta aplikacja jest dostarczana z narzędziem o nazwie pdfextract(w systemie Windows pdfextract.exe:), które może wyodrębniać czcionki i obrazy z plików PDF. (Jeśli nie wiesz o MuPDF, który wciąż jest stosunkowo nieznany i nowy: „MuPDF to darmowa, lekka przeglądarka plików PDF i zestaw narzędzi napisany w przenośnym C.” , napisany przez programistów Artifex Software, tę samą firmę, która dała nam Ghostscript. )
( Aktualizacja: nowsze wersje MuPDF przeniosły poprzednią funkcjonalność „pdfextract” do polecenia „mutool extract” . Pobierz je tutaj: mupdf.com/downloads )

Uwaga: pdfextract.exeto program wiersza poleceń. Aby go użyć, wykonaj następujące czynności:

c:\>  pdfextract.exe  c:\path\to\filename.pdf         # (on Windows)
$>    pdfextract  /path/tofilename.pdf                # (on Linux, Unix, Mac OS X)

To polecenie zrzuci wszystkie możliwe do wyodrębnienia pliki z pliku pdf, do którego się odwołuje, do bieżącego katalogu. Zwykle zobaczysz różne pliki: obrazy i czcionki. Należą do nich PNG, TTF, CFF, CID itp. Nazwy obrazów będą wyglądać jak img-0412.png, jeśli numer obiektu PDF obrazu to 412. Nazwy czcionek będą wyglądać jak FGETYK + LinLibertineI-0966.ttf , jeśli Numer obiektu PDF to 966.

Pliki CFF ( Compact Font Format ) to rozpoznawany format, który można konwertować na inne formaty za pomocą różnych konwerterów do użytku w różnych systemach operacyjnych.

Ponownie: pamiętaj, że większość tych plików czcionek może zawierać tylko podzbiór znaków i mogą nie reprezentować pełnego kroju pisma.

Aktualizacja: (lipiec 2013 r.) W ostatnich wersjach programu mupdfdokonano wewnętrznych przetasowań i zmian nazw plików binarnych, nie tylko raz, ale kilka razy. Głównym narzędziem był kiedyś plik binarny podobny do `` szwajcarskiego noża '' mubusy(nazwa inspirowana busyboxem?), Który niedawno został przemianowany na mutool. Te potwierdzają podkomendy info, clean, extract, posteri show. Niestety, oficjalna dokumentacja tych narzędzi nie jest (jeszcze) aktualna. Jeśli używasz komputera Mac z „MacPorts”: nazwa narzędzia została zmieniona, aby uniknąć kolizji nazw z innymi narzędziami używającymi identycznych nazw i może być konieczne użycie mupdfextract.

Aby uzyskać (z grubsza) równoważne wyniki, mutooljak w przypadku poprzedniego narzędzia pdfextract, po prostu uruchom mubusy extract .... *

Aby wyodrębnić czcionki i obrazy, może być konieczne uruchomienie jednego z następujących poleceń:

c:\>  mutool.exe extract filename.pdf      # (on Windows)
$>    mutool     extract filename.pdf      # (on Linux, Unix, Mac OS X)

Pliki do pobrania są tutaj: mupdf.com/downloads


Korzystanie z gs(Ghostscript)

Następnie Ghostscript może również wyodrębniać czcionki bezpośrednio z plików PDF. Potrzebuje jednak pomocy specjalnego programu narzędziowego o nazwie extractFonts.ps, napisanego w języku PostScript, który jest dostępny w repozytorium kodu źródłowego Ghostscript .

Teraz użyj go, musisz uruchomić zarówno ten plik, jak extractFonts.psi plik PDF. Ghostscript użyje wtedy instrukcji programu PostScript, aby wyodrębnić czcionki z pliku PDF. W systemie Windows wygląda to tak (tak, Ghostscript rozumie 'ukośnik', /, jako separator ścieżki również w systemie Windows!):

gswin32c.exe                  ^
  -q -dNODISPLAY              ^
   c:/path/to/extractFonts.ps ^
  -c "(c:/path/to/your/PDFFile.pdf) extractFonts quit"

lub w systemie Linux, Unix lub Mac OS X:

gs                          \
  -q -dNODISPLAY            \
   /path/to/extractFonts.ps \
  -c "(/path/to/your/PDFFile.pdf) extractFonts quit"

Testowałem metodę Ghostscript kilka lat temu. W tym czasie wyodrębnił * .ttf (TrueType) dobrze. Nie wiem, czy inne typy czcionek również zostaną w ogóle wyodrębnione, a jeśli tak, to w sposób umożliwiający ich ponowne użycie. Nie wiem, czy narzędzie blokuje wyodrębnianie czcionek oznaczonych jako chronione.


Za pomocą pdf-parser.py

Na koniec pdf-parser.py Didiera Stevensa : ten prawdopodobnie nie jest tak łatwy w użyciu, ponieważ potrzebujesz pewnej wiedzy na temat wewnętrznych struktur PDF. pdf-parser.pyto skrypt w Pythonie, który potrafi też robić wiele innych rzeczy. Może również dekompresować i wyodrębniać dowolne strumienie z obiektów, a zatem może również wyodrębniać osadzone pliki czcionek.

Ale musisz wiedzieć, czego szukać. Zobaczmy to na przykładzie. Mam plik o nazwie big.pdf . Jako pierwszy krok używam -sparametru do wyszukiwania w pliku PDF dowolnego wystąpienia słowa kluczowego FontFile ( pdf-parser.pynie wymaga wyszukiwania z uwzględnieniem wielkości liter):

pdf-parser.py -s fontfile big.pdf

W moim przypadku dla mojego big1.pdf otrzymuję taki wynik:

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
  >>   

Mówi mi, że istnieją dwa wystąpienia FontFile2wewnątrz pliku PDF i są to obiekty PDF nr. 15 i nie. 16, odpowiednio. Obiekt nr 15 zawiera /FontFile2for font / ArialMT , obiekt nr. 16 zawiera /FontFile2for font / Arial-BoldMT .

Aby to wyraźniej pokazać:

pdf-parser.py -s fontfile big1.pdf | grep -i fontfile
  /FontFile2 15 0 R
  /FontFile2 16 0 R

Szybkie zajrzenie do specyfikacji PDF ujawnia, że ​​słowo kluczowe /FontFile2odnosi się do `` strumienia zawierającego program czcionek TrueType '' ( /FontFileodnosiłoby się do `` strumienia zawierającego program czcionek Type 1 '' i /FontFile3odnosiłoby się do `` strumienia zawierającego program czcionek, którego format jest określony przez wpis podtypu w słowniku strumieniowym „ {stąd jest podtypem Type1C lub CIDFontType0C }.)

Aby przyjrzeć się konkretnie obiektowi PDF nr. 15 (który przechowuje czcionkę / ArialMT ), można użyć -o 15parametru:

pdf-parser.py -o 15 big1.pdf

 obj 15 0
  Type: 
  Referencing: 
  Contains stream
   <<
     /Length1 778552
     /Length 1581435
     /Filter /ASCIIHexDecode
   >>

To pdf-parser.pywyjście informuje nas, że ten obiekt zawiera strumień (którego nie będzie bezpośrednio wyświetlać) o długości 1.581.435 bajtów i jest zakodowany (== "skompresowany") za pomocą ASCIIHexEncode i musi zostać zdekodowany (== "de- skompresowany ”lub„ przefiltrowany ”) za pomocą standardowego /ASCIIHexDecodefiltra.

Aby zrzucić dowolny strumień z obiektu, pdf-parser.pymożna wywołać za pomocą -d dumpnameparametru. Zróbmy to:

pdf-parser.py -o 15 -d dumped-data.ext big1.pdf

Nasz wyodrębniony zrzut danych będzie znajdował się w pliku o nazwie dumped-data.ext . Zobaczmy, jakie to jest duże:

ls -l dumped-data.ext
  -rw-r--r--  1 kurtpfeifle  staff  1581435 Apr 11 00:29 dumped-data.ext

Spójrz, to jest 1.581.435 bajtów. Widzieliśmy tę liczbę w danych wyjściowych poprzedniego polecenia. Otwarcie tego pliku w edytorze tekstu potwierdza, że ​​jego zawartość to dane zakodowane szesnastkowo ASCII.

Otwarcie pliku za pomocą narzędzia do czytania czcionek, takiego jak otfinfo(jest to część lcdf-typetoolspakietu ), na początku doprowadzi do pewnego rozczarowania:

otfinfo -i dumped-data.ext
  otfinfo: dumped-data.ext: not an OpenType font (bad magic number)

OK, to dlatego, że nie pozwoliliśmy (jeszcze) pdf-parser.pywykorzystać jego pełnej magii: zrzucić przefiltrowany, zdekodowany strumień. W tym celu musimy dodać -fparametr:

pdf-parser.py -o 15 -f -d dumped-data-decoded.ext big1.pdf

Jaki jest rozmiar tego nowego pliku?

ls -l dumped-data-decoded.ext
  -rw-r--r--  1 kurtpfeifle  staff  778552 Apr 11 00:39 dumped-data-decoded.ext

Och, spójrz: ta dokładna liczba była już zapisana w obiekcie PDF nr. 15 słownik jako wartość klucza /Length1...

Co filemyśli, że to jest?

file dumped-data-decoded.ext
  dumped-data-decoded.ext: TrueType font data

Co otfinfonam o tym mówi?

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

Więc Bingo !, mamy zwycięzcę: pdf-parser.pyrzeczywiście wyodrębniliśmy dla nas prawidłowy plik czcionki. Biorąc pod uwagę rozmiar tego pliku (778,552 bajtów), wygląda na to, że ta czcionka została nawet całkowicie osadzona w pliku PDF ...

Moglibyśmy zmienić jego nazwę na arial-regular.ttf i zainstalować go jako taki i szczęśliwie z niego korzystać.


Ostrzeżenia:

  • W każdym przypadku musisz przestrzegać licencji, która ma zastosowanie do czcionki. Niektóre licencje na czcionki nie pozwalają na bezpłatne używanie i / lub dystrybucję. Piractwo czcionek przypomina piractwo oprogramowania lub innych materiałów chronionych prawem autorskim.

  • Większość dostępnych plików PDF i tak nie zawiera pełnej czcionki, a jedynie podzbiory. Wyodrębnienie podzbioru czcionki jest przydatne tylko w bardzo ograniczonym zakresie, jeśli w ogóle.

Przeczytaj również poniższe informacje o zaletach i (więcej) wadach związanych z wyodrębnianiem czcionek:


3
@ kizzx2: zapraszam do zagłosowania za lub przeciw dowolnej z moich innych odpowiedzi [PDF] lub [Ghostscript] :-)
Kurt Pfeifle

Jeśli jesteś na komputerze Mac i instalujesz mupdf z portów (lub być może także z pliku binarnego), wyodrębnianie również nazywa się mupdfextract. Możesz go uruchomić z terminala, o ile znajduje się na ścieżce.
Orwellophile

@Orwellophile: dzięki za podpowiedź. Wykorzystałem to jako okazję do zaktualizowania niektórych moich wskazówek dotyczących mupdf. Zobacz także to ...
Kurt Pfeifle

Sprawdzę je. I nie jest to bezsensowny komentarz: Twój proces zadziałał NIESAMOWICIE ... (głosowanie w górę) ... wyodrębnił i nazwał 3 odmiany czcionki, a następnie użyłem fontforge (również bez macportów) do scalenia. Niestety w mojej czcionce nadal brakuje
dużej

1
@Chris: tak, to są dwa różne podzbiory (które mogą się nawet pokrywać w dużej części) Nie ma możliwości ich automatycznego scalenia.
Kurt Pfeifle

27

Skorzystaj z usługi online http://www.extractpdf.com . Nie musisz niczego instalować.


W moim przypadku mógł wyodrębnić tylko czcionki Type 1, a nie TrueType
koppor

Wyodrębniłem czcionki za pomocą tej witryny i skopiowałem go pod adresem ~/.fonts, a kopiowanie i wklejanie działało!
Eduardo Santana



3

Chociaż to pytanie ma już 10 lat, jest nadal aktualne, a wraz ze zmianami technologii pojawia się ważna odpowiedź.

Szukając aktualnych odpowiedzi, żaden z nich nie zauważył WOFF (Web Open Font Format) ( W3C ) ( Wikipedia ), który może być użyty do odtworzenia poszczególnych znaków (glifów) i dokładnego wyświetlenia ich na stronie internetowej.

Korzystając z bezpłatnej strony internetowej IDR Solutions, PDF do HTML5 ( link ), przekonwertuj plik PDF na plik zip. W wynikowym pliku zip będzie katalog czcionek typów plików woff. Obecne przeglądarki internetowe obsługują pliki woff, jeśli nie byłeś tego świadomy. ( odniesienie ) Można je sprawdzić na stronie internetowej FontDrop! ( link ).

Pliki WOFF można konwertować do / z OTF lub TTF w konwerterze czcionek WOFFer - WOFF

Również plik zip z PDF na HTML5 będzie zawierał plik HTML dla każdej strony PDF, który można otworzyć w przeglądarce internetowej i jest jednym z najlepszych i najdokładniejszych tłumaczeń PDF, jakie znalazłem lub widziałem.

Chociaż dopiero uczę się obsługi plików WOFF, warto to przekazać. Cieszyć się.

PS, prawdopodobnie zaktualizuję o więcej informacji, gdy dowiem się więcej o używaniu typów plików woff, ale ponieważ jest to Creative Commons, możesz edytować tę odpowiedź, jeśli masz coś wartościowego do przekazania.


Dziękuję Ci! To rozwiązanie działa dla mnie (jak przy tworzeniu prawidłowego TTF), podczas gdy inne, które próbowałem, nie. Czy to dlatego, że WOFF lepiej radzi sobie z niekompletnymi czcionkami?
Daan

@Daan Is it because WOFF handles incomplete fonts better?Nie mam pojęcia. Twoje przypuszczenie byłoby równie dobre jak moje. Jak zauważyłem, sam dopiero uczę się o WOFF.
Guy Coder

@Daan Być może powinieneś opublikować Is it because WOFF handles incomplete fonts better?jako nowe pytanie SO, a inne osoby z większą wiedzą zobaczą i miejmy nadzieję, udzielą sensownej odpowiedzi.
Guy Coder

Mógłbym to zrobić. Dzięki.
Daan

2

PDF2SVG w wersji 6.0 z PDFTron wykonuje całkiem niezłą robotę. .otfDomyślnie tworzy czcionki OpenType ( ). Służy --preserve_fontnamesdo zachowania „schematu nazewnictwa czcionek / rodziny czcionek uzyskanego z pliku źródłowego”.

PDF2SVG jest produktem komercyjnym, ale możesz pobrać darmowy plik wykonywalny demo (który zawiera znaki wodne na wyjściu SVG, ale nie ogranicza w inny sposób użycia). Mogą istnieć inne produkty PDFTron, które również wyodrębniają czcionki, ale dopiero niedawno sam odkryłem PDF2SVG.


Niestety --preserve_fontnamesnie działa, jeśli się pokrywają, częściowe czcionek - wydaje się nie zawierać prefiks, np, tym MSCIYGw MSCIYG+Ge'ez-1tak nadpisuje wcześniejsze partials.
Chris


0

To jest kontynuacja font-forgesekcji odpowiedzi @Kurt Pfeifle , specyficznej dla Red Hata (i prawdopodobnie innych dystrybucji Linuksa).

  1. Po otwarciu pliku PDF i wybraniu żądanej czcionki, będziesz chciał wybrać opcję "Plik -> Generuj czcionki ...".
  2. Jeśli w pliku są błędy, możesz je zignorować lub zapisać plik i edytować. Większość błędów można naprawić automatycznie, jeśli wystarczająco dużo razy klikniesz „Napraw”.
  3. Kliknij „Element -> Informacje o czcionce…”, a „Nazwa czcionki”, „Nazwisko” i „Imię dla ludzi” są ustawione na wartości, które lubisz. Jeśli nie, zmodyfikuj je i zapisz gdzieś plik. Nazwy te określą sposób wyświetlania czcionki w systemie.
  4. Wybierz nazwę pliku i kliknij „Zapisz ...”

Gdy masz już plik TTF, możesz zainstalować go w systemie przez

  1. Kopiowanie go do folderu /usr/share/fonts(jako root)
  2. Działa fc-cache -f /usr/share/fonts/(jako root)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.