Cómo extraer el texto y los metadatos de múltiples ficheros PDF. Mostramos cómo desarrollar una aplicación de indexación del texto y metadatos de ficheros PDF de forma nativa (sin necesidad de tener instalado software de terceros). Explicamos paso a paso cómo obtener el texto de un fichero PDF y sus metadatos (asunto, palabras clave, etc.), usando la DLL gratuita iTextSharp y el lenguaje de programación Microsoft Visual C# .Net 2010. Publicamos una aplicación completa de ejemplo con el código fuente en VB.Net: AjpdSoft Indexar Texto PDF C# iTextSharp.

Videotutorial AjpdSoft Indexar Texto PDF en funcionamiento

AjpdSoft Indexar Texto PDF C# iTextSharp permite obtener el texto de los ficheros PDF seleccionados, admite selección de múltiples ficheros. Permite obtener el texto en pantalla y guardarlo en fichero de texto o bien indexar el texto de los ficheros PDF y guardarlo en una base de datos ODBC. Admite cualquier motor de base de datos con soporte para ODBC: PostgreSQL, MySQL, Firebird, SQL Server, Access, SQLite, etc. A continuación mostramos un videotutorial con el funcionamiento de la aplicación:

Para desarrollar una aplicación de indexación del texto y metadatos de ficheros PDF (portable document format ó formato de documento portátil) usaremos la librería gratuita iTextSharp, por lo tanto necesitaremos descargar el fichero de esta librería dll. Accederemos a la URL: http://sourceforge.net/projects/itextsharp.

Descargaremos la versión más reciente de iTextSharp (iText#), en nuestro caso: iTextSharp 5.2.1. Se descargará el fichero itextsharp-all-5.2.1.zip, lo descomprimiremos. Este fichero contiene, a su vez, los siguientes ficheros comprimidos:

  • itextsharp-dll-cores-5.2.1.zip
  • itextsharp-dll-xtra-5.2.1.zip
  • itextsharp-src-core-5.2.1.zip
  • itextsharp-src-xtra-5.2.1.zip

iTextSharp está desarrollado en Microsoft Visual C# y, además, la descarga anterior incluye el código fuente completo (itextsharp-src-core-5.2.1.zip). En nuestro caso usaremos la DLL ya compilada de iTextSharp por lo que descomprimiremos el fichero «itextsharp-dll-cores-5.2.1.zip» que contiene el fichero itextsharp.dll, este será el fichero necesario para trabajar con ficheros PDF usando Microsoft Visual C#. Copiaremos este fichero a la carpeta que queramos (por ejemplo la raíz de nuestros proyectos). Más adelante deberemos seleccionarlo desde nuestro proyecto Visual C#:

Videotutorial AjpdSoft Indexar Texto PDF en funcionamiento

Instalación de Microsoft Visual Studio .Net

Para desarrollar la aplicación que nos permita trabajar con ficheros PDF usaremos el lenguaje de programación Microsoft Visual C#. En este tutorial obtendremos el texto de los ficheros PDF seleccionados y lo guardaremos en una base de datos para su posterior consulta.

Usaremos la suite de desarrollo Microsoft Visual Studio .Net. En el siguiente tutorial explicamos cómo instalar esta suite de desarrollo:

Indexar texto fichero PDF con C# C Sharp y iTextSharp

A continuación explicaremos cómo crear un proyecto o solución en Microsoft Visual C# .Net para extraer el texto de los ficheros PDF seleccionados y mostrarlo en pantalla o guardarlo en una tabla de una base de datos para su posterior consulta y tratamiento. Para ello abriremos Visual Studio .Net, pulsaremos en el menú «Archivo» – «Nuevo proyecto»:

Indexar texto fichero PDF con C# C Sharp y iTextSharp

Seleccionaremos en la parte izquierda «Otros lenguajes» – «Visual C# «, en la parte derecha seleccionaremos «Aplicación de Windows Forms» e introduciremos el nombre del proyecto, por ejemplo «AjpdSoftIndexarTextoFicherosPDF»:

Indexar texto fichero PDF con C# C Sharp y iTextSharp

Agregaremos la referencia a iTextSharp, para ello pulsaremos en el menú «Proyecto» – «Agregar referencia»:

Indexar texto fichero PDF con C# C Sharp y iTextSharp

Pulsaremos en la pestaña «Examinar» y seleccionaremos el fichero «iTextSharp.dll» descargado anteriormente:

Indexar texto fichero PDF con C# C Sharp y iTextSharp

Añadiremos los «using» al proyecto, para ello pulsaremos en el menú «Ver» – «Código» y agregaremos las referencias necesarias :

Indexar texto fichero PDF con C# C Sharp y iTextSharp

Al principio agregaremos el siguiente código:

Añadiremos los siguientes componentes al formulario principal de nuestra aplicación para extraer el texto y metadatos de ficheros PDF: ChekedListBox, Button, GroupBox, TabControl, StatusStrip, OpenFileDialog, SaveFileDialog, etc.:

Indexar texto fichero PDF con C# C Sharp y iTextSharp

En la pestaña «Indexar a Base de datos» añadiremos estos otros componentes:

Indexar texto fichero PDF con C# C Sharp y iTextSharp

Añadiremos un segundo formulario (Form) a nuestra aplicación, en él mostraremos la consulta SQL necesaria para crear la tabla donde guardar el texto extraído de los ficheros PDF. Para ello pulsaremos en el menú «Proyecto» – «Agregar Windows Forms»:

Indexar texto fichero PDF con C# C Sharp y iTextSharp

Seleccionaremos «Windows Forms», introduciremos un nombre para el fichero por ejemplo «formSQL.cs» y pulsaremos «Agregar»:

Indexar texto fichero PDF con C# C Sharp y iTextSharp

En el nuevo formulario agregaremos los siguientes componentes:

Indexar texto fichero PDF con C# C Sharp y iTextSharp

Agregaremos también un par de clases, una para las rutinas de cifrado y descifrado en AES de la contraseña del usuario de la base de datos y otra clase para todas las rutinas restantes: extraer texto PDF, extraer metadatos PDF, insertar registros en base de datos ODBC, obtener lista de orígenes de datos y leer y escribir valores de configuración en fichero .config. Para agregar una nueva clase al proyecto pulsaremos en el menú «Proyecto» – «Agregar clase»:

Indexar texto fichero PDF con C# C Sharp y iTextSharp

Seleccionaremos «Clase» y escribiremos el nombre del fichero de la clase, por ejemplo «cifrarAES.cs», pulsaremos «Agregar»:

Indexar texto fichero PDF con C# C Sharp y iTextSharp

Introduciremos el siguiente código Visual C# .Net para la clase «cifrarAES.cs» (cifrarAES):

De la misma forma agregaremos una segunda clase que llamaremos «Utilidades.cs»:

Indexar texto fichero PDF con C# C Sharp y iTextSharp

Introduciremos el siguiente código Visual C# .Net para la clase «Utilidades.cs» (Utilidades):

A continuación mostramos el código fuente Visual C# .Net de cada botón y cada evento del formulario principal (formIndexarPDF.cs). Todo el código y la aplicación completa están disponibles gratuitamente en: AjpdSoft Indexar Texto PDF C# iTextSharp:

El formulario «formSQL.cs» contendrá el siguiente código Visual C# .Net:

AjpdSoft Indexar Texto PDF C# iTextSharp

AjpdSoft Indexar Texto PDF C# iTextSharp permite extraer el texto y los metadatos de los ficheros PDF seleccionados y guardarlo en la tabla de una base de datos.

AjpdSoft Indexar Texto PDF C# iTextSharp no necesita usar ningún software de terceros, únicamente usa la librería gratuita iTextSharp.dll.

A continuación explicamos cómo funciona la aplicación AjpdSoft Indexar Texto PDF C# iTextSharp. La aplicación permite dos opciones de indexación o extracción de texto y metadatos de ficheros PDF, o bien mostrándolo en pantalla o bien guardándolo en base de datos. Para la primera opción, pulsaremos en el botón «+» para seleccionar los ficheros PDF que queramos indexar (permite selección de múltiples ficheros en la misma o diferentes carpetas):

AjpdSoft Indexar Texto PDF C# iTextSharp

Seleccionaremos los ficheros PDF a indexar:

AjpdSoft Indexar Texto PDF C# iTextSharp

Para extraer el texto y los metadatos de todos los ficheros PDF chequeados y mostrarlo en pantalla pulsaremos «Indexar PDFs a cuadro de texto»:

AjpdSoft Indexar Texto PDF C# iTextSharp

La aplicación mostrará el progreso del proceso en la barra de estado, indicando el fichero PDF actual, los que va a indexar y una barra de progreso. Cuando el proceso de indexación concluya mostrará un mensaje como el siguiente «Proceso de indexación de PDF finalizado correctamente»:

AjpdSoft Indexar Texto PDF C# iTextSharp

Desde el cuadro de texto podremos copiar el texto extraído de los ficheros PDF al portapapeles o bien guardarlo desde la aplicación en fichero de texto pulsando en «Guardar en fichero»:

AjpdSoft Indexar Texto PDF C# iTextSharp

La segunda posibilidad que presenta la aplicación es guardar los datos extraídos de los ficheros PDF en una tabla de una base de datos ODBC. Si hemos configurado un servidor de base de datos que soporte ODBC y hemos creado la tabla correspondiente como indicamos aquí podremos configurar AjpdSoft Indexar Texto PDF C# iTextSharp para guardar los datos obtenidos en una base de datos.

Para guardar los datos indexados de los PDF en una base de datos, la aplicación AjpdSoft Indexar Texto PDF C# iTextSharp permite dos opciones de conexión:

1. Si ya tenemos un origen de datos ODBC creado en el equipo podremos seleccionarlo (o escribirlo) en «ODBC existente en el equipo», usando esta opción no tendremos que introducir ningún dato más pues todos los datos se establecen en el origen de datos, como indicamos aquí:

AjpdSoft Indexar Texto PDF C# iTextSharp

Si optamos por esta opción, como decimos, no habrá que introducir más datos para la conexión con la base de datos.

2. La segunda posibilidad es dejar en blanco el campo anterior (ODBC existente en el equipo) e introducir los datos de conexión en «Nuevo ODBC». Si elegimos esta opción tendremos la ventaja de que no hay que crear ningún origen de datos en el equipo, directamente AjpdSoft Indexar Texto PDF C# iTextSharp usará los siguientes datos para establecer la conexión:

  • Motor BD: nombre exacto del origen de datos ODBC, en el desplegable aparecen un listado de los nombres «típicos», pero pueden variar en función de las versiones instaladas de cada controlador de cada motor de base de datos. En nuestro caso usaremos «PostgreSQL ANSI».
  • Servidor BD: IP o hostname del equipo con la base de datos instalada, en nuestro caso «pcajpdsoft».
  • Usuario: nombre de usuario del motor de base de datos con permisos suficientes para insertar registros en la tabla indicada.
  • Contraseña: contraseña del usuario de la base de datos.
  • BD: nombre de la base de datos a la que nos conectaremos, en nuestro ejemplo «indexadopdf».
  • Puerto: podemos dejarlo en blanco para usar el puerto por defecto del motor de base de datos elegido o bien especificar uno si es diferente al de defecto.

Una vez elegido el método de conexión (ODBC existente o bien ODBC nuevo) introduciremos los datos para la tabla de la base de datos:

  • Tabla: nombre de la tabla de la base de datos donde guardaremos el texto extraído de los ficheros PDF.
  • Campo texto: nombre del campo de la tabla donde se guardará el texto obtenido del fichero PDF.
  • Campo metadatos: nombre del campo de la tabla donde se guardarán los metadatos obtenidos del fichero PDF.
  • Campo fecha: nombre del campo de la tabla donde se guardará la fecha actual, la fecha en la que se realiza la indexación.
  • Campo nombre fichero: nombre del campo de la tabla donde se guardará la ruta y el nombre del fichero PDF indexado.
AjpdSoft Indexar Texto PDF C# iTextSharp

A continuación pulsaremos en «Conectar» para comprobar la conexión a la base de datos y la existencia de la tabla indicada:

AjpdSoft Indexar Texto PDF C# iTextSharp

Si todo es correcto la aplicación AjpdSoft Indexar Texto PDF C# iTextSharp mostrará el mensaje «La tabla indexpdf» existe con xxx registros». Si hay algún error en la conexión o falta algún dato la aplicación mostrará el error:

AjpdSoft Indexar Texto PDF C# iTextSharp

Por último, una vez establecido el método de conexión y los datos de la tabla de la base de datos podremos marcar la opción «Reemplazar registros con nombre de fichero común» para que la aplicación AjpdSoft Indexar Texto PDF C# iTextSharp, antes de insertar un nuevo registro en la tabla, compruebe si ya existe usando la carpeta y el nombre del fichero PDF previamente indexado. Si existe se actualizará y si no existe se creará un nuevo registro. Si no marcamos esta opción siempre se añadirá un nuevo registro sin realizar comprobación previa de su existencia. Tras seleccionar el método de reemplazo pulsaremos en «Indexar PDFs a base de datos» para iniciar el proceso definitivo:

AjpdSoft Indexar Texto PDF C# iTextSharp

La aplicación AjpdSoft Indexar Texto PDF C# iTextSharp mostrará el progreso del proceso de indexación con una barra de progreso e indicando los ficheros indexados y los que quedan por indexar, todo ello lo mostrará en la barra de tareas:

Una vez finalizado el proceso podremos acceder usando cualquier software de consulta de SQL al motor de base de datos que hayamos elegido como destino de la indexación para consultar y buscar los datos de los ficheros PDF:

AjpdSoft Indexar Texto PDF C# iTextSharp

Código fuente completo de AjpdSoft Indexar Texto PDF C# iTextSharp

A continuación mostramos el enlace para descargar gratuitamente el código fuente completo de la aplicación AjpdSoft Indexar Texto PDF C# iTextSharp desarrollada con Visual C# .Net 2010 (de Microsoft Studio .Net 2010):

El listado completo del código fuente de la aplicación AjpdSoft Indexar Texto PDF C# iTextSharp:

  • Código para «cifrarAES.cs» (clase para cifrado de texto en AES):
  • Código para la clase «Utilidades.cs» (acceso a base de datos, obtención de lista de ODBC, inserción de registros en BD, indexación de texto PDF, extracción de metadatos PDF, leer y guardar valores de configuración:
  • Formulario «formSQL.cs» (muestra consulta SQL para crear tabla para indexación de texto de PDF) :
  • Formulario «formIndexarPDF.cs«:

Crear base de datos y tabla en PostgreSQL para guardar indexación de PDF

En el ejemplo usaremos un servidor de base de datos con PostgreSQL. La aplicación AjpdSoft Indexar Texto PDF C# iTextSharp admite cualquier motor de base de datos con soporte de ODBC: Oracle, MySQL, SQLite, Microsoft Access, Microsoft SQL Server, Firebird, PostgreSQL, etc.

A continuación mostramos algunos tutoriales para instalar PostgreSQL tanto en sistemas operativos Windows como Linux:

Una vez que tengamos disponible el servidor o equipo con el motor de base de datos y hayamos instalado el administrador pgAdmin III, abriremos este último, nos conectaremos al servidor. Pulsaremos con el botón derecho del ratón sobre «Databases», seleccionaremos «New Database»:

Crear base de datos y tabla en PostgreSQL para guardar indexación de PDF

En la pestaña «Properties», en el campo «Name», introduciremos el nombre para la base de datos que usaremos para guardar el texto extraído de los ficheros PDF, por ejemplo «indexadopdf». Pulsaremos «OK»:

Crear base de datos y tabla en PostgreSQL para guardar indexación de PDF

Nuestra base de datos PostgreSQL aparecerá en el árbol, desplegaremos «indexadopdf» y accederemos a «Schemas», en «Public» pulsaremos con el botón derecho del ratón y seleccionaremos «New Object», en el submenú emergente pulsaremos en «New Table»:

Crear base de datos y tabla en PostgreSQL para guardar indexación de PDF

Introduciremos en la pestaña «Properties», en el campo «Name» el nombre para la tabla, por ejemplo «indexpdf»:

Crear base de datos y tabla en PostgreSQL para guardar indexación de PDF

Ahora añadiremos las columnas para la tabla «indexpdf», para ello pulsaremos en la pestaña «Columns» y pulsaremos «Add»:

Crear base de datos y tabla en PostgreSQL para guardar indexación de PDF

En la pestaña «Properties» de la ventana «New Column», introduciremos el nombre para la columna, por ejemplo crearemos una columna con autoincremento que será la clave primaria de la tabla (primary key). En «Name» introduciremos «codigo» y en «Data type» seleccionaremos «serial». Pulsaremos «OK»:

Crear base de datos y tabla en PostgreSQL para guardar indexación de PDF

De la misma forma, añadiremos la columna o campo «texto», con tipo de datos (Data type) «text». Este campo será el que guarde el contenido de texto de cada fichero PDF indexado. Por lo tanto debe ser un tipo de dato que admita cualquier texto de cualquier tamaño:

Crear base de datos y tabla en PostgreSQL para guardar indexación de PDF

Crearemos también el campo «metadatos» que será donde guardemos los metadatos extraídos del fichero PDF. Este campo no necesita ser de tipo «text» pues los metadatos no suelen tener más de 500 caracteres. Pero los metadatos pueden ser variables por lo que lo crearemos de tipo «text»:

Crear base de datos y tabla en PostgreSQL para guardar indexación de PDF

Crearemos también la columna «ficheropdf» que contendrá la ruta y nombre del fichero PDF indexado, esta columna puede ser de tipo de datos «character varying» y de tamaño 500 (Length):

Crear base de datos y tabla en PostgreSQL para guardar indexación de PDF

Añadiremos la columna «fechaindexacion» donde la aplicación guardará la fecha en la que realizó la extracción del texto del fichero PDF. Llamaremos a este campo «fechaindexacion» y de tipo «date»:

Crear base de datos y tabla en PostgreSQL para guardar indexación de PDF

Por último crearemo la clave primaria (primary key). Para ello desde la ventana de «New Table», pulsaremos en la pestaña «Constraints», seleccionaremos «Primary Key» y pulsaremos «Add»:

Crear base de datos y tabla en PostgreSQL para guardar indexación de PDF

Introduciremos el nombre para la clave primaria, por ejemplo «pk_codigo_indexacionpdf»:

Crear base de datos y tabla en PostgreSQL para guardar indexación de PDF

En la pestaña «Columns», en «Column» seleccionaremos «codigo» y pulsaremos «Add»:

Crear base de datos y tabla en PostgreSQL para guardar indexación de PDF

Tras añadir la clave primaria pulsaremos «OK» en la ventana «New Primary Key»:

Crear base de datos y tabla en PostgreSQL para guardar indexación de PDF

Tras crear las columnas y las constraints (restricciones) como la clave primaria, pulsaremos «OK» para crear definitivamente la tabla «indexpdf»:

Crear base de datos y tabla en PostgreSQL para guardar indexación de PDF

De esta forma ya tendremos la tabla «indexpdf» creada en la base de datos «indexadopdf» de nuestro servidor con PostgreSQL:

Crear base de datos y tabla en PostgreSQL para guardar indexación de PDF

La consulta SQL para crear la tabla anterior:

Crear origen de datos ODBC para acceso a PostgreSQL en PC con Windows 7

A continuación explicaremos cómo crear un origen de datos ODBC para acceso al servidor con PostgreSQL (puede ser Windows o Linux). Para crear un origen de datos ODBC de 64 bits (si hemos instalado el servidor con PostgreSQL x64) seguiremos los pasos que indica este tutorial:

Para aclarar el manido tema de los 64 ó 32 bits vamos a mostrar a continuación las posibles combinaciones, es importante conocerlas para saber qué ODBC instalar y cuál no. Por un lado el servidor de PostgreSQL, que puede tener un sistema operativo de 32 ó de 64 bits, si el sistema operativo es de 32 bits es evidente que PostgreSQL sólo podrá ser de 32 bits. Si el servidor tiene un sistema operativo de 64 bits podremos instalar PostgreSQL de 32 bits o PostgreSQL de 64 bits. Si instalamos PostgreSQL de 32 bits en el servidor los clientes (ODBC y demás tipos de conexión) deberán ser de 32 bits. Ahora bien, si nuestro servidor con PostgreSQL es de 64 bits e instalamos PostgreSQL de 64 bits tendremos las siguientes posibilidades en los equipos cliente que se conectarán a este servidor:

1. Aplicación cliente de 32 bits por lo que ésta sólo admitirá driver ODBC de 32 bits. Aunque tengamos el sistema operativo de 64 bits, en este caso deberemos instalar el v de 32 bits correspondiente para PostgreSQL. Aunque el servidor PostgreSQL sea de 64 bits, admitirá conexiones de un ODBC de 32 bits. En esta circunstancia hay que tener en cuenta que si el equipo cliente tiene como sistema operativo Microsoft Windows 7 x64 (válido para Windows Vista, Windows Server 2008 y Windows 8), para crear un origen de datos de 32 bits hay que ejecutar el fichero:

C:/Windows/SysWOW64/odbcad32.exe

Crear origen de datos ODBC para acceso a PostgreSQL en PC con Windows 7

El fichero anterior mostrará los orígenes de datos ODBC del equipo para 32 bits x86. Desde aquí podrá crearse un origen de datos ODBC de 32 bits que será el que pueda usar una aplicación cliente de 32 bits. Desde la pestaña «DSN de sistema» (para que el ODBC esté disponible para todos los usuarios) pulsaremos en «Agregar»:

Crear origen de datos ODBC para acceso a PostgreSQL en PC con Windows 7

Seleccionaremos el origen de datos a usar, en nuestro caso «PostgreSQL ANSI». Por supuesto, antes de crear el origen de datos debe estar instalado el driver correspondiente (como ya hemos explicado aquí):

Crear origen de datos ODBC para acceso a PostgreSQL en PC con Windows 7

Introduciremos los datos para el nuevo origen de datos ODBC:

  • Data Source: nombre del origen de datos, por ejemplo «indexpdf».
  • Description: breve descripción del origen de datos, por ejemplo «Indexado de texto de ficheros PDF».
  • Database: nombre que le hayamos dado a la base de datos de PostgreSQL, en nuestro ejemplo «indexadopdf».
  • Server: IP o hosname del servidor con PostgreSQL.
  • Port: puerto para conexión con PostgreSQL, por defecto 5432.
  • User Name: nombre de usuario de PostgreSQL con permisos suficientes para acceso de consulta y modificación de la tabla en cuestión.
  • Password: contraseña para el usuario anterior.

Pulsando en el botón «Test» podremos realizar una prueba de conexión:

Crear origen de datos ODBC para acceso a PostgreSQL en PC con Windows 7

Si todo es correcto nos mostrará un mensaje con el texto «Connection successful»:

Crear origen de datos ODBC para acceso a PostgreSQL en PC con Windows 7

2. Aplicación cliente de 64 bits, esta aplicación soportará drivers ODBC de 32 bits y de 64 bits, por lo tanto podremos crear el origen de datos en el equipo de la forma habitual, desde «Herramientas administrativas» – «Orígenes de datos ODBC», como indicamos aquí: