¿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.
- http://blog.didierstevens.com/2008/10/20/analyzing-a-malicious-pdf-file/
- http://code.google.com/p/peepdf
¿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
/*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.
- Sr. Negativo's blog
- Inicie sesión o regístrese para enviar comentarios



Comentarios
Chécate Apache Tika.
Chécate Apache Tika.
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
Por cierto... creo que
Por cierto... creo que deberìas leer sobre "Apache Lucene", aun asì, los links no estàn demás :)
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
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.
Practical API Design
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
Parseo del documentos
Parseo del documentos PDF
/*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?
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.
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.
"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!!!
----
Mecanismos de generación
No había pensado en eso. Lo que quiero hacer es validar esos documentos PDF ANTES de procesarlos
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.
API?
Cuando hablas de crear una API, a qué te refieres exactamente? Sabes qué significa API?
¿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?
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%.
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.
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.
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
Cipherque te entregue un objeto de ese tipo, para cifrar usando cierto algoritmo, en cierto modo y con cierto padding, simplemente invocandoCipher.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:AlarmSenderImply 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 extenderAbstractAlarmChannelque 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.Diferencia entre API y Framework ?
Esperando una respuesta oportuna agradezco me resuelvan esta duda. Saludos.
Re:API
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
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.
Gracias a todos por sus
Gracias a todos por sus respuestas
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....
----
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.pdfTambié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:
En Internet hay muchos sitios,blogs y libros para comenzar y crear tu propia API, pero es muy avanzada la información creo yo.