style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

¿Cómo crear un API Java?

Hola a todos, tengo varias dudas de como crear un API para el análisis de documentos PDF. Ya se que existen librerías como iText o PDFBox, pero no me sirven para realizar el análisis.

¿Cuál es el problema?

No existe (o no conozco) un API en Java para el análisis de documentos PDF. Existen varias alternativas, pero están hechas en Python.

¿Qué quiere decir "análisis de documentos PDF"?

Leer la "estructura" del documento PDF, mostrar esa estructura y comprobar si cumple con los estandares (estar bien formado).

Para ver esta estructura basta que abras cualquier PDF con el bloc de notas.
Estructura de un PDF

%PDF-1.1

/*falta más, solo puse una parte*/
trailer
<<
 /Size 8
 /Root 1 0 R
>>
startxref
642
%%EOF

¿Qué es lo que se debe hacer?

El usuario tiene un documento PDF y quiere subirlo al servidor para luego ser procesado.

Pero existe un problema:

 Al tratar de hacer el "parseo" (ya sea con PDFBox o iText) no se encuentra el "trailer" (es una parte de la estructura de todo PDF que específica que se formo correctamente) y devuelven un objeto nulo y es imposible seguir con el proceso.

Sería fácil decirle al usuario que intente nuevamente subir ese documento, pero es demasiado tedioso hacerlo si son muchos documentos.

¿Qué recomiendan usar, estudiar, leer,etc. para crear el API?

No quiero código, solo quiero saber su experiencia, regaños, críticas, alternativas, etc.

Gracias.

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de neko069

Chécate Apache Tika.

Chécate Apache Tika.

Imagen de rugi

Links..

mi http://delicious.com/rugi dice;

How To Design A Good API and Why it Matters
http://www.youtube.com/watch?v=aAb7hSCtvGw

Building a Great Web API
http://www.infoq.com/presentations/Building-a-Great-Web-API

RESTful API Design: Second Edition" Webinar - Video & slides
http://blog.apigee.com/detail/slides_for_restful_api_design_second_editi...

Saludos!!!
RuGI

Imagen de rugi

Por cierto... creo que

Por cierto... creo que deberìas leer sobre "Apache Lucene", aun asì, los links no estàn demás :)

Imagen de rugi

Mmmmm efectivamente, (ahora

Mmmmm efectivamente, (ahora recuerdo-con razón me sonaba conocido el problema-), tiene razón neko, Tika puede ayudarte.

http://xhubacubi.blogspot.mx/2011/10/apache-tika-10-un-ejemplo-de-uso.html

Imagen de Sr. Negativo

Gracias rugi y neko069

Gracias voy a revisar la librería y los links.

Lo que quiero e "leer" la estructura de los documentos no el texto. Pero de todos modos creo me puede servir.

Imagen de Sr. Negativo

Practical API Design

A mi no me parece que

A mi no me parece que necesites un API, sino una defiición funcional correcta.

¿Que es lo que vas a hacer si el documento PDF no está bien formado? Deberías rechazarlo no?, De otra forma estarías permitiendo que ingrese al sistema algo que "parece" que es un PDF, pero no lo es ( y para fines prácticos ningún lector de PDF va a poder usar )

Si ya tienes una bibiloteca que detecta este error ( cuando te regresa nulo ) entonces ya tienes listo tu API de análisis de PDF ( al menos de un PDF mal formado )

La pregunta es ( de nuevo ) que vas a hacer con esa información? Se la vas a agrgar tú modificando los datos que el usuario manda? Lo vas a rechazar? A mi me parece que antes hay que entender el problema ( quizá tu ya lo entendiste bien , pero en el post a mi no me queda claro ) y luego ver cual es la mejor solución, quizá baste con cambiar el orden de las invocaciones y ya.

Saludos

Imagen de Sr. Negativo

Parseo del documentos

Parseo del documentos PDF

try{
 /*aqui se realiza el parseo*/
}
catch(Exception ex){
            System.out.println(ex.toString().equalsIgnoreCase("java.io.IOException: trailer not found.")? "##Error: el archivo esta corrupto o no esta bien formado(NO SE PUEDE PROCESAR)": "");
            System.out.println(ex.toString().equalsIgnoreCase("java.io.IOException: Unknown encryption type (4)")? "##Error: se trata de un error de copia/transferencia/seguridad del archivo/encriptado o mal encriptado (NO SE PUEDE PROCESAR)": "");
        }

Esto se puede tomar como la "solución" que se me ocurrio.

Y que vas a hacer cuando eso

Y que vas a hacer cuando eso ocurra? continuar de todas formas?

Imagen de Sr. Negativo

Si, continuar. Por eso quería

Si, continuar.

Por eso quería crear esa API para NO tener que pedirle al usuario que envié otra vez ese documento.

Lo que pienso es crear una API para validación de documentos.

Imagen de Sr. Negativo

Encontré esto: PDFParser de

Encontré esto:
PDFParser de PDFBox

Yo creo podría basarme en ese código. O hacer algo similar

ok, continuas y luego? Que va

ok, continuas y luego? Que va a ser de ese documento que ya nadie va a poder ver? Que ta si mando un word en vez de un PDF, el validador no pasará pero lo dejarás seguir.

Lo que puedes hacer es indistintamente guardarlos en el servidor y procesarlos offline. Si lo que quieres es que tu usuario los mande y ya, puedes dejarlos en el server y luego con otro proceso validarlos.

Sería cosa de revisar el caso de negocio, quizá le estes queriendo dar una solución técnica a lo que es una solución funcional. A veces es un "se rechaza y ya".

Ahi nos cuentas.

Imagen de rugi

"Lo que pienso es crear una

"Lo que pienso es crear una API para validación de documentos."
Eso cambia completamente el panorama :)

Lo que sigue entonces es que definas si tu API aplica unicamente al tipo de documento que quieres actualmente validar o si quieres dejarlo un poco más flexible.

Entiendo que esos PDF's que tu recibes son "armados" por varios _client's_ y no son necesariamente generados por herramientas comerciales.
Si ese es el caso, para hacer mas integral tu solución deberán tambien reforzar lo mecanismos de generacion, por lo que, tu API debería contemplar el ciclo completo de tu "modelo de dominio".

Saludos!!!
----

Imagen de Sr. Negativo

Mecanismos de generación

"Si ese es el caso, para hacer mas integral tu solución deberán tambien reforzar lo mecanismos de generacion, por lo que, tu API debería contemplar el ciclo completo de tu "modelo de dominio""

No había pensado en eso. Lo que quiero hacer es validar esos documentos PDF ANTES de procesarlos

Imagen de Sr. Negativo

Crear una API

Pues con la novedad de que no es nada sencillo, creo que buscaré otra alternativa ( PDFBox).

Es muy poco el tiempo para crear una nueva API.

Imagen de ezamudio

API?

Cuando hablas de crear una API, a qué te refieres exactamente? Sabes qué significa API?

Imagen de Jose Manuel

¿No era eso?

¿Porqué lo pregunta Enrique? Es que según yo, el propósito de crear las bibliotecas es agilizar el desarrollo de aplicaciones ( mediante la abstracción ) y evitar reescribir código y es lo que quiere Sr Negativo ¿No?

Imagen de ezamudio

ya no entendí

El título del post es la pregunta de cómo crear un API pero el texto del post es acerca de que las bibliotecas que usó para leer PDF's no le sirvieron para lo que necesitaba.

Pero estrictamente hablando, la pregunta de cómo crear un API es referente a diseño; yo la entiendo como referente a cómo exponer una cierta funcionalidad que ya se tiene, generalmente como parte de una aplicación y que se quiere extraer. Pero si la duda es realmente de cómo leer un PDF que lo del trailer y no sé qué, eso no tiene nada que ver con diseño de APIs en general.

Y creo que nadie consideró lo que podría ser la mejor opción: si están usando bibliotecas FOSS entonces por qué no simplemente modificar el código? Si iText o la que sea hace el 90% de lo requerido y solamente falta un 10% de funcionalidad, ¿por qué desechar la biblioteca completa y crear algo desde cero? Sería mucho más fácil sólo implementar ese 10% faltante y enviar la contribución a los que mantienen el otro 90%.

Imagen de Jose Manuel

Oh ya entendí su punto de

Oh ya entendí su punto de vista. Es cierto, este tema debió tratar sobre el diseño. Supongo que es cuestión de que Sr. Negativo llegue y se de cuenta de que no es necesario. Pero llegarle de golpe a un proyecto y darle "caña" al código :O para un novato como yo se me hace una odisea jeje.

Imagen de Sr. Negativo

No, no sé que es un API :(

No, no sé que es un API :( !!

Perdón por tardar en contestar, y si estoy empezando a documentarme.

Solo quería sugerencias, pero será mejor usar PDFBox y no tratar de crear un API.

Imagen de ezamudio

API

acrónimo que significa Application Programming Interface. Es la especificación para comunicarse con uno o varios componentes de software. En Java, generalmente lo ves como una serie de interfaces, con algunas clases abstractas y/o fábricas de objetos. La meta es exponer sólo lo necesario para poder utilizar ese software, sin necesidad de exponer toda la complejidad del mismo.

Un ejemplo es la API de criptografía de Java. Puedes pedir a la clase Cipher que te entregue un objeto de ese tipo, para cifrar usando cierto algoritmo, en cierto modo y con cierto padding, simplemente invocando Cipher.getInstance("AES/CBC/PKCS5"). No necesitas saber cómo se llama la clase que usa internamente para implementar el algoritmo AES o cómo es que ese componente puede funcionar en modo CBC o CFB, ECB, etc. ni cómo aplicar el padding al final del cifrado (o validarlo al descifrar).

En tu caso, mencionas iText y PDFBox. Son dos bibliotecas de software, y ambas tiene una API, es la parte que exponen para que puedas usar la biblioteca. Una API bien diseñada te permite usar el software de la manera más básica con muy poco código pero también te permitirá tener mayor control sobre su funcionamiento de manera incremental. Probablemente alguna de esas dos bibliotecas (o ambas) tengan una manera de notificarte cuando llegan al final de una sección del documento o cuando no saben qué hacer con una parte del mismo, etc y así podrías simplemente crear un componente que sea invocado cuando se lee el trailer del documento.

Para crear un API pues hay que tener muy claro qué quieres que haga tu software, pensar muy bien cómo lo debe hacer, y qué cosas debes exponer al usuario (o sea los programadores que van a usar tu software). Te pongo como ejemplo un software mío, jAlarms: Al usuario más general de jAlarms solamente le interesa tener una referencia a un componente de tipo AlarmSender (una interfaz) para invocar uno o dos métodos del mismo y ya. Pero para configurarlo hay que tener una implementación concreta, que también es parte de la API: AlarmSenderImpl y a ese componente hay que ponerle sus canales, pero eso es algo que se puede dejar hasta el momento de llevar el sistema a producción; en desarrollo basta con tener el canal de pruebas que simplemente imprime a STDOUT. Y si de plano vas a implementar tu propio canal pues usas la parte de la API que te ofrece una interfaz, AlarmChannel, la cual debe implementar tu componente para enviar alarmas cuando el AlarmSender lo determine, o bien puedes extender AbstractAlarmChannel que resuelve varios problemas que comúnmente tienes que atacar cuando implementas un canal, dejándole al programador (a ti) solamente la tarea de enviar un mensaje por algún medio.

Imagen de Cid

Diferencia entre API y Framework ?

Hola que tal, bueno hace algunos meses me he planteado esta pregunta y la verdad no había buscado respuesta acerca del tema pero pregunte con algunas personas que conocen de estos temas, y bueno como maneja @ezamudio el concepto que siempre he tenido es que una API era un conjunto de librerias (clases e interfaces) podría no se si sea correcto o no también contener archivos de configuración, texto o imágenes si son necesarios para la API, pero un Framework según lo que me contestaron es algo parecido a una API pero la diferencia radica en que esta centrado en resolver algún problema en particular y un API es para resolver problemas no tan particulares si no un poco más genéricos, la razón por la cual me surgió la pregunta fue porque cuando tome algunos cursos siempre mencionaban API o Framework (de forma intercambiable) como si fuesen sinónimos no se si para algunas cosas si se puedan utilizar asi tal cual como sinónimos.


Esperando una respuesta oportuna agradezco me resuelvan esta duda. Saludos.

Imagen de Sr. Negativo

Re:API

...es la parte que exponen para que puedas usar la biblioteca. Una API bien diseñada te permite usar el software de la manera más básica con muy poco código pero también te permitirá tener mayor control sobre su funcionamiento de manera incremental. Probablemente alguna de esas dos bibliotecas (o ambas) tengan una manera de notificarte cuando llegan al final de una sección del documento o cuando no saben qué hacer con una parte del mismo, etc y así podrías simplemente crear un componente que sea invocado cuando se lee el trailer del documento

Gracias @ezamudio, me aclaraste lo que es un API. La verdad estaba muy perdido.

Tenia pensado crear una serie de clases para validar "a fuerzas" los documentos PDF dañados o mal formados, pero no es buena solución. Al fin al cabo el "proceso de lectura" del trailer lo hacen las librerías iText y PDFBox y no tiene caso ya que estaría validando documentos que no son PDF (lo que menciono @OscarRyz).

0_o

Imagen de ezamudio

API/Framework

Un framework es una o varias bibliotecas que te ofrecen ya varias cosas para trabajar de cierta forma. Un marco dentro del cual puedes trabajar. Los frameworks tienen APIs, es la manera en que los usas. API es algo un poco más abstracto que un framework. Twitter tiene una API para poder enviar mensajes, consultar timeline, hacer búsquedas, etc y todo es a través de REST, sobre HTTP. API simplemente es la manera en que vas a llamar o invocar un servicio o componente de software, es la manera de usarlo.

Interfaz de programación.

El API es la interfaz de programación con la aplicación ( o framework, o bilblioteca o sistema ) o sea, lo que puedes usar de ella para crear un programa.

Ejemplo, los siguientes pueden tener un API para que hagas programas que los usen ( en mi propia definición seguramente incompleta ):

Sistema ( informático por favor ) : conjunto de aplicaciones, servicios, infraestructura para el manejo automático de información
Aplicacion / Servicio : Programa completo y cerrado que realiza una funcion de forma digamos autónoma.
Framework : Marco de trabajo ( je ) que facilita la construcción de una aplicacion/servicio proveyendo las bases.
Biblioteca: conjunto de clases ( hablando en Java - POO ) que ayudan a ejecutar una función específica y muy especializada.

Por ejemplo un sistema completo como el de twitter ( re-tomando lo que menciona @ezamudio ) puede tener un API para hacer programas que se comuniquen con él. Lo mismo, una aplicación puede tener un API para hacele plugins, y un framework generalmente expone varios API's para que lo puedas usar. Una biblioteca casi casi esta definida por su API ( que es lo que usamos de ella ) . Todos por debajo todos estos pueden tener miles de detalles que no son publicos, no forman parte de la interfaz de programación, y el API puede ser tan extensa o no existir.

Imagen de Sr. Negativo

Gracias a todos por sus

Gracias a todos por sus respuestas

Imagen de rugi

Aprovechando que el hilo

Aprovechando que el hilo tiene ya varios comentarios interesantes.

Un libro relativamente nuevo(menos de un año):

APIs: A Strategy Guide [Paperback]
http://alexstechthoughts.com/post/31921473480/whats-your-api-strategy
http://www.amazon.com/APIs-Strategy-Guide-Daniel-Jacobson/dp/1449308929

Saludos....
----

Imagen de Sr. Negativo

Como NO crear un API

Pues con la novedad que ya encontré una alternativa para lo que quería hacer (el parseo de PDF), bastaba usar correctamente la librería PDFBox.

El problema es que no agregué la librería correcta pdfbox-app-1.7.1.jar, está me permite hacer un debug al PDF que quiero parsear.

Se debe agregar al classpath y tecleamos:
java  org.apache.pdfbox.PDFDebugger  documento.pdf

También puedo extraer el texto (ExtractText, con apache tika también se puede) y pasarlo a otro pdf (PDFMerger), entre otras cosas más.

Antes de "intentar" crear un API debí hacer lo siguiente:

  1. Entender qué es una API
  2. Investigar qué alternativas existen para el parseo
  3. Preguntarle a los que saben si es factible o no crear una nueva API
  4. En caso de qué sea la única alternativa, diseñar un plan para huir y esperar a que nadie te encuentre (broma)

En Internet hay muchos sitios,blogs y libros para comenzar y crear tu propia API, pero es muy avanzada la información creo yo.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">