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


161

Sono a conoscenza del pdftk.exe dell'utilità che può indicare quali caratteri sono utilizzati da un PDF e se sono incorporati o meno.

Ora il problema: dato che avevo file PDF con caratteri incorporati - come posso estrarli in modo che siano riutilizzabili come normali file di caratteri? Ci sono strumenti (preferibilmente gratuiti) che possono farlo? Inoltre: questo può essere fatto a livello di programmazione con, diciamo, iText?

Risposte:


405

Hai diverse opzioni. Tutti questi metodi funzionano su Linux, nonché su Windows o Mac OS X. Tuttavia, tenere presente che la maggior parte dei PDF non include un font completo e completo quando hanno un font incorporato. Principalmente includono solo il sottoinsieme di glifi utilizzati nel documento.


utilizzando pdftops

Uno dei metodi più utilizzati per eseguire questa operazione sui sistemi * nix è costituito dai seguenti passaggi:

  1. Converti il ​​PDF in PostScript, ad esempio utilizzando XPDF pdftops(su Windows:pdftops.exe programma di supporto.
  2. Ora i caratteri saranno incorporati nel .pfaformato (PostScript) + puoi estrarli usando un editor di testo .
  3. Potrebbe essere necessario convertire .pfa(ASCII) in un .pfbfile (binario) utilizzando t1utilsepfa2pfb .
  4. Nei PDF non ci sono mai .pfmo .afmfile (file metrici di font) incorporati (perché il visualizzatore PDF ne ha una conoscenza interna). Senza questi, i file dei caratteri sono difficilmente utilizzabili in modo visivamente piacevole.

utilizzando fontforge

Un altro metodo consiste nell'utilizzare l'editor di font gratuito FontForge :

  1. Utilizzare la finestra di dialogo "Apri carattere" utilizzata per aprire i file.
  2. Quindi seleziona "Estrai da PDF" nella sezione filtro della finestra di dialogo.
  3. Seleziona il file PDF con il carattere da estrarre.
  4. Viene visualizzata la finestra di dialogo "Scegli un carattere" : seleziona qui il tipo di carattere da aprire.

Controlla il manuale di FontForge. Potrebbe essere necessario seguire alcuni passaggi specifici che non sono necessariamente semplici per salvare i dati dei caratteri estratti come file riutilizzabili.


utilizzando mupdf

Successivamente, MuPDF . Questa applicazione viene fornita con un'utilità chiamata pdfextract(su Windows pdfextract.exe:) in grado di estrarre caratteri e immagini dai PDF. (Nel caso in cui non si conosca MuPDF, che è ancora relativamente sconosciuto e nuovo: "MuPDF è un visualizzatore di PDF leggero gratuito e toolkit scritto in C. portatile" , scritto dagli sviluppatori 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 "estratto di mutool" . Scaricalo qui: mupdf.com/downloads )

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

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

Questo comando scaricherà tutti i file estraibili dal file pdf a cui si fa riferimento nella directory corrente. Generalmente vedrai una varietà di file: immagini e caratteri. Questi includono PNG, TTF, CFF, CID, ecc. I nomi delle immagini saranno come img-0412.png se il numero di oggetto PDF dell'immagine era 412. I nomi dei caratteri saranno come FGETYK + LinLibertineI-0966.ttf , se il carattere è Il numero oggetto 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 per l'uso su diversi sistemi operativi.

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

Aggiornamento: (luglio 2013) Le versioni recenti di mupdfhanno visto un rimpasto interno e la ridenominazione dei loro binari, non solo una volta, ma più volte. L'utilità principale era un binario simile a un "coltellino svizzero" chiamato mubusy(nome ispirato a busybox?), Che più recentemente è stato rinominato mutool. Questi supportano i comandi secondari info, clean, extract, postere show. Sfortunatamente, la documentazione ufficiale per questi strumenti non è aggiornata (ancora). Se sei su un Mac con "MacPorts": l'utilità è stata rinominata per evitare conflitti di nomi con altre utilità che utilizzano nomi identici e potrebbe essere necessario utilizzarla mupdfextract.

Per ottenere risultati (approssimativamente) equivalenti a mutoolquelli del suo strumento precedente pdfextract, basta eseguire mubusy extract .... *

Quindi, per estrarre caratteri e immagini, potrebbe essere necessario eseguire una delle seguenti linee 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


Utilizzo di gs(Ghostscript)

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

Ora usalo, devi eseguire sia questo file extractFonts.psche il tuo file PDF. Ghostscript utilizzerà quindi le istruzioni del programma PostScript per estrarre i caratteri dal PDF. Sembra così su Windows (sì, Ghostscript capisce la "barra", /, 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 carattere e, in tal caso, in modo riutilizzabile. Non so se l'utilità blocca l'estrazione di caratteri contrassegnati come protetti.


utilizzando pdf-parser.py

Infine, il pdf-parser.py di Didier Stevens : questo probabilmente non è così facile da usare, perché è necessario avere un po 'di conoscenza delle 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 anche estrarre file di caratteri incorporati.

Ma devi sapere cosa cercare. Vediamolo con un esempio. Ho un file chiamato big.pdf . Come primo passo uso il -sparametro per cercare nel PDF qualsiasi occorrenza della parola chiave FontFile ( pdf-parser.pynon richiede una ricerca con distinzione tra maiuscole e minuscole):

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 istanze FontFile2all'interno del PDF, e queste sono negli oggetti PDF no. 15 e n. 16, rispettivamente. Oggetto n. 15 contiene il /FontFile2carattere / ArialMT , l'oggetto n. 16 contiene il /FontFile2carattere for / Arial-BoldMT .

Per mostrarlo più chiaramente:

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

Una rapida occhiata alla specifica PDF rivela che la parola chiave si /FontFile2riferisce a uno "stream contenente un programma di font TrueType" ( /FontFilesi riferisce a uno "stream contenente un programma di font di tipo 1" e /FontFile3si riferisce a uno "stream contenente un programma di font il cui formato è specificato dalla voce Sottotipo nel dizionario di flusso " {quindi essere un sottotipo Type1C o CIDFontType0C }.)

Per esaminare specificamente l'oggetto PDF n. 15 (che contiene il carattere / ArialMT ), si può usare il -o 15parametro:

pdf-parser.py -o 15 big1.pdf

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

Questo pdf-parser.py output ci dice che questo oggetto contiene un flusso (che non visualizzerà 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 /ASCIIHexDecodefiltro standard .

Per scaricare qualsiasi flusso da un oggetto, è pdf-parser.pypossibile chiamare con il -d dumpnameparametro 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, è 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 è costituito da dati con codifica esadecimale ASCII.

L'apertura del file con uno strumento di lettura dei caratteri come otfinfo(questa è una parte del lcdf-typetoolspacchetto ) all'inizio porterà un po 'di delusione:

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

OK, questo perché non abbiamo (ancora) pdf-parser.pysfruttato tutta la sua magia: scaricare un flusso filtrato e decodificato. Per questo dobbiamo aggiungere il -fparametro:

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: quel numero esatto era già stato memorizzato nell'oggetto PDF no. 15 dizionario come valore per la chiave /Length1...

Cosa filepensa che sia?

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

Cosa otfinfoci dice 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: abbiamo pdf-parser.pydavvero estratto un file di font valido per noi. Date le dimensioni di questo file (778.552 byte), sembra che questo carattere 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 per font non consentono l'uso e / o la distribuzione gratuiti. La pirateria dei caratteri è come la pirateria di qualsiasi software o altro materiale protetto da copyright.

  • La maggior parte dei PDF in circolazione non incorpora comunque il carattere completo, ma solo i sottoinsiemi. L'estrazione di un sottoinsieme di un carattere è utile solo in un ambito molto limitato, se non del tutto.

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


3
@ kizzx2: sentiti libero di votare o sottovalutare qualsiasi altra mia risposta [PDF] o [Ghostscript] :-)
Kurt Pfeifle,

Se sei su Mac e installi mupdf dalle porte (o forse anche dai file binari), anche l'estrazione si chiama mupdfextract. Puoi eseguirlo dal terminale, purché sia ​​nel percorso.
Orwellophile,

@Orwellophile: grazie per il suggerimento. Ho colto l'occasione per aggiornare alcuni dei miei suggerimenti mupdf. Vedi anche questo ...
Kurt Pfeifle,

Li controllerò. E proprio così questo non è un commento inutile: il tuo processo ha funzionato FANTASTICO ... (votato) ... ha estratto e denominato 3 varianti del carattere, e quindi ho usato fontforge (anche privo di macport) per unire. Sfortunatamente al mio carattere manca ancora la lettera maiuscola "X" ... Quali sono le probabilità: p
Orwellophile,

1
@Chris: sì, si tratta di due sottoinsiemi diversi (che possono sovrapporsi anche in una parte enorme). Non esiste alcuna opzione per unirli automaticamente.
Kurt Pfeifle,




3

Anche se questa domanda ha 10 anni, è ancora valida e, poiché la tecnologia cambia, anche una risposta valida.

Nella ricerca delle risposte correnti, nessuno di loro ha notato WOFF (Web Open Font Format) ( W3C ) ( Wikipedia ) che può essere utilizzato per ricreare i singoli caratteri (glifi) e visualizzarli in una pagina Web in modo accurato.

Utilizzando la pagina Web online gratuita di IDR Solutions, da PDF a HTML5 ( collegamento ), converti un PDF in un file zip. Nella zip risultante sarà presente una directory di caratteri dei tipi di file woff. I browser Internet correnti supportano i file woff se non si era a conoscenza. ( riferimento ) Questi possono essere esaminati sul sito online FontDrop! ( link ).

I file WOFF possono essere convertiti in / da OTF o TTF sul convertitore di caratteri WOFFer - WOFF

Inoltre, il file zip da PDF a HTML5 conterrà un file HTML per ogni pagina del PDF che può essere aperto in un browser Internet ed è una delle migliori e più accurate traduzioni PDF che ho trovato o visto.

Mentre sto solo imparando come usare i file WOFF, vale la pena passarci sopra. Godere.

PS, probabilmente aggiornerò con maggiori informazioni man mano che imparerò di più sull'uso dei tipi di file woff, ma poiché si tratta di beni comuni creativi, sentiti libero di modificare questa risposta se hai qualcosa di valore da trasmettere.


Grazie! Questa soluzione funziona per me (come nella creazione di un TTF valido) mentre gli altri che ho provato non lo fanno. È perché WOFF gestisce meglio i caratteri incompleti?
Daan,

@Daan Is it because WOFF handles incomplete fonts better?non ne ho idea. La tua ipotesi sarebbe buona come una miniera. Come ho notato, sto solo imparando a conoscere WOFF da solo.
Guy Coder

@Daan Forse dovresti pubblicare Is it because WOFF handles incomplete fonts better?come una nuova domanda SO e altri con più conoscenza vedranno e speriamo di fornire una risposta significativa.
Guy Coder

Potrei farlo. Grazie.
Daan,

2

PDF2SVG versione 6.0 da PDFTron fa un lavoro ragionevole. Produce caratteri OpenType ( .otf) per impostazione predefinita. Utilizzare --preserve_fontnamesper conservare "lo schema di denominazione font / font-family come ottenuto dal file di origine".

PDF2SVG è un prodotto commerciale, ma è possibile scaricare un eseguibile demo gratuito (che include filigrane sull'output SVG ma non limita altrimenti l'utilizzo). Potrebbero esserci altri prodotti PDFTron che estraggono anche i caratteri, ma ho scoperto PDF2SVG solo di recente.


Sfortunatamente --preserve_fontnamesnon funziona se hai caratteri parziali sovrapposti - sembra non includere il prefisso, ad esempio, MSCIYGin MSCIYG+Ge'ez-1, quindi sovrascrive i parziali precedenti.
Chris,


0

Questo è il seguito della font-forgesezione della risposta di @Kurt Pfeifle , specifica di Red Hat (e possibilmente di altre distro Linux).

  1. Dopo aver aperto il PDF e aver selezionato il carattere desiderato, dovrai selezionare l'opzione "File -> Genera caratteri ...".
  2. Se sono presenti errori nel file, è possibile scegliere di ignorarli o salvare il file e modificarli. La maggior parte degli errori può essere corretta automaticamente facendo clic su "Correggi" abbastanza volte.
  3. Fai clic su "Elemento -> Informazioni carattere ...", e "Nome carattere", "Nome famiglia" e "Nome per gli umani" sono tutti impostati sui valori che ti piacciono. In caso contrario, modificarli e salvare il file da qualche parte. Questi nomi determineranno come il tuo carattere appare sul sistema.
  4. Seleziona il nome del tuo file e fai clic su "Salva ..."

Una volta che hai il tuo file TTF, puoi installarlo sul tuo sistema da

  1. Copia nella cartella /usr/share/fonts(come root)
  2. In esecuzione fc-cache -f /usr/share/fonts/(come root)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.