Come posso estrarre i font incorporati da un PDF come file font validi?

Sono a conoscenza dell’utilità pdftk.exe che può indicare quali tipi di carattere vengono utilizzati da un PDF e se sono incorporati o meno.

Ora il problema: dato che avevo i file PDF con caratteri incorporati – come posso estrarre quei font in modo che siano riutilizzabili come normali file di font? Ci sono strumenti (preferibilmente gratuiti) che possono farlo? Inoltre: può essere fatto a livello di programmazione con, per esempio, iText?

Hai diverse opzioni. Tutti questi metodi funzionano su Linux e su Windows o Mac OS X. Tuttavia, si tenga presente che la maggior parte dei PDF non include la font completa completa quando hanno un font incorporato. Per lo più includono solo il sottoinsieme di glifi usati nel documento.


Utilizzando pdftops

Uno dei metodi più frequentemente usati per fare ciò su sistemi * nix consiste nei seguenti passaggi:

  1. Convertire il PDF in PostScript, ad esempio utilizzando i pdftops di pdftops (su Windows: programma helper pdftops.exe .
  2. Ora i font saranno incorporati nel formato .pfa (PostScript) + puoi estrarli usando un editor di testo .
  3. Potrebbe essere necessario convertire il file .pfa (ASCII) in un file .pfb (binario) usando t1utils e pfa2pfb .
  4. Nei PDF non ci sono mai file .pfm o .afm (file di metrica dei caratteri) incorporati (perché il visualizzatore PDF ha una conoscenza interna di questi). Senza questi, i file dei font sono difficilmente utilizzabili visivamente.

Utilizzando fontforge

Un altro metodo è usare l’editor di font gratuito FontForge :

  1. Usa la finestra di dialogo “Apri carattere” usata quando apri i file.
  2. Quindi seleziona “Estrai da PDF” nella sezione del filtro della finestra di dialogo.
  3. Seleziona il file PDF con il carattere da estrarre.
  4. Si apre una finestra di dialogo “Scegli un font” – seleziona qui quale font aprire.

Controlla il manuale di FontForge. Potrebbe essere necessario seguire alcuni passaggi specifici che non sono necessariamente semplici per salvare i dati del font estratto come un file che è riutilizzabile.


Utilizzando mupdf

Successivamente, MuPDF . Questa applicazione viene fornita con un’utilità chiamata pdfextract (su Windows: pdfextract.exe ) che può estrarre font e immagini dai PDF. (Nel caso in cui non si sappia su MuPDF, che è ancora relativamente sconosciuto e nuovo: “MuPDF è un visualizzatore di PDF leggero gratuito e toolkit scritto in portatile C.” , scritto dagli sviluppatori di Artifex Software, la stessa società che ci ha fornito Ghostscript. )
( Aggiornamento: le versioni più recenti di MuPDF hanno spostato la precedente funzionalità di “pdfextract” al comando “mutool extract” . Scaricalo qui: mupdf.com/downloads )

Nota: pdfextract.exe è un programma da riga di comando. Per usarlo, fai quanto segue:

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

Questo comando eseguirà il dump di tutti i file estraibili dal file pdf a cui fa riferimento la directory corrente. Generalmente vedrai una varietà di file: immagini e font. Questi includono PNG, TTF, CFF, CID, ecc. I nomi delle immagini saranno come img-0412.png se il numero dell’object PDF dell’immagine era 412. I fontname saranno come FGETYK + LinLibertineI-0966.ttf , se il font è Il numero di object PDF era 966.

I file CFF ( Compact Font Format ) sono un formato riconosciuto che può essere convertito in altri formati tramite una varietà di convertitori da utilizzare su diversi sistemi operativi.

Ancora una volta: essere consapevoli del fatto che la maggior parte di questi file di font può avere solo un sottoinsieme di caratteri e potrebbe non rappresentare il carattere tipografico completo.

Aggiornamento: (luglio 2013) Le versioni recenti di mupdf hanno visto un rimpasto e una modifica interna dei binari, non solo una volta, ma diverse volte. L’utilità principale era un binario simile a “coltello svizzero” chiamato mubusy (nome ispirato a busybox?), Che più recentemente è stato rinominato in mutool . Questi supportano i sottocomandi info , clean , extract , poster e show . Sfortunatamente, la documentazione ufficiale di questi strumenti non è ancora aggiornata. Se si utilizza un Mac con ‘MacPorts’: l’utilità è stata rinominata per evitare conflitti di nomi con altre utilità che utilizzano nomi identici e potrebbe essere necessario utilizzare mupdfextract .

Per ottenere i risultati (approssimativamente) equivalenti con mutool come ha fatto lo strumento precedente pdfextract , basta eseguire mubusy extract ... *

Quindi, per estrarre font e immagini, potrebbe essere necessario eseguire una delle seguenti righe di comando:

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

I download sono qui: mupdf.com/downloads


Usare gs (Ghostscript)

Quindi, Ghostscript può anche estrarre i font direttamente dai PDF. Tuttavia, ha bisogno dell’aiuto di un programma di utilità speciale denominato extractFonts.ps , scritto in linguaggio PostScript, disponibile dal repository del codice sorgente Ghostscript .

Ora extractFonts.ps , devi eseguire entrambi, questo file extractFonts.ps e il tuo file PDF. Ghostscript utilizzerà quindi le istruzioni del programma PostScript per estrarre i caratteri dal PDF. Assomiglia a questo su Windows (sì, Ghostscript capisce la ‘barra in avanti’, /, come separatore di percorso anche su Windows!):

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

o su Linux, Unix o Mac OS X:

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

Ho provato il metodo Ghostscript alcuni anni fa. Al momento ha estratto * .ttf (TrueType) bene. Non so se verranno estratti anche altri tipi di font, e in tal caso, in un modo riutilizzabile. Non so se l’utility blocca l’estrazione di caratteri che sono contrassegnati come protetti.


Utilizzando pdf-parser.py

Infine, pdf-parser.py di Didier Stevens: probabilmente non è così facile da usare, perché è necessario disporre di un certo know-how sulle strutture PDF interne. pdf-parser.py è uno script Python che può fare anche molte altre cose. Può anche decomprimere ed estrarre flussi arbitrari dagli oggetti, e quindi può estrarre anche i file di font incorporati.

Ma devi sapere cosa cercare. Vediamolo con un esempio. Ho un file chiamato big.pdf . Come primo passo, utilizzo il parametro -s per cercare nel PDF qualsiasi occorrenza della parola chiave FontFile ( pdf-parser.py non richiede una ricerca sensibile al maiuscolo / minuscolo):

 pdf-parser.py -s fontfile big.pdf 

Nel mio caso, per il mio big1.pdf , ottengo questo risultato:

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

Mi dice che ci sono due casi di FontFile2 all’interno del PDF, e questi sono in oggetti PDF no. 15 e n. 16, rispettivamente. Oggetto n. 15 contiene /FontFile2 per font / ArialMT , object n. 16 contiene /FontFile2 per font / Arial-BoldMT .

Per mostrare questo più chiaramente:

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

Un rapido sbirciare nelle specifiche PDF rivela che la parola chiave /FontFile2 riferisce a un ‘stream contenente un programma di font TrueType’ ( /FontFile si riferisce a un ‘stream contenente un programma font Type 1’ e /FontFile3 si riferisce a un ‘stream contenente un programma di font il cui formato è specificato dalla voce Sottotipo nel dizionario di stream ‘ {quindi essere un sottotipo Type1C o CIDFontType0C }.)

Per guardare in particolare l’object PDF n. 15 (che contiene il font / ArialMT ), si può usare il parametro -o 15 :

 pdf-parser.py -o 15 big1.pdf obj 15 0 Type: Referencing: Contains stream << /Length1 778552 /Length 1581435 /Filter /ASCIIHexDecode >> 

Questo output pdf-parser.py ci dice che questo object contiene uno stream (che non verrà visualizzato direttamente) che ha una lunghezza di 1.581.435 byte ed è codificato (== “compresso”) con ASCIIHexEncode e deve essere decodificato ( == “de-compresso” o “filtrato”) con l’aiuto del filtro standard /ASCIIHexDecode .

Per scaricare un stream da un object, pdf-parser.py può essere chiamato con il parametro -d dumpname . Facciamolo:

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

Il nostro dump di dati estratto sarà nel file denominato dumped-data.ext . Vediamo quanto è grande:

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

Oh guarda, sono 1.581.435 byte. Abbiamo visto questa figura nell’output del comando precedente. L’apertura di questo file con un editor di testo conferma che il suo contenuto è ASCII dati codificati esadecimali.

L’apertura del file con uno strumento di lettura dei font come otfinfo (questa è una parte del pacchetto lcdf-typetools ) porterà inizialmente ad alcune delusioni:

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

OK, questo perché non abbiamo (ancora) permesso a pdf-parser.py sfruttare appieno la sua magia: scaricare un stream filtrato, decodificato. Per questo dobbiamo aggiungere il parametro -f :

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

Qual è la dimensione di questo nuovo file?

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

Oh, guarda: anche il numero esatto era già stato memorizzato nell’object PDF n. 15 dizionario come valore per key /Length1

Cosa pensa che sia il file ?

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

Cosa ci dice otfinfo a riguardo?

 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 

Quindi, Bingo !, abbiamo un vincitore: pdf-parser.py ha effettivamente estratto un file di font valido per noi. Data la dimensione di questo file (778.552 byte), sembra che questo font sia stato incorporato anche completamente nel PDF …

Potremmo rinominarlo in arial-regular.ttf e installarlo come tale e utilizzarlo felicemente.


Avvertenze:

  • In ogni caso è necessario seguire la licenza che si applica al carattere. Alcune licenze di font non consentono l’uso e / o la distribuzione gratuiti. I font pirata sono come piratare qualsiasi software o altro materiale protetto da copyright.

  • La maggior parte dei PDF che si trovano in natura non includono comunque il font completo, ma solo i sottoinsiemi. Estrarre un sottoinsieme di un font è utile solo in un ambito molto limitato, se non del tutto.

Si prega di leggere anche quanto segue su Pro e (più) Contro per quanto riguarda gli sforzi di estrazione dei caratteri:

Utilizzare il servizio online http://www.extractpdf.com . Non c’è bisogno di installare nulla.

Alla fine trovato il pacchetto di installazione di FontForge per Windows e aperto il PDF attraverso il programma installato. Ha funzionato a meraviglia, così felice.

http://www.verypdf.com/app/pdf-font-extractor/pdf-font-extracting-tool.html IMO modo più semplice per estrarre i caratteri (Windows).

PDF2SVG versione 6.0 da PDFTron fa un lavoro ragionevole. Produce i font OpenType ( .otf ) per impostazione predefinita. Usa --preserve_fontnames per conservare “lo schema di denominazione font / font-family come ottenuto dal file sorgente.”

PDF2SVG è un prodotto commerciale, ma è ansible scaricare un file demo gratuito (che include filigrane sull’output SVG ma non limita in altro modo l’utilizzo). Potrebbero esserci altri prodotti PDFTron che estraggono anche caratteri, ma ho scoperto da solo PDF2SVG da solo.

Uno dei migliori strumenti online attualmente disponibili per estrarre i font pdf è http://www.pdfconvertonline.com/extract-pdf-fonts-online.html