¿Cómo puedo extraer fuentes incrustadas de un PDF como archivos de fuente válidos?

161

Soy consciente de la pdftk.exeutilidad que puede indicar qué fuentes utiliza un PDF y si están incrustadas o no.

Ahora el problema: dado que tenía archivos PDF con fuentes incrustadas, ¿cómo puedo extraer esas fuentes de manera que sean reutilizables como archivos de fuentes normales? ¿Existen herramientas (preferiblemente gratuitas) que puedan hacer eso? Además: ¿se puede hacer esto programáticamente con, por ejemplo, iText?

Kurt Pfeifle
fuente

Respuestas:

405

Tienes varias opciones. Todos estos métodos funcionan tanto en Linux como en Windows o Mac OS X. Sin embargo, tenga en cuenta que la mayoría de los PDF no incluyen una fuente completa y completa cuando tienen una fuente incrustada. Principalmente incluyen solo el subconjunto de glifos utilizados en el documento.


Utilizando pdftops

Uno de los métodos más utilizados para hacer esto en los sistemas * nix consta de los siguientes pasos:

  1. Convierta el PDF a PostScript, por ejemplo, utilizando XPDF pdftops(en Windows: pdftops.exeprograma auxiliar.
  2. Ahora las fuentes se incrustarán en .pfaformato (PostScript) + puede extraerlas usando un editor de texto .
  3. Es posible que necesite convertir el .pfa(ASCII) a un .pfbarchivo (binario) con el t1utilsy pfa2pfb.
  4. En archivos PDF nunca hay .pfmo .afmarchivos (archivos de fuentes métricas) embebidos (porque visor de PDF tener un conocimiento interno acerca de estos). Sin estos, los archivos de fuentes son apenas utilizables de una manera visualmente agradable.

Utilizando fontforge

Otro método es utilizar el editor de fuentes gratuito FontForge :

  1. Utilice el cuadro de diálogo "Abrir fuente" que se utiliza al abrir archivos.
  2. Luego seleccione "Extraer de PDF" en la sección de filtro del cuadro de diálogo.
  3. Seleccione el archivo PDF con la fuente que se extraerá.
  4. Se abre un cuadro de diálogo "Elija una fuente" : seleccione aquí qué fuente abrir.

Consulte el manual de FontForge. Es posible que deba seguir algunos pasos específicos que no son necesariamente sencillos para guardar los datos de fuente extraídos como un archivo que se puede reutilizar.


Utilizando mupdf

A continuación, MuPDF . Esta aplicación viene con una utilidad llamada pdfextract(en Windows:) pdfextract.exeque puede extraer fuentes e imágenes de archivos PDF. (En caso de que no conozca MuPDF, que aún es relativamente desconocido y nuevo: "MuPDF es un visor de PDF ligero y gratuito y un kit de herramientas escrito en C portátil" , escrito por los desarrolladores de Artifex Software, la misma compañía que nos dio Ghostscript. )
( Actualización: las versiones más recientes de MuPDF han trasladado la funcionalidad anterior de 'pdfextract' al comando 'mutool extract' . Descárguelo aquí: mupdf.com/downloads )

Nota: pdfextract.exees un programa de línea de comandos. Para usarlo, haga lo siguiente:

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

Este comando volcará todos los archivos extraíbles del archivo pdf referenciado en el directorio actual. En general, verá una variedad de archivos: imágenes y fuentes. Estos incluyen PNG, TTF, CFF, CID, etc. Los nombres de las imágenes serán como img-0412.png si el número de objeto PDF de la imagen era 412. Los nombres de fuente serán como FGETYK + LinLibertineI-0966.ttf , si la fuente es El número de objeto PDF era 966.

Los archivos CFF ( Compact Font Format ) son un formato reconocido que se puede convertir a otros formatos a través de una variedad de convertidores para usar en diferentes sistemas operativos.

Nuevamente: tenga en cuenta que la mayoría de estos archivos de fuentes pueden tener solo un subconjunto de caracteres y pueden no representar el tipo de letra completo.

Actualización: (julio de 2013) Las versiones recientes de mupdfhan visto una reorganización interna y el cambio de nombre de sus archivos binarios, no solo una vez, sino varias veces. La utilidad principal solía ser un binario llamado 'cuchillo suizo' llamado mubusy(nombre inspirado por busybox?), Al que más recientemente se le cambió el nombre mutool. Estos apoyan los sub-comandos info, clean, extract, postery show. Desafortunadamente, la documentación oficial de estas herramientas no está actualizada (todavía). Si está en una Mac usando 'MacPorts': entonces la utilidad fue renombrada para evitar conflictos de nombres con otras utilidades que usan nombres idénticos, y es posible que deba usarla mupdfextract.

Para lograr los resultados (aproximadamente) equivalentes con mutoolsu herramienta anterior pdfextract, simplemente ejecute mubusy extract .... *

Entonces, para extraer fuentes e imágenes, es posible que deba ejecutar una de las siguientes líneas de comando:

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

Las descargas están aquí: mupdf.com/downloads


Usando gs(Ghostscript)

Luego, Ghostscript también puede extraer fuentes directamente de archivos PDF. Sin embargo, necesita la ayuda de un programa de utilidad especial llamado extractFonts.ps, escrito en lenguaje PostScript, que está disponible en el repositorio de código fuente de Ghostscript .

Ahora úselo, necesita ejecutar tanto este archivo extractFonts.pscomo su archivo PDF. Ghostscript luego usará las instrucciones del programa PostScript para extraer las fuentes del PDF. Se ve así en Windows (sí, Ghostscript entiende la 'barra diagonal', /, como un separador de ruta también en Windows):

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

o en Linux, Unix o Mac OS X:

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

Probé el método Ghostscript hace unos años. En ese momento extrajo * .ttf (TrueType) muy bien. No sé si también se extraerán otros tipos de fuente, y si es así, de forma reutilizable. No sé si la utilidad bloquea la extracción de fuentes que están marcadas como protegidas.


Utilizando pdf-parser.py

Finalmente, el pdf-parser.py de Didier Stevens : este probablemente no sea tan fácil de usar, porque necesita tener algunos conocimientos sobre las estructuras internas de PDF. pdf-parser.pyes un script de Python que también puede hacer muchas otras cosas. También puede descomprimir y extraer secuencias arbitrarias de objetos y, por lo tanto, también puede extraer archivos de fuentes incrustados.

Pero necesitas saber qué buscar. Vamos a verlo con un ejemplo. Tengo un archivo llamado big.pdf . Como primer paso, uso el -sparámetro para buscar en el PDF cualquier aparición de la palabra clave FontFile ( pdf-parser.pyno requiere una búsqueda sensible a mayúsculas y minúsculas):

pdf-parser.py -s fontfile big.pdf

En mi caso, para mi big1.pdf , obtengo este resultado:

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

Me dice que hay dos instancias FontFile2dentro del PDF, y estas están en los objetos PDF no. 15 y no. 16, respectivamente. Objeto no. 15 contiene el /FontFile2para fuente / ArialMT , objeto no. 16 contiene el /FontFile2para fuente / Arial-BoldMT .

Para mostrar esto más claramente:

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

Un vistazo rápido a la especificación PDF revela que la palabra clave se /FontFile2relaciona con un 'secuencia que contiene un programa de fuente TrueType' ( /FontFilese relacionaría con una 'secuencia que contiene un programa de fuente Tipo 1' y /FontFile3se relacionaría con una 'secuencia que contiene un programa de fuente cuyo formato es especificado por la entrada Subtipo en el diccionario de flujo ' {por lo tanto, es un subtipo Type1C o CIDFontType0C }.)

Para ver específicamente el objeto PDF no. 15 (que contiene la fuente / ArialMT ), se puede usar el -o 15parámetro:

pdf-parser.py -o 15 big1.pdf

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

Esta pdf-parser.pysalida nos dice que este objeto contiene una secuencia (que no se mostrará directamente) que tiene una longitud de 1.581.435 Bytes y está codificada (== "comprimida") con ASCIIHexEncode y necesita ser decodificada (== "de- comprimido "o" filtrado ") con la ayuda del /ASCIIHexDecodefiltro estándar .

Para volcar cualquier secuencia de un objeto, pdf-parser.pyse puede llamar con el -d dumpnameparámetro Vamos a hacerlo:

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

Nuestro volcado de datos extraídos estará en el archivo llamado dumped-data.ext . Veamos qué tan grande es:

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

Oh mira, es 1.581.435 Bytes. Vimos esta figura en la salida del comando anterior. Abrir este archivo con un editor de texto confirma que su contenido son datos codificados en hexadecimal ASCII.

Abrir el archivo con una herramienta de lectura de fuentes como otfinfo(esto es parte dellcdf-typetools paquete ) provocará cierta decepción al principio:

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

OK, esto se debe a que (todavía) no permitimos pdf-parser.pyutilizar toda su magia: volcar una secuencia filtrada y decodificada. Para esto tenemos que agregar el-f parámetro:

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

¿Cuál es el tamaño de este nuevo archivo?

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

Oh, mira: ese número exacto también ya estaba almacenado en el objeto PDF no. 15 diccionario como valor para la clave /Length1...

¿Qué filecree que es?

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

¿Qué otfinfonos dice al respecto?

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

¡Entonces Bingo !, tenemos un ganador: de pdf-parser.pyhecho, extrajimos un archivo de fuente válido para nosotros. Dado el tamaño de este archivo (778.552 Bytes), parece que esta fuente se ha incrustado incluso completamente en el PDF ...

Podríamos cambiarle el nombre a arial-regular.ttf e instalarlo como tal y felizmente usarlo.


Advertencias:

  • En cualquier caso, debe seguir la licencia que se aplica a la fuente. Algunas licencias de fuentes no permiten el uso y / o distribución gratuitos. Piratear fuentes es como piratear cualquier software u otro material con derechos de autor.

  • La mayoría de los archivos PDF que están en la naturaleza no incrustan la fuente completa de todos modos, sino solo subconjuntos. Extraer un subconjunto de una fuente solo es útil en un ámbito muy limitado, si es que lo hace.

Lea también lo siguiente sobre Pros y (más) Contras con respecto a los esfuerzos de extracción de fuentes:

Kurt Pfeifle
fuente
3
@ kizzx2: siéntase libre de votar hacia arriba o hacia abajo cualquiera de mis otras respuestas [PDF] o [Ghostscript] :-)
Kurt Pfeifle
Si está en Mac e instala mupdf desde los puertos (o quizás también desde el binario), la extracción también se llama mupdfextract. Puede ejecutarlo desde la terminal, siempre que esté en la ruta.
Orwellophile
@Orwellophile: gracias por la pista. Aproveché la oportunidad para actualizar algunos de mis consejos mupdf. Vea también esto ...
Kurt Pfeifle
Los revisaré. Y para que este no sea un comentario inútil: su proceso funcionó de forma INCREÍBLE ... (votó) ... extrajo y nombró 3 variaciones de la fuente, y luego usé fontforge (también libre de macports) para fusionar. Lamentablemente, mi fuente aún no tiene la letra mayúscula "X" ... ¿Cuáles son las probabilidades: p
Orwellophile
1
@ Chris: sí, estos son dos subconjuntos diferentes (que pueden superponerse incluso en una gran parte). No hay ninguna opción para fusionarlos automáticamente.
Kurt Pfeifle
27

Utilice el servicio en línea http://www.extractpdf.com . No es necesario instalar nada.

Yo voy
fuente
En mi caso, solo podía extraer fuentes Tipo 1 y no TrueType
koppor
Extraje fuentes usando este sitio y las copié en ~/.fonts , y la copia y el pegado funcionaban!
Eduardo Santana
3

Aunque esta pregunta tiene 10 años, sigue siendo válida y, a medida que la tecnología cambia, también lo hace una respuesta válida.

Al buscar las respuestas actuales, notó que ninguna de ellas nota WOFF (Web Open Font Format) ( W3C ) ( Wikipedia ) que puede usarse para recrear los caracteres individuales (glifos) y mostrarlos en una página web con precisión.

Usando la página web en línea gratuita de IDR Solutions, PDF a HTML5 ( enlace ), convierta un PDF a un archivo zip. En el zip resultante habrá un directorio de fuentes de tipos de archivos woff. Los navegadores actuales de Internet admiten archivos de woff si no estaba al tanto. ( referencia ) Estos pueden ser examinados en el sitio en línea FontDrop! ( enlace )

Los archivos WOFF se pueden convertir a / desde OTF o TTF en WOFFer - convertidor de fuente WOFF

Además, el archivo zip de PDF a HTML5 contendrá un archivo HTML para cada página del PDF que se puede abrir en un navegador de Internet y es una de las mejores y más precisas traducciones de PDF que he encontrado o visto.

Si bien estoy aprendiendo a usar archivos WOFF, vale la pena transmitirlo. Disfrutar.

PD: probablemente actualizaré con más información a medida que aprenda más sobre el uso de tipos de archivos woff, pero como se trata de elementos comunes creativos, siéntase libre de editar esta respuesta si tiene algo de valor que transmitir.

Guy Coder
fuente
¡Gracias! Esta solución funciona para mí (como al crear un TTF válido) mientras que las otras que he probado no. ¿Es porque WOFF maneja mejor las fuentes incompletas?
Daan
@Daan Is it because WOFF handles incomplete fonts better?no tengo idea. Tu suposición sería tan buena como una mina. Como señalé, estoy aprendiendo sobre WOFF.
Guy Coder
@Daan Quizás debería publicar Is it because WOFF handles incomplete fonts better?como una nueva pregunta SO y otras personas con más conocimiento verán y, con suerte, proporcionarán una respuesta significativa.
Guy Coder
Yo podría hacer eso. Gracias.
Daan
2

PDF2SVG versión 6.0 de PDFTron hace un trabajo razonable. Produce fuentes OpenType ( .otf) por defecto. Utilícelo --preserve_fontnamespara preservar "el esquema de nomenclatura de fuente / familia de fuentes obtenido del archivo fuente"

PDF2SVG es un producto comercial, pero puede descargar un ejecutable de demostración gratuito (que incluye marcas de agua en la salida SVG pero no restringe el uso). Puede haber otros productos PDFTron que también extraen fuentes, pero solo recientemente descubrí PDF2SVG.

Sean Leather
fuente
Lamentablemente --preserve_fontnamesno funciona si tiene fuentes parciales superpuestas; parece que no incluye el prefijo, por ejemplo, el MSCIYGin MSCIYG+Ge'ez-1, por lo que sobrescribe los parciales anteriores.
Chris
0

Este es un seguimiento de la font-forgesección de la respuesta de @Kurt Pfeifle , específica de Red Hat (y posiblemente otras distribuciones de Linux).

  1. Después de abrir el PDF y seleccionar la fuente que desea, deberá seleccionar la opción "Archivo -> Generar fuentes ...".
  2. Si hay errores en el archivo, puede elegir ignorarlos o guardar el archivo y editarlos. La mayoría de los errores se pueden corregir automáticamente si hace clic en "Reparar" suficientes veces.
  3. Haga clic en "Elemento -> Información de fuente ...", y "Nombre de fuente", "Nombre de familia" y "Nombre para humanos" se configuran a los valores que desee. Si no, modifíquelos y guarde el archivo en alguna parte. Estos nombres determinarán cómo aparece su fuente en el sistema.
  4. Seleccione su nombre de archivo y haga clic en "Guardar ..."

Una vez que tenga su archivo TTF, puede instalarlo en su sistema mediante

  1. Copiarlo a la carpeta /usr/share/fonts(como root)
  2. Corriendo fc-cache -f /usr/share/fonts/(como root)
Físico loco
fuente