A veces necesitamos extraer información de texto procedente de ficheros en formato pdf por ejemplo para automatizar la extracción de determinada información relevante que contengan o simplemente porque deseamos guardar la información editable en otro formato mas amigable. En realidad es realmente interesante intentar automatizar esta tarea pues así nos evitamos manipulaciones manuales y tediosas lo cual seguramente nos hagan perder mucho tiempo con la gran escasez de este elemento de la vida moderna del que tampoco disponemos
Vamos a ver dos métodos para hacerlo usando el IDE de Eclipse y el lenguaje Java
Método 1; mediante un paso intermedio con conversión previa de los ficheros pdf a ficheros de texto
PDF to TXT Converter es una aplicación de Windows para convertir archivos pdf a archivos de formato de texto sin formato en modo batch. Este programa también admite la conversión de rango de páginas específicas a archivos txt de modo que después de la conversión, obtendrá el texto editable del documento PDF original
Esta utilidad la podemos descargar desde aqui
Hay una pequeña pega con este programa, pues dado que es shareware en la versión gratuita tiene bastantes limitaciones ,entre ellas que no se procesaran más de 200 documentos de un sola vez ( si se intenta con más de esa cantidad el programa pierde el control)
Un punto a su favor es que permite convertir automáticamente directorios enteros con contenido de ficheros pdf y de este modo no necesitamos seleccionar uno a uno cuál de ellos queremos convertir ( pero no olvide que, a no ser que compre la version completa, solo debería contener como máximo 200 ficheros)
Como vemos ,lo interesante de este programa es que permite convertir los ficheros pdf a texto lo cual nos facilitara procesar estos muy fácilmente desde java
Ahora vamos a ver un ejemplo cómo extraer los metadatos de un documento de tipo texto obtenido usando el programa anterior
La idea es que a partir de los pdf convertidos previamente a txt , es que iremos leyendo el contenidos de cada fichero txt e interpretando las cadenas extraidas de los pdf para buscar por ejemplo cuatro meta-datos que necesitamos , haciendo cuenta del orden en el que aparecen asi como las palabras justo anteriors:
-meta1,
-meta2
-meta3
-meta4:
En esta búsqueda tiene sentido el número de orden en el que aparecen las cadenas anteriores a la busqueda pues según el orden en que aparezca corresponderá a un meta-dato u otro.
En este caso meta2 hay que buscarlo dos veces , pero según este orden la cadena siguiente es meta2 o meta4
Veamos el ejemplo;
//*******************************************************
//BLOQUE PRINCIPAL PARA EXTRAER 4 METADATOS de un fichero
//*******************************************************
//abre el fichero
Scanner in =null;
DecimalFormat formateador = new DecimalFormat(«####################»);
Integer contador=0;
//solo procesaremos los ficheros con la extrension txt
if (sub.matches(tipofichero)) try{
in = new Scanner(new FileReader(nombreFichero));
in.useLocale(Locale.ENGLISH);
//lee el fichero palabra a palabra
while (in.hasNext())
{
//lee primera palabra
String palabra = in.next();
caa=palabra;
if (procesa==true)
{
//System.out.println(«Palabra:»+palabra+ «contador=»+contador);
if (contador==1)
{instalacion=palabra;
}
if (contador==5)
{nif=palabra;
}
procesa=false;
contador++;
}
if (caa.matches(«pedido:»))
{
// System.out.println(«<<<Palabra pedido: ENCONTRADA:>>>»);
procesan=true;
contador++;
}
if (caa.matches(«instalación:»))
{
//System.out.println(«<<<<Palabra instalación: ENCONTRADA:>>>>»);//fecha
procesa=true;
contador++;
}
if (caa.matches(«NIF/NIE/Pasaporte:»))
{
// System.out.println(«<<<<Palabra NIF/NIE/Pasaporte: ENCONTRADA>>>>»);
procesa=true;
contador++;
}
//lee números
while (in.hasNextDouble())
{
// lee un double
double d = in.nextDouble();
if (procesan==true)
{
//System.out.println(«Número:»+formateador.format(d)+»contador=»+contador);
if (contador==3)
{pedido=d;
}
if (contador==7)
{linea=d;
}
procesan=false;
contador++;
}
}
} // while (in.hasNext())
//resumen de datos capturados del pdf convertidos en txt y capturada en 4 campos que necesitamos
System.out.println(«Instalacion:»+instalacion); //fecha
System.out.println(«Pedido:»+formateador.format(pedido));
System.out.println(«NIF:»+nif);
System.out.println(«Telefono:»+formateador.format(linea));
….
Método 2 directo usando la Liberia ItextPDF
iText es una biblioteca Open Source para crear y manipular archivos PDF, RTF, y HTML en Java. Fue escrita por Bruno Lowagie, Paulo Soares, y otros; está distribuida bajo la Affero General Public License.
El mismo documento puede ser exportado en múltiples formatos, o múltiples instancias del mismo formato. Los datos pueden ser escritos a un fichero o, por ejemplo, desde un servlet a un navegador web.
Más recientemente, ha sido extendida a una biblioteca PDF de propósito general, capaz de rellenar formularios, mover páginas de un PDF a otro, y otras cosas. Estas extensiones son a menudo mutuamente excluyentes. Una clase te permite rellenar en formularios, mientras una clase diferente e incompatible hace posible copiar páginas de un PDF a otro.
El soporte de PDF de iText es, sin embargo, bastante extensivo. Esto soporta firmas basadas en PKI de PDF, cifrado de 40-bit y 128-bit, corrección de colores, PDF/X, gestión de colores por perfiles ICC, y es anfitriona de otras característica
Podemos descargar el fichero itextpdf-5.1.0.jar desde el respositorio de Maven o de esta web http://www.java2s.com/Code/Jar/i/Downloaditextpdf510jar.htm
No debemos olvidar importar el jar desde el Ide del Eclipse en propiedades del proyecto-->Java Build Path–>libraries –>Add External JARs
Este es un ejemplo de captura sencilla de como procesar un pdf directaeente
import java.io.IOException;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfTextExtractor;
public class prueba {
/**
* @param args
*/
public static void main(String[] args) {
try {
PdfReader reader = new PdfReader(«d:/ttttt.pdf»);
System.out.println(«This PDF has «+reader.getNumberOfPages()+» pages.»);
String page = PdfTextExtractor.getTextFromPage(reader, 1);
System.out.println(«Page Content:\n\n»+page+»\n\n»);
System.out.println(«Is this document tampered: «+reader.isTampered());
System.out.println(«Is this document encrypted: «+reader.isEncrypted());
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Es importante la sentencia String page = PdfTextExtractor.getTextFromPage(reader, 1); porque si ponemos 0 o un valor superior daría error
Como gracias a la librería podemos capturar la informacion del fichero pdf y aplicar la clase Sacanne para analizar las cadenas para buscar determinada informacion que queremos catalogar vamos a ver el ejemplo anterior usando los mismos campos y con la misma casuitica:
Este seria el mismo ejemplo de la primer parte , pero usando directamente los fichero pdf sin convertir a pdf:
import java.awt.Rectangle;
import java.awt.print.PageFormat;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.text.DecimalFormat;
import java.util.List;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.FileReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Scanner;
import java.util.Locale;
import java.io.FileNotFoundException;
import java.nio.charset.StandardCharsets;
import java.text.DecimalFormat;
import java.io.StringReader;
import java.util.Locale;
import java.util.Scanner;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfTextExtractor;
public class Main {
/**
* @param args
*/
public static void main(final String[] args) throws IOException {
String instalacion=»»;
String nif=»»;
double pedido=0;
double linea=0;
boolean procesa=false;
boolean procesan=false;
String tipofichero=»pdf»; // solo tomaremos ficheros con esta extension
String caa = substring(20);
String ruta = «D:\temp\ficheros\»;
String ficherox=»28348758018_20181201000002.pdf»;
String fichero=ruta+ ficherox;
System.out.println(«Fichero a analizar =» +ficherox);
int numero=ficherox.length()-3; //calcula donde empieza la extension del fichero
// System.out.println(«numero=»+numero);
String sub =ficherox.substring( numero); //calcula la extension del fichero
System.out.println(«Extension del fichero :»+sub);
//abrimos el PDF
PdfReader reader = new PdfReader(fichero);
int pages = reader.getNumberOfPages();
System.out.println(«Este PDF tiene «+pages+» paginas.»);
//empezamos la coversion a pdf
String page = PdfTextExtractor.getTextFromPage(reader, 1); ////<———————————————–aqui da errror
System.out.println(«Contenido del documento de la pagina «+pages);
System.out.println(«\n\n»+page+»\n\n»);
/////////////////////////////////////////////////////////////////////
//solo procesaremos los ficheros con la extrension pdf
////////////////////////////////////////////////////////////////////
if (sub.matches(tipofichero))
/// try
{
//para procesar el texto lo copiamos a una cadena
String nombreFichero = page ; //Fichero;
System.out.println(«Convertido salida del conversor a un String «);
//borra el scanner
// Scanner in =null;
//formatos de numeros
DecimalFormat formateador = new DecimalFormat(«####################»);
//inicializa conatdor
int contador=0;
//in = new Scanner(new FileReader(nombreFichero));///AQUI ESTA EL PROBLEMA PUES SCANNER NO EST ACEPTADNO EL STRING
Scanner in = new Scanner(nombreFichero);
in.useLocale(Locale.ENGLISH);
System.out.println(«Es correcto el pdfl Convertido salida del conversor a un String «);
//lee el fichero palabra a palabra
while (in.hasNext()) //leemos toda la cadena
{
//lee primera palabra
String palabra = in.next();
caa=palabra;
if (procesa==true)
{
//System.out.println(«Palabra:»+palabra+ «contador=»+contador);
if (contador==1)
{instalacion=palabra;
}
if (contador==5)
{nif=palabra;
}
procesa=false;
contador++;
}
if (caa.matches(«pedido:»))
{
// System.out.println(«<<<Palabra pedido: ENCONTRADA:>>>»);
procesan=true;
contador++;
}
if (caa.matches(«instalación:»))
{
//System.out.println(«<<<<Palabra instalación: ENCONTRADA:>>>>»);//fecha
procesa=true;
contador++;
}
if (caa.matches(«NIF/NIE/Pasaporte:»))
{
// System.out.println(«<<<<Palabra NIF/NIE/Pasaporte: ENCONTRADA>>>>»);
procesa=true;
contador++;
}
//lee números
while (in.hasNextDouble())
{
// lee un double
double d = in.nextDouble();
if (procesan==true)
{
//System.out.println(«Número:»+formateador.format(d)+»contador=»+contador);
if (contador==3)
{pedido=d;
}
if (contador==7)
{linea=d;
}
procesan=false;
contador++;
}
}
} // while (in.hasNext())
in.close();
//resumen de datos capturados del pdf convertido en txt
System.out.println(«Instalacion:»+instalacion); //fecha
System.out.println(«Pedido:»+formateador.format(pedido));
System.out.println(«NIF:»+nif);
System.out.println(«Telefono:»+formateador.format(linea));
//fin de metatados de un documento INDIVIDUAL en el xml
}
}
private static String substring(int i) {
// TODO Auto-generated method stub
return null;
}//CLASS
}
Con esta librería como vemos podemos procesar de un modo relativamente sencilllo cualquier contenido de un fichero pdf de un modo muy potente como acabamos de ver .
Debe estar conectado para enviar un comentario.