Agregar fuentes al PdfBox
0. Índice de contenidos.
- 1. Introducción
- 2. Entorno
- 3. Mapear fuentes nuevas
- 4. ¿Cómo se la fuente que tiene el PDF por dentro?
- 5. Situcionaes problemáticas
- 6. Conclusiones
- 7. Información sobre el autor
1. Introducción
PdfBox es una herramienta java que nos permite la lectura de los pdf. Es muy útil si estamos trabajando con pdfs y queremos hacer algún tipo de procesamiento o conversión.
Este tutorial está enfocado al agregado de fuentes a pdfBox para mejorar la lectura y posterior pintado de un pdf. Si estás usando pdfBox y hay algunos libros en los que:
- No se ven bien las letras
- Los carácteres están tan juntos que no se entienden las frases
- Falta texto en el libro
es posible que tengas un problema de fuentes.
Como primera opción vamos simplemente a ver como podemos mapear una fuente contra otra parecida. En segundo lugar si no obtenemos buenos resultados con el mapeo, veremos como
añadir directamente nuevas fuentes, y que pdfBox trabaje con ellas.
2. Entorno
- Hardware: Portátil MacBook Pro 15′ (2.0 GHz Intel i7, 8GB DDR3 SDRAM, 500GB HDD).
- AMD Radeon HD 6490M 256 MB
- Sistema Operativo: Mac OS X Snow Leopard 10.6.7
- Software: Eclipse Helios
3. Mapear fuentes nuevas de Tipo 1
Para ilustrar el tutorial vamos a suponer lo siguiente. Tenemos un libro con la fuente Bodoni-PosterCompressed (ver imagen).
Podéis fijaros como es una fuente con poca separación entre caracteres. Si intentamos construir una imagen de una página que tenga esa fuente pdfBox no la tiene mapeada contra ninguna, con lo que usará la que tenga configurada por defecto, que en la versión 1.8 es Arial.
Arial no funciona muy bien para este tipo de letra. Veamos el resultado de mapear Bodoni-PosterCompressed contra Arial, que es lo que pdfBox haría por defecto.
Como veis al ser Arial una fuente con más espacio entre los caracteres y además estos son más gruesos, no concuerda bien y las letras nos salen superpuestas.
La solución más fácil que podemos dar para resolver nuestro problema es hacer una correspondencia entre la fuente original del PDF y una que se le parezca. En la ruta pdfbox/src/main/resources/org/apache/pdfbox/resources/FontMapping.properties tenemos un fichero de propiedades donde al final del todo vemos algunos mapeos para algunas fuentes.
Vamos a probar a introducir la siguiente entrada: Bodoni-PosterCompressed=Courier. Ahora el título nos saldría de la siguiente forma:
Esto es así básicamente porque el fuente Courier es más parecido a Bodoni-PosterCompressed. Una vez encontremos una fuente que se asemeja a la que queremos usar tenemos que buscarla de entre las fuentes de java.awt. Estas fuentes se conforman en un mapa en la clase FontManager.
El mapa tendría más o menos la siguiente estructura: {couriernewpsmtbold=java.awt.Font[family=Courier New,name=CourierNewPS-BoldMT,style=plain,size=1], osaka=java.awt.Font[family=Osaka,name=Osaka-Mono,style=plain,size=1]….. Os he marcado en negrita las fuentes hacia las que podeis hacer el mapeo.
4. ¿Cómo se la fuente que tiene el PDF por dentro?
Ya hemos explicado hacia donde mapear, pero ¿cómo se la fuente origen?
Si ponemos un punto de ruptura en esta función, el parámetro de entrada font, nos dirá el nombre de nuestra fuente, con lo que en el archivo FontMapping.properties deberíamos poner font=osaka, por ejemplo.
5. Situcionaes problemáticas
Una situación problemática que he tenido al manejar la biblioteca es en los casos en que una fuente *.ttf viene embebida en el propio PDF. Al estar embebida la propia lógica del pdfBox intenta usar esa fuente y pregunta carácter a carácter si puede pintarlo. El problema viene porque la fuente que se crea responde siempre que sí puede pintarse y algunos caracteres como acentos o eñes luego en realidad no se pintan. PdfBox asigna una fuente por defecto si no se pueden pintar estos caracteres, pero parece no estar reconociendo bien cuando se puede efectivamente pintar un carácter o no.
6. Conclusiones
Lo ideal sería poder incluir nuevas fuentes adjuntando su archivo *.afm ó *.ttf y que aunque vinieran las fuentes embebidas en el pdf usar las que nosotros definimos en el archivo PDFBox_External_Fonts.properties.
PdfBox reconoce bastantes fuentes y en general el funcionamiento es bastante bueno, pero no se le puede pedir que reconozca todas las fuentes que circulan por internet con las que a alguien se le haya podido ocurrir construir un Pdf o parte de él.
7. Información sobre el autor
Alberto Barranco Ramón es Ingeniero Técnico en Informática de Gestión y Graduado en Ingeniería del Software por la Universidad Politécnica de Madrid
Mail: abarranco@autentia.com.
Twitter: @barrancoalberto
Autentia Real Business Solutions S.L. – «Soporte a Desarrollo».