Está en la página 1de 90

Documentacin del Proyecto Fin de Carrera o Diseo e Implementacin de Gestor de n o Documentos con Drupal

Ignacio Varela Andrs e Patricia Fernndez Garc a a Tutores: Enrique Alegre Gutirrez y Diego Garca Ords e a Escuela de Ingenier Industrial e Informtica as: a Universidad de Len o Convocatoria: Junio 2011 31 de mayo de 2011

UNIVERSIDAD DE LEN Escuela de Ingeniera Informtica de Len

El presente Proyecto de Fin de Carrera cuyo ttulo es Diseo e Implementacin de Gestor de Documentos con Drupal ha sido realizado por Da. Patricia Fernndez Garca y D. Ignacio Varela Andrs, alumnos de la Escuela Universitaria de Ingeniera Informtica de Len, con el fin de obtener el ttulo de Ingeniero en Informtica por la Universidad de Len. Len, Junio de 2011
V B Oficina Tcnica:

Firmado: Manuel Castejn

V B Directores de Proyecto:

Firmado: Enrique Alegre Gutirrez

Firmado: Diego Garca Ords

Autores:

Firmado: Patricia Fernndez Garca

Firmado: Ignacio Varela Andrs

Indice general
1. Objetivos del Proyecto 1.1. Motivacin y Objetivos o 7 7 9 9 11 12 12 13 13 13 14 15 15 15 16 16 17 17 18 19 19 21 23 24 24 26 26 27 27 28 28

. . . . . . . . . . . . . . . . . . . . .

2. Drupal 2.1. Introduccin . . . . . . . . . . . . . . . . o 2.2. Funcionalidades . . . . . . . . . . . . . . 2.2.1. Gestin de Usuarios . . . . . . . o 2.2.2. Gestin de Contenido . . . . . . o 2.2.3. Blogging . . . . . . . . . . . . . . 2.2.4. Plataforma . . . . . . . . . . . . 2.2.5. Administracin y Anlisis . . . . o a 2.2.6. Caracter sticas de Comunidad . . 2.2.7. Rendimiento y escalabilidad . . . 2.3. Comunidad . . . . . . . . . . . . . . . . 2.3.1. Descargas . . . . . . . . . . . . . 2.3.2. Crear la base de datos de Drupal 2.3.3. Actualizacin de Drupal . . . . . o 2.3.4. Crear cuenta de administrador . 2.3.5. Crear un nuevo bloque . . . . . . 2.3.6. Migracin del sitio web . . . . . o 2.4. Caracter sticas y Mdulos . . . . . . . . o 2.4.1. Caracter sticas . . . . . . . . . . 2.4.2. Mdulos de inters . . . . . . . . o e 2.5. Sitios realizados . . . . . . . . . . . . . . 3. Funcionalidades y soluciones adoptadas 3.1. Funcionalidades . . . . . . . . . . . . . . 3.2. Fases del desarrollo del proyecto . . . . 3.2.1. Primera Fase . . . . . . . . . . . 3.2.2. Segunda Fase . . . . . . . . . . . 3.2.3. Tercera Fase . . . . . . . . . . . 3.2.4. Cuarta Fase . . . . . . . . . . . . 3.2.5. Quinta Fase . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

3.3. Mdulos utilizados . . . . . o 3.3.1. Mdulos primarios . o 3.3.2. Mdulos secundarios o 3.4. Roles en nuestro proyecto .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

29 29 29 32 34 34 34 36 38 39

4. Indexacin de documentos o 4.1. Problema de la bsqueda e indexacin y su solucin . . u o o 4.1.1. Estudio e implementacin realizado por Patricia o 4.1.2. Estudio e implementacin realizado por Ignacio . o 4.1.3. Conclusiones obtenidas por los alumnos . . . . . 4.2. Interfaz de usuario . . . . . . . . . . . . . . . . . . . . .

. . . . .

. . . . .

. . . . .

5. Conclusiones y l neas futuras 56 5.1. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 5.2. L neas futuras . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

Indice de guras
4.1. 4.2. 4.3. 4.4. 4.5. 4.6. 4.7. 4.8. 4.9. Screen de la pantalla del Login . . . . . . . . . . . . . . . . . Pantallazo de la pgina principal . . . . . . . . . . . . . . . . a Inicio alternativo . . . . . . . . . . . . . . . . . . . . . . . . . Barra de enlaces primarios . . . . . . . . . . . . . . . . . . . . Barra de enlaces secundarios . . . . . . . . . . . . . . . . . . Icono de ayuda . . . . . . . . . . . . . . . . . . . . . . . . . . Enlace a la seccin de creacin de nodos para PDFs . . . . . o o Enlace a la seccin de creacin de nodos para DOCs . . . . . o o Enlace a la seccin de creacin de contenidos para archivos o o comprimidos . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.10. Enlace a la seccin de creacin de contenidos de Documentos o o Online . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.11. Pantalla de creacin del nodo para un archivo PDF . . . . . . o 4.12. Pantalla de creacin del nodo para un archivo DOC . . . . . o 4.13. Pantalla de creacin del nodo para un archivo comprimido . . o 4.14. Pantalla de creacin del nodo para un archivo Online . . . . . o 4.15. Organizacin de los documentos PDF . . . . . . . . . . . . . o 4.16. Organizacin de los documentos de texto . . . . . . . . . . . o 4.17. Organizacin de los documentos comprimidos . . . . . . . . . o 4.18. Organizacin de los documentos Online . . . . . . . . . . . . o 4.19. Pantalla de bsqueda simple . . . . . . . . . . . . . . . . . . . u 4.20. Pantalla de bsqueda avanzada . . . . . . . . . . . . . . . . . u 4.21. Ejemplo de bsqueda avanzada . . . . . . . . . . . . . . . . . u 4.22. Screen del botn del Cron . . . . . . . . . . . . . . . . . . . . o 4.23. Imagen de la ventana emergente citada . . . . . . . . . . . . . 5.1. Subida mltiple de archivos . . . . . . . . . . . . . . . . . . . u 5.2. Herramienta para dar soporte a la indexacin de otras exteno siones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 40 41 41 41 41 42 42 43 43 44 45 46 47 48 48 49 49 50 50 51 52 52 58 58

Resumen
En este proyecto se ha realizado el diseo, desarrollo e implementacin de n o un sitio web con capacidades de gestin documental. Entre sus caracter o sticas remarcamos la capacidad de creacin de nodos asociados a archivos de o diferentes formatos, as como la organizacin automtica de los mismos. Los o a archivos almacenados en los nodos poseen todas las capacidades de gestin o asociadas como son: visualizacin, descarga y edicin. o o Para dotar al proyecto con funcionalidades aadidas se han implemenn tado capacidades aadidas de visualizacin online mediante herramientas n o externas (mdulo iPaper), que nos permiten un visionado avanzado de los o documentos, sin necesidad de descargarlos en nuestra mquina. Pudiendo a incluso buscar dentro de ellos, seleccionar fragmentos de texto e incluso diferentes modos de visin para adecuarnos a las necesidades de cada moo mento. El sitio web est ideado para soportar un trco multiusuario con caa a pacidades para restringir el acceso a ciertos contenidos o eliminacin de o privilegios para determinadas acciones. Como capacidad estrella del sitio web se implement la indexacin de o o documentos automticos de tipo PDF mediante la modicacin e inclusin a o o de herramientas externas como Search les o Pdftotext. De esta forma, todo archivo con dicha extensin ser procesado por el sitio web realizando la o a nombrada indexacin automtica. o a Con la ultima funcionalidad implementada podremos usar el motor de bsqueda de nuestro sitio web de dos formas independientes. La primera u ser la ms bsica centrndonos unicamente en los nodos creados por los a a a a usuarios y la segunda por otro lado, permitir una bsqueda avanzada dena u tro de los archivos enlazados a los nodos de tipo PDF.

Abstract
In this project we had performed design, development and implementation of a website with document management capacity. Among features, note the capacity of node creation, associated with les of dierent formats, as well as the automatic organization of them. The les stored in nodes has all management capacities associated, as: visualization, download and edition. To give added functionality to the project, have been made other capacities of online visualization with external tools (iPaper module), that allows us an advanced view of the documents without download them in our machine. We can search inside of them, select text fragments and use dierent view modes. The website supports a multiuser trac with capacities to restrict the content access or remove the permissions for some actions. The best quality of the website is the automatic indexing of PDF format les, with the modication and inclusion of external tools, as: search les module or Pdftotext tool. Thus, any le with this format will be processed for the website doing the automatic indexing. With the latest functionality implemented, well be able to use the search engine of our website in two dierent ways. On the one hand we have the basic one: a search in nodes created by users. On the other hand we allows an advance search in the node attached les of PDF format.

Cap tulo 1

Objetivos del Proyecto


1.1. Motivacin y Objetivos o

Situacin actual, los departamentos de empresas o universidad consultan o y generan muchos documentos. Por ello ser conveniente disponer de una a herramienta web que actuara como almacn -contenedor- de esos documene tos y al mismo tiempo dotarla de capacidades de consulta a partir de la indexacin de los contenidos de los documentos depositados. o A su vez puede ser interesante para el alumnado permitiendo consultas de material sin necesidad de recurrir a las bibliotecas de los centros o a personal encargado de los art culos.

Objetivos concretos: Desarrollar un sitio web: Proceso de diseo e implementacin para n o crear un sitio web acorde a las necesidades del proyecto sobre el que trabajamos. Gestor utilizado: Drupal: Debido a las capacidades de este gestor y a su forma modular se ha elegido como mejor opcin para desarrollar el o proyecto. Capacidad de almacenamiento: Partiendo de un servidor para el almacenamiento f sico de los archivos daremos capacidad de alojar archivos de diferentes formatos y extensiones para su organizacin e indexado o en el caso del PDF.

Consulta e indexacin: Indexacin automtica de archivos con exteno o a sin .PDF. o Multiusuario: Todo el sistema se basar en una organizacin de usuaa o rios que permitan registrarse e identicarse a los diferentes integrantes de posibles departamentos u organizaciones que dan uso de este gestor.

Cap tulo 2

Drupal
2.1. Introduccin o

Drupal es un sistema de gestin de contenidos modular (hecho mediante o mdulos) y muy congurable. o Es un programa de cdigo abierto, con licencia GNU/GPL (GNU Public o License), escrito en lenguaje PHP (PHP Hypertext Pre-processor), desarrollado y mantenido por una activa comunidad de usuarios. Este gestor destaca por la calidad de su cdigo y de las pginas generadas o a y se le da un nfasis especial a la usabilidad del mismo y a la consistencia e de todo el sistema. El diseo de Drupal es especialmente idneo para construir y gestion o nar comunidades en Internet. No obstante, su exibilidad y adaptabilidad, as como la gran cantidad de mdulos adicionales disponibles, hace que sea o adecuado para realizar muchos tipos diferentes de sitio web. El sitio principal de desarrollo y coordinacin de Drupal es drupal.org, o en el que participan activamente varios miles de usuarios de todo el mundo. Drupal es un sistema de gestin de contenido para la web. El texto y o los enlaces entre el contenido son almacenados en una base de datos, y las pginas se construyen dinmicamente para ser presentadas al usuario en resa a puesta a una peticin webmediante un navegador. o El contenido en Drupal se almacena como nodos. Un nodo es un objeto de contenido genrico, que se puede corresponder con una pgina, un e a art culo, una entrada de blog, etc...

A algunos tipos de nodo, dependiendo de la conguracin, los usuarios o pueden aadir comentarios (los comentarios no se consideran como nodos). n Los nodos o los comentarios pueden necesitar ser aprobados por un administrador antes de ser publicados. La presentacin y el dise o de las pginas son gestionadas mediante o n a Temas intercambiables. La presentacin estndar de una pgina de drupal o a a (el tema), consiste en tres columnas. La columna del centro es la Columna de contenido, en la cual, la ms t a pica muestra resmenes de los nodos u publicados ms recientemente por orden de fecha. a Por ejemplo, si hace click en uno de los resmenes, el contenido completo u del nodo es mostrado en la columna central. Las columnas izquierda y derecha se llaman normalmente barras laterales, las cuales pueden mostrar bloques o informacin relacionada. o Los bloques a menudo contienen enlaces para navegar hacia otros nodos. Por ejemplo, puede haber bloques mostrando los ultimos art culos enviados o los ms populares. a Para nuevas instalaciones, se muestran el bloque de inicio de sesin y el o bloque de navegacin que contiene un men de acciones que se pueden llevar o u a cabo. Diferentes mens pueden ser mostrados en el bloque de navegacin, deu o pendiendo de lo que est haciendo y de qu privilegios o permisos (roles) e e tenga el usuario. Los bloques tambin pueden aparecer o no dependiendo de en qu parte e e del sitio web est y de qu acciones est realizando, aparte de los privilegios e e a que tenga. Por ejemplo, el bloque de inicio de sesin no aparece si la sesin ya ha o o sido iniciada, o el de art culos ms recientes puede no mostrarse si no hay a art culos disponibles. El administrador puede habilitar/deshabilitar distintos bloques siguiendo las opciones de Administrar Bloques. Los nodos se pueden clasicar en categor as, tambin llamadas taxoe nom as. Los foros son un ejemplo de nodos de contenido organizados por categor las cuales pueden ser jerrquicas lo que signica que una categor a, a a padre contiene mltiples categor hijos. u as

10

A menudo, nuevas funcionalidades son implementadas en Drupal como mdulos. Una vez que un administrador aade un archivo o carpeta de o n un mdulo en el subdirectorio mdulos, la opcin de utilizar el mdulo o o o o aparece en la seccin Administrar Mdulos. o o Si el administrador activa ese mdulo, las funcionalidades asociadas con o l se activan y aparecen en la seccin correspondiente de Drupal. e o Un mdulo puede denir un nuevos tipos de nodos, crear nuevas opciones o en el men o proporcionar nuevos bloques que estarn disponibles para u a mostrar en las barras laterales.

2.2.

Funcionalidades

1. Ayuda online. Se trata de un robusto sistema de ayuda online y pginas de ayuda para los mdulos del ncleo, tanto para usuarios como a o u para administradores. 2. B squeda. Todo el contenido en Drupal es totalmente indexado en u tiempo real y se puede consultar en cualquier momento. 3. Cdigo abierto. El cdigo fuente de Drupal est disponible de mao o a nera libre bajo los trminos de la licencia GNU/GPL. Al contrario que otros e sistemas de blogs, es posible extender o adaptar Drupal segn las necesidau des. 4. Mdulos. La comunidad de Drupal ha proporcionado muchos mduo o los que disponen de funcionalidades como pgina de categor a as, mensajes privados, bookmarks, etc. 5. Personalizacin. Un robusto entorno de personalizacin est impleo o a mentado en el ncleo de Drupal. Tanto el contenido como la presentacin u o pueden ser individualizados de acuerdo las preferencias denidas por el usuario. 6. URLs limpias. Drupal usa el modrewrite de Apache para crear URLs que son manejables por los usuarios y los motores de bsqueda. u

11

2.2.1.

Gestin de Usuarios o

Autenticacin de usuarios. o Los usuarios se pueden registrar e iniciar sesin de forma local o utilio zando un sistema de autenticacin externo. o Permisos basados en roles. Los administradores de Drupal no tienen que establecer permisos para cada usuario. En lugar de eso, pueden asignar permisos a un rol y agrupar los usuarios por roles.

2.2.2.

Gestin de Contenido o

Control de versiones. El sistema de control de versiones de Drupal permite seguir y llevar al d las sucesivas actualizaciones del contenido: qu se ha cambiado, la hora a e y la fecha, quin lo ha cambiado, y dems. e a Tambin permite mantener comentarios sobre los sucesivos cambios o e deshacer los cambios recuperando una versin anterior. o Enlaces permanentes (Permalinks). Todo el contenido creado en Drupal tiene un enlace permanente asociado a l para que pueda ser enlazado externamente sin temor de que el enlace e falle en el futuro. Objetos de Contenido (Nodos). El contenido creado en Drupal es, funcionalmente, un objeto (un nodo). Esto permite un tratamiento uniforme de la informacin, como una misma o cola de moderacin para env de diferentes tipos, promocionar cualquiera o os de estos objetos a la pgina principal o permitir comentarios (si se desea) a sobre cada objeto. Plantillas (Templates). El sistema de temas de Drupal separa el contenido de la presentacin o permitiendo controlar o cambiar fcilmente el aspecto del sitio web. a

12

2.2.3.

Blogging

Agregador de noticias. Drupal incluye un potente Agregador de Noticas para leer y publicar enlaces a noticias de otros sitios web. Incorpora un sistema de cach en la e base de datos, con temporizacin congurable. o Soporte de Blogger API. La API de Blogger permite que un sitio Drupal sea actualizado utilizando diversas herramientas, que pueden ser herramientas web o herramientas de escritorio que proporcionen un entorno de edicin ms manejable. o a

2.2.4.

Plataforma

Independencia de la base de datos. Aunque la mayor parte de las instalaciones de Drupal utilizan MySQL, existen otras opciones. Drupal incorpora una capa de abstraccin de base o de datos que actualmente est implementada y mantenida para MySQL y a PostgresSQL, aunque permite incorporar fcilmente soporte para otras baa ses de datos. Multiplataforma. Drupal ha sido diseado desde el principio para ser multiplataforma. n Puede funcionar con Apache o Microsoft IIS como servidor web y en sistemas como Linux, BSD, Solaris, Windows y Mac OS X. Por otro lado, al estar implementado en PHP, es totalmente portable. Multiples idiomas y Localizacin. o Drupal est pensado para una audiencia internacional y proporciona a opciones para crear un portal multilinge. Todo el texto puede ser fcilmente u a traducido utilizando una interfaz web, importando traducciones existentes o integrando otras herramientas de traduccin. o

2.2.5.

Administracin y Anlisis o a

Administracin v Web. o a La administracin y conguracin del sistema se puede realizar enterao o mente con un navegador y no precisa de ningn software adicional. u

13

Anlisis, Seguimiento y Estad a sticas. Drupal puede mostrar en las pginas web de administracin informes a o sobre enlaces entrantes, popularidad del contenido, o de cmo los usuarios o navegan por el sitio. Registros e Informes. Toda la actividad y los sucesos del sistema son capturados en un registro de eventos, que puede ser visualizado por un administrador.

2.2.6.

Caracter sticas de Comunidad

Comentarios enlazados. Drupal proporciona un potente modelo de comentarios enlazados que posibilita seguir y participar fcilmente en la discusin sobre el comentario a o publicado. Los comentarios son jerrquicos, como en un grupo de noticias o a un foro. Encuestas. Drupal incluye un mdulo que permite a los administradores y/o usuao rios crear encuestas online totalmente congurables. Foros de discusin. o Drupal incorpora foros de discusin para crear sitios comunitarios vivos o y dinmicos. a Libro Colaborativo. Esta caracter stica es unica de Drupal y permite crear un proyecto a ser escrito y que otros usuarios contribuyan contenido. El contenido se organiza en pginas de fcil navegacin. a a o

14

2.2.7.

Rendimiento y escalabilidad

Control de congestin. o Drupal incorpora un mecanismo de control de congestin que permite o habilitar y deshabilitar determinados mdulos o bloques dependiendo de la o carga del servidor. Este mecanismo es totalmente congurable y ajustable. Sistema de Cache. El mecanismo de cach elimina consultas a la base de datos incremene tando el rendimiento y reduciendo la carga del servidor.

2.3.

Comunidad

Aunque el desarrollo de Drupal se centraliza en drupal.og (Ingls) existen, e adems de Drupal Hispano, varias comunidades o grupos de usuarios sobre a Drupal en Espaol. n

2.3.1.

Descargas

Si queremos disponer del contenido de Drupal, podemos hacerlo a travs e del siguiente enlace: http://drupal.org/project Otras direcciones utiles son: La ultima versin estable de Drupal: o http://drupal.org/project/drupal Todos los mdulos clasicados por categor o a: http://drupal.org/project/modules Plantillas para cambiar el aspecto de tu sitio web: http://drupal.org/project/themes Archivo de traduccin para cargar en Drupal: o http://drupal.org/project/es Instalaciones preconguradas para ahorrar tiempo: http://drupal.org/project/Installation+profiles

15

2.3.2.

Crear la base de datos de Drupal

Estas instrucciones son para MySQL. Si est usando otra base de datos, a revise la documentacin de sta. En los siguientes ejemplos, user es un o e usuario de ejemplo de MySQL que tiene los privilegios de Crear. Usted debe utilizar los nombres apropiados para su sistema. Lo primero, es crear una nueva base de datos para su sitio Drupal: mysqladmin u user p create drupal MySQL pedir la contrasea para el usuario user y luego crear los ara n a chivos iniciales de la base de datos. Luego deber ingresar y establecer los a permisos de acceso a la base de datos: mysql u user p Nuevamente se preguntar la contrasea para el usuario user. En la cona n sola, ingrese el siguiente comando: GRAN T ALL P RIV ILEGES ON drupal. T O user@localhost IDEN T IF IED BY pass Donde: - drupal es el nombre de su base de datos; - user@localhost es el id de usuario de la cuenta de MySQL de su servidor web; - pass es la contrasea requerida para ingresar como usuario en MySQL. n Si los datos son correctos, MySQL responder: Query OK, 0 rows aected a

2.3.3.

Actualizacin de Drupal o

Cada pocos meses aparece una nueva versin de Drupal. Para corregir o posibles problemas de seguridad y aprovechar las nuevas funcionalidades, se recomienda tener actualizado el sitio a la ultima versin. o Nota: Antes de iniciar la actualizacin se recomienda leer esta pgina o a hasta el nal y estar seguro de haber entendido todos los pasos. Una actualizacin incompleta o realizada incorrectamente puede hacer que el sitio web o deje de funcionar.

16

Los pasos para actualizar una instalacin de Drupal son: o Hacer una copia de seguridad de los archivos del sitio web y de la base de datos. Descargar y descomprimir los nuevos archivos en la carpeta correspondiente del servidor. Ejecutar el script update.php que actualizar la base de datos. a

2.3.4.

Crear cuenta de administrador

Pasos para poder crear una cuenta de administrador, pues es imprescindible. Inicie sesin en su sitio. o Seleccione Administer, User Management, Usuarios y pulse Add user. En Nombre de usuario: escriba el nombre del Nuevo usuario. En Direccin de correo: escriba la direccin e-mail del usuario. o o En Contrasea: escriba una contrasea con ms de 6 caracteres (letras n n a y nmeros). u En Conrmar contrasea: vuelva a escribir la contrasea anterior. n n Seleccione la opcin, Noticar el usuario de la cuenta nueva. o Pulse el botn Crear cuenta nueva. o Nota: La cuenta del nuevo usuario se ha creado correctamente, pero sin privilegios de administrador.

2.3.5.

Crear un nuevo bloque

Pasos para poder crear un nuevo bloque en nuestra versin de Drupal. o 1. Inicie sesin en su sitio. o 2. Seleccione Administer, Site building, Blocks y pulse Add block. 3. En el men superior seleccione Add block, se mostrara una pgina con u a la informacin que debe insertar. o 4. En Descripcin del bloque: inserte una breve informacin sobre el bloo o que (ej. Novedades) 17

5. En T tulo del bloque: inserte un nombre para el bloque (ej. Novedades). 6. En el cuerpo del bloque: inserte un contenido para el bloque (similar a una historia o pgina). a 7. En Opciones de visibilidad personalizadas: marque una de las opciones (ej. Los usuarios no pueden controlar la visibilidad de este bloque). 8. En Mostrar el bloque en roles espec cos: no marque ninguna opcin o si desea que todos vean el bloque. 9. En Mostrar el bloque en pginas especicadas: escriba el node de las a pginas en las que desea ver/ocultar el bloque (ej. seleccione la opcin a o Mostrar solamente en las pginas de esta lista, y en el cuadro de texto a escriba node/1 para visualizar el bloque solo en la pagina de inicio). Nota: para ver el node, seleccione la pgina, en la barra URL de su a explorador web se mostrara la direccin de la pgina, siendo la ultima o a expresin el node/1 o 10. Pulse el botn Salvar el bloque. o

2.3.6.

Migracin del sitio web o

Esto es una pequea gu de como migrar un sitio web basado en Drupal n a de un servidor a otro.

Comprobacin de servidores, versiones de PHP y MySQL, mdulos de o o Apache, conectividad, etc. Subida del cdigo al servidor y creacin de un sitio de prueba con o o el mismo cdigo y una copia en caliente de la base de datos para o comprobar que todo funciona. Anuncio del evento a los usuarios, con fechas previstas y tiempo estimado de parada. Parada del sitio web original. Puesto en modo mantenimiento. Volcado de la base de datos y copia de los archivos. Puesta online del viejo sitio web en modo esttico -sin permitir inicio a de sesin ni publicacin. o o Carga de la nueva base de datos y puesta en marcha del nuevo sitio en modo mantenimiento(Slo administradores). o Pruebas del nuevo sitio web. 18

Cambio del modo mantenimiento.al modo normal de funcionamiento. Cambio del DNS, redireccionando el dominio al nuevo servidor.

2.4.
2.4.1.

Caracter sticas y Mdulos o


Caracter sticas
Book: Libros colaborativos o escritura de documentacin o

Los libros organizan los contenidos en una estructura jerrquica anidada. a Son particularmente prcticos para manuales, preguntas frecuentes, entre a otros, permitiendo agregar cap tulos, secciones, etc. a Un libro es simplemente una coleccin de nodos que estn enlazados eno tre ellos. Esos nodos son usualmente del tipo pgina de libro, pero se pueden a incluir nodos de cualquier tipo en el ndice de un libro. Cada nodo en el libro tiene un nodo padre que lo contiene. De esta manera el mdulo libro estao blece su jerarqu En un nivel dado de la jerarqu un libro puede contener a. a, muchos nodos. Todos estos nodos son organizados de acuerdo al peso que se les haya asignado. Las pginas de libro contienen un campo registro de mensajes que le a ayuda a los usuarios a entender las razones que lo motivaron a editar una pgina de libro. Cada versin editada de una pgina de libro es guardada a o a como una nueva revisin de un nodo. Esta caracter o stica hace fcil volver a a la versin anterior de una pgina. o a Como cualquier otro tipo de nodo, la edicin y adicin de nodos puede o o estar sujeta a moderacin, dependiendo de su conguracin. o o Para agregar un nuevo nodo en el libro, utilice el v nculo crear contenido pgina de libro (create contentpage). a

19

Comment: Sistema de comentarios Cuando se habilita, el mdulo comentarios de Drupal crea un grupo de o discusin para cada nodo. Los usuarios pueden publicar sus comentarios pao ra discutir sobre un tema del foro, publicaciones de diarios, art culos, pginas a de libro, etc. Un administrador tiene permisos para comentar grupos de usuarios, y los usuarios pueden (opcionalmente) editar el ultimo comentario, asumiendo que nadie ms ha comentado desde su publicacin. Control del usuario sobre a o el despliegue de comentarios. Adjunto a cada grupo de comentarios (comment board) hay un panel de control para personalizar la forma en que se muestran los comentarios. Los usuarios pueden controlar el orden cronolgico de los comentarios (primero o o ultimo al comienzo) y el nmero de comentarios que aparecer por cada u a pgina. a Otras conguraciones adicionales son: Lista plana: Despliega los comentarios en orden cronolgico sin hilos. o Lista hebrada: Despliega los comentarios agrupados de acuerdo a conversaciones. Colapsada: Despliega solo el t tulo para cada comentario. Expandida: Despliega el t tulo y el texto para cada comentario. Cuando un usuario selecciona Guardar Conguracin, los comentarios o se muestran con la nueva conguracin del usuario. Los administradores o pueden establecer opciones por defecto para el panel de control, junto con los otros valores por defecto, en administrarcomentariosconguracin. o

20

2.4.2.

Mdulos de inters o e

En esta seccin comentamos los mdulos de referencia y su funcionalio o dad asociada para una mejor comprensin de los mismos. No entraremos en o los instalados por defecto en Drupal (Core). Attachment: Mdulo interesante para adjuntar archivos a cada nodo, mejora sensio blemente el que trae instalado Drupal (upload). Con el mdulo attachement o podremos adjuntar ms de un archivo a cada nodo, adems podremos incluir a a una descripcin y un t o tulo para cada chero adjunto. Requiere instalar una tabla en la base de datos y usar otro mdulo de manejos de archivos llamao do Filemanager, ste tambin requiere aadir una nueva tabla a la base de e e n datos. Print: Mdulo que aade un enlace a cada nodo con la opcin para imprimir. Se o n o puede modicar el aspecto de la pgina imprimible modicando el archivo a print.tpl. Paging: Mdulo que permite romper nodos en varias pginas, muy util cuando o a tengamos nodos con mucho contenido, se debe usar el identicador. Este mdulo no necesita conguracin. o o AdminBlock: Mdulo que nos avisa cuando tengamos contenido pendiente de aprobao cin. o Notify: Mdulo que notica por e-mail sobre contenido nuevo publicado en la o pgina. Requiere crear una tabla en la base de datos. a

21

SiteMenu:

Mdulo capaz de crea un men con los trminos de cada categor muy o u e a, util si tu pgina est toda estructurada con taxonom Se debe establecer a a as. el permiso de uso de este mdulo en control de acceso. o

Taxonomy Menu:

Mdulo que muestra un men con cada categor y trminos que tengao u a e mos.

FeedBack:

Mdulo capaz de crear un formulario de contacto para los visitantes de o vuestra Web, muy util. Se debe establecer el permiso de uso de este mdulo o en control de acceso.

Taxonomy Image:

Mdulo que crea una imagen para cada trmino de la taxonom El uso o e a. de este mdulo es algo ms complejo pues requiere modicar el tema que se o a emplee.

TinyMCE:

Editor WYSIWYG.

UrlFilter:

Mdulo que crea un ltro de contenidos para que todos los enlaces y dio recciones de e-mail publicados en los nodos sean clikeables automticamente. a

22

MetaTags:

Aade meta tags dinmicamente a tus posts. n a

Draft:

Guarda borradores de manera automtica por si hay algn accidente a u mientras crear o editas un nodo.

ServiceLinks:

Permite aadir iconos para crear enlaces a donde queramos. n

2.5.

Sitios realizados

En este apartado del proyecto nombramos una serie de sitios web que han sido realizados con nuestro mismo gestor de contenidos y donde se podrn a observar algunos ejemplos. http://www.unileon.es http://www.noteolvidare.org http://www.ubuntu.com/ http://appdeveloper.intel.com/en-us/ http://www.mtv.co.uk/ http://www.whitehouse.gov/ http://www.amnesty.dk/ http://www.universalmusic.com/ http://www.michaeljackson.com/es/home

23

Cap tulo 3

Funcionalidades y soluciones adoptadas


3.1. Funcionalidades

La idea general de nuestro proyecto es dar un soporte virtual a todos aquellos archivos de inters para los diferentes departamentos organizados e de una forma automtica por nuestro gestor de contenidos. Se trabajar con a a Drupal 6.x. Cada usuario podr aportar, editar y/o borrar, todos y cada uno de los a archivos subidos en nuestro sitio web. Esto se puede restringir a diferentes roles para dar as un mayor control en funcin del cargo que desempee el o n usuario, por ejemplo: se podr dar acceso a los archivos para una consulta a por parte de un alumno y restringirle la modicacin de los diferentes cono tenidos. Por otro lado, un profesor encargado de un rea podr desempear prctia a n a camente las funciones de administrador, pero sin correr el riesgo de daar n la estructura general de la pgina. a Entrando en ms detalle, en cuanto a las funcionalidades, podremos citar a las siguientes: Multiformato: El sitio web permitir alojar todos los archivos indea pendientemente de su formato, y adems har una gestin y organizaa a o cin de los formatos ms importantes y utilizados para llevar a cabo o a acciones avanzadas. Estos formatos estn pensados para dar soporte a a la funcin principal de la pgina, que se concibi con el propsito o a o o de simular un archivo virtual para art culos cient cos, libros, ensayos, trabajos, etc.

24

Independiente del equipo f sico y su software: Esta idea se plante por la creciente extensin de herramientas online que nos permitan o o trabajar sin importar el lugar en el que nos encontremos, y de las caracter sticas internas del equipo. Slo es necesario tener un navegador o correctamente actualizado y por ende, una conexin a internet. De este o modo podremos trabajar y desempear todas las funcionalidades del n entorno sin preocuparnos de incompatibilidades o herramientas externas, que dicultan en algunos casos el proceso. Organizacin automtica: Para evitar involucrar a terceros en el o a proceso de mantenimiento de la web, ms all de la actualizacin y soa a o porte para usuarios, todos los procesos de organizacin y ordenacin o o se realizan automticamente siguiendo unos criterios ya jados. Tenea mos as acceso en todo momento a listas organizadas por tipo, nombre, fecha o tema donde podremos acceder a los documentos o archivos enlazados a dicho nodo o incluso editarlos evitando as la necesidad de volver a crearlos. Visionado online: Otra caracter stica novedosa del proyecto es la capacidad de visualizar o incluso buscar, copiar, etc, dentro de los documentos sin la necesidad de descargarlos en la mquina en la que nos a encontremos, sino que podremos utilizar la propia web para este n. Esta herramienta es completamente visual e interactiva con el usuario, adems de ser intuitiva y de fcil uso. a a Esta caracter stica la hemos desarrollado para los documentos de texto en cualquier formato y en especial para los documentos PDF aadindon e les una indexacin automtica en nuestro servidor. Lo cual le dar una o a a caracter stica vital para otra funcionalidad tratada ms adelante. a Herramienta de indexado: Como es habitual el dominio lleva a cabo tareas peridicas de indexado cada cierto nmero de horas (variao u ble dependiendo de la conguracin que le queramos dar). Esto evita o tener que realizar un mantenimiento innecesario y ayudar al administrador en su tarea de dar soporte a la pgina, pero en algunos casos a es necesario tener la posibilidad de realizar un indexado inmediato de los nuevos elementos. Para ello, hemos desarrollado un elemento para ciertos usuarios que les permitir realizar esta labor en cualquier a momento, y tener de inmediato actualizadas las listas o incluidos los nuevos trminos en las bsquedas realizadas. e u

25

B squedas: Para aumentar las capacidades bsicas de bsqueda denu a u tro de los elementos alojados en nuestro servidor hemos trabajado en una herramienta adicional que nos permitir no slo buscar en los noa o dos creados por los usuarios (t tulos, comentarios, palabras clave, etc.), sino que nos dar la oportunidad de realizar bsquedas dentro de los a u archivos enlazados por los usuarios en formato PDF. Seguimiento de las diferentes categor as: En algunas ocasiones puede ser interesante para ciertos usuarios recibir avisos cuando nuevo material es alojado en la pgina, para ello tenemos a nuestro alcance a la funcionalidad de suscribirnos a las diferentes secciones que abarca nuestro archivo y recibir as avisos instantneos v e-mail, para aque a a llos usuarios que precisen un control ms avanzado de lo que se publica. a

3.2.

Fases del desarrollo del proyecto

A continuacin relataremos las fases por las que atraves el proceso de o o creacin de este proyecto. A todas estas fases sumaremos una depuracin o o constante del entorno que en un punto intermedio del proyecto tuvo que ser reiniciado para dar una mayor exibilidad al website.

3.2.1.

Primera Fase

En primer lugar llevamos a cabo una labor de estudio sobre software ya existente que ya llevaban a cabo la gestin de documentos de un usuario. o Una vez localizados estos, estudiamos las caracter sticas que ofrec paan ra decidir si podr ser utiles en el entorno en el que pensbamos trabajar, an a as como asimilar las carencias de estos y ofrecer unos servicios adicionales que aumentaran su atractivo conllevando una mejora del servicio, que ya daba este software. Podremos citar como ejemplos de software sobre el que investigamos los siguientes: Aigaion y Bebop (Open source), Biblioscape, Bibus y Pybliographer (otros ejemplos de cdigo abierto) y Bookends. o

26

3.2.2.

Segunda Fase

En esta fase realizamos el salto de las funcionalidades seleccionadas en la primera parte del proyecto, a la pre-conguracin y seleccin de las difereno o tes herramientas necesarias para incluir stas utilidades en nuestro website. e Este proceso se alargar a las siguientes fases debido a los per a odos comunes dentro de un proyecto de ensayo y error. Adems de la depuracin a o nal, una vez conseguido nuestro propsito. o A mayores se realiz una pre-conguracin de los motores de vistas y o o bsquedas que organizar nuestros contenidos, as como una primera disu an tribucin de los bloques necesarios para el usuario. o

3.2.3.

Tercera Fase

Una vez superado el primer tramo del proyecto nos centramos en las funcionalidades de las de dif solucin pero que a su vez podr considerarse cil o an las que dan un matiz diferente y atractivo a nuestro proyecto. Adems, en esta parte tuvimos que lidiar con ciertos problemas asociados a al servidor en el que nos alojamos (Windows Server 2003). Algunas de las herramientas externas que necesitbamos incluir en el servidor eran incoma patibles y fueron necesarias algunas modicaciones en el cdigo, as como o versiones espec cas para conseguir un correcto funcionamiento de las utilidades intermedias. Todo ello, para resolver el problema de indexacin de documentos del o que hablamos anteriormente. Como necesitbamos un estudio preliminar para denir cual ser la fora a ma ms adecuada de abordar el problema, volvimos a realizar un estudio a de los diferentes caminos que pod amos seguir. Para ello, cada uno de los integrantes del grupo realiz un anlisis en profundidad de las diferentes heo a rramientas que nos podr ayudar a resolver el problema. Citaremos como an objetos del estudio los siguientes: Swish-e: Herramienta externa que permite el indexado. Pdf2Text: Mdulo desarrollado por la comunidad de Drupal para eso ta misma funcin. o

27

Search Files: Otro de los mdulos destacados por los usuarios. o PdfToText (incluido en el paquete XPDF): Otra herramienta externa para resolver este problema.

3.2.4.

Cuarta Fase

Es una continuacin de la anterior debido a la complejidad y a los cono tinuos problemas que iban surgiendo a medida que avanzbamos en nuestro a trabajo. En este punto conseguimos dar la funcionalidad que quer amos con algunas de las herramientas anteriormente citadas, pero continuamos con el resto de ellas para una vez alcanzado el funcionamiento de todas ellas si fuese posible, analizarlas todas en conjunto y decidir cul se adapta ms a a a nuestras exigencias, as como analizar la potencia de cada uno de ellos.

3.2.5.

Quinta Fase

En esta ultima fase decidimos que la solucin ms factible para resolver o a el problema es la combinacin de la herramienta externa PdfToText y el o mdulo Search Files que resultaron ser el camino ptimo para la correcta o o indexacin de los documentos. o A todo ello se le suma una depuracin de todo lo anterior para dar un o atractivo adicional a la pgina. Punto a tener en cuenta y que en muchas a ocasiones es lo que falla aunque el proyecto sea bueno.

28

3.3.
3.3.1.

Mdulos utilizados o
Mdulos primarios o

Estos mdulos proveern de las funcionalidades principales para nuestro o a proyecto.

CCK (Content Construction Kit)

En el proyecto utilizaremos este mdulo para proveer a la pgina de los o a contenidos espec cos necesarios, o lo que es lo mismo, nos permite crear unos contenidos exclusivos con las funcionalidades que necesitemos. Ejemplo: necesitamos un contenido en el cual podamos aadir adems n a del cuerpo y el t tulo que vienen por defecto en una pgina, otra seccin para a o la descripcin del archivo, categor y departamento a donde pertenece. o a

Views

Con esta herramienta conseguiremos un despliegue de los diferentes campos de los contenidos segn nuestras necesidades. Si solo requerimos un lisu tado de los t tulos de cada archivo, sin mostrar los cuerpos o los cheros asociados, podremos denir esos criterios y mostrarlos al usuario.

3.3.2.

Mdulos secundarios o

Estos mdulos proveern se quedarn tan solo en dar unas funcionalio a a dades concretas sin llegar a ser imprescindibles para nuestro proyecto.

Panels

Con este mdulo pretendemos dar una presentacin ms organizada de o o a los contenidos, as como mejorar el aspecto de la pgina. Cada uno de los a nodos de la pgina ir incluido en un panel para no perder as la armon a a a del diseo. n

29

Mdulo asociado al panels: o Chaos tool suite El mdulo panels necesita para su correcto funcionamiento un mdulo o o asociado, el cual citaremos pero no especicaremos su funcionalidad ya que no sale del rango de accin del panels (no tienen otra utilidad dentro de o nuestra pgina). a

Backup and Migrate

Con este mdulo cubriremos los respaldos del servidor de una forma o sencilla y rpida (aunque se podr realizar a travs del gestor de bases de a a e datos PhpMyAdmin) opinamos que una herramienta espec ca de Drupal realizar una mejor funcin que la tcnica manual. a o e

FCKEditor Unicamente utilizado para gestionar de forma sencilla etiquetas HTML, pudiendo cambiar el tipo de texto, caracter sticas del mismo e incluso incluir imgenes, sin tener que recurrir a la edicin del texto HTML, lo cual podr a o a suponer errores tipogrcos, entre otros. a

IMCE

Este mdulo nos ha servido para la gestin de imgenes asociadas a los o o a archivos que vamos a alojar. Por ejemplo, podr amos incluir una miniatura de la primera pgina del PDF o en ausencia de esta, mostrar un icono del a tipo de archivo en cada caso (PDF, .DOC, .DOCX, .TEX, etc).

iPaper

Con este mdulo pretendemos facilitar una forma de visualizar los docuo mentos sin necesidad de descargar el archivo o disponer de la ultima versin o de tu navegador.

30

ImageCache

Mdulo utilizado unicamente para un correcto uso de las diferentes imgeo a nes utilizadas dentro de nuestro servidor y dar una mayor compatibilidad a los diferentes formatos del mercado.

Mail

Mdulo que nos ayud a resolver el problema del correo de avisos para los o o usuarios suscritos a las diferentes modalidades de nuestro gestor documental.

Rules

Mdulo en el que nos apoyamos para realizar acciones automticas sin o a la necesidad de ningn intermediario adicional. u Se basa en una serie de disparadores (triggers) que realizan una funcin o cuando un evento es registrado, por ejemplo: Accin: Se crea un nuevo PDF. o Reaccin: Se manda un e-mail de aviso a todos los usuarios enlazados a esta o categor a.

SearchFiles

Este mdulo est combinado con la herramienta externa PdfToText citao a do anteriormente y que nos da la funcionalidad de indexacin que ven o amos buscando desde los inicios del proyecto.

WebForm

Con l damos la capacidad al usuario de suscribirse a las diferentes cae tegor de las que se compone nuestro gestor documental web. as

31

3.4.

Roles en nuestro proyecto

Como hemos citado anteriormente nuestro proyecto est diseado de tal a n manera que disponemos de un completo esquema de roles asociados a cada usuario. De esta forma podr ser orientado de la manera que ms convenga a a a cada departamento (posible implementacin de este trabajo). As podremos o distinguir por ejemplo, tres tipos de usuarios:

Usuario del Claustro: Este tipo de usuario ser la representacin de a o todo aquel encargado de alguna seccin de las asignaturas del deparo tamento y dependiendo de su rango podr aadir art a n culos, trabajos o proyectos a la seccin que le corresponda. Podr existir a su vez o a un Jefe de departamento que tuviera la posibilidad de aadir o editar n todos los contenidos y secciones del mismo. Este tipo de usuarios ser tan adaptable como nosotros quisiramos. a e Tan slo habr que hacer una modicacin de los permisos y tendr o a o a acceso a ms de una seccin para su modicacin o ampliacin si se a o o o tratase por ejemplo, de un usuario involucrado en varias secciones. Usuario de Consulta: Este tipo tendr acceso a todos los art a culos que nosotros considersemos oportuno, pero nunca tendr opcin a a a o modicar el contenido del sitio web. De ah el nombre de este rol. Ejemplos que podr amos englobar en este tipo de usuarios ser an: Alumnos que necesitan acceder a cierta documentacin para poo sibles trabajos, proyectos, toma de informacin o estudio simpleo mente. Otro profesorado que no pertenezca al departamento pero que necesite realizar alguna consulta en el material disponible sin que esto conlleve un riesgo para el sitio web en general. Ambos roles citados anteriormente ser controlados y administrados an por el ultimo usuario que citaremos a continuacin. o

32

Usuario de Administracin: Este es el ultimo tipo de usuario y o no menos importante es el de administrador. Aparte de las labores de mantenimiento de la web, tiene asociados el control de todos los anteriores, as como la creacin de nuevos usuarios, modicacin, cambio o o de permisos, etc., y a mayores tendr la posibilidad de desarrollar un a nuevo tipo de rol para futuras ampliaciones de funcionalidades de la pgina. a Este usuario deber de conocer correctamente el funcionamiento de a Drupal, as como la estructura y conguraciones espec cas del sitio web. Por lo tanto, podr amos decir que ser necesario un usuario del a alto nivel, no necesariamente relacionado con el departamento, para llevar a cabo todas estas tareas.

33

Cap tulo 4

Indexacin de documentos o
En este cap tulo de la memoria trataremos de acercar el trabajo realizado y la solucin obtenida para realizar esta funcionalidad sobre el sitio web. o

4.1.
4.1.1.

Problema de la b squeda e indexacin y su u o solucin o


Estudio e implementacin realizado por Patricia o

Como parte del trabajo se ha conseguido ejecutar una herramienta externa a Drupal llamada pdftotext por medio de la consola de windows. Se ha comprobado que funciona y hecho que por medio del mdulo (tambin o e modicado por mi parte) search les, el cual busca en todo tipo de documentos indexados obligndole a que lo haga con el pdftotext, haga todo tipo a de bsquedas indexadas. u Especicacin del Pdftotext: o Pdftotext es una utilidad libre por l nea de comandos para convertir archivos PDF a texto plano. Por ejemplo, extraer datos de texto de archivos encapsulados PDF. Est disponible gratis e incluido por defecto con muchas a de las distribuciones Linux, as como tambin para Windows (como parte e de la distribucin XPDF). o

34

Especicacin del Search les: o Search Files permite la bsqueda en los archivos enlazados a los nodos y u en directorios arbitrarios. El texto es extra por aplicaciones externas de do ayuda. Con el n de extraer texto, este mdulo llama a las aplicaciones de ayuo da como Cat y Pdftotext. Los administradores de Drupal pueden congurar cualquier aplicacin de ayuda que necesiten. Las aplicaciones de ayuda neo cesitan ser instalas en el server y conguradas para imprimir la salida. Modicacin del pdftotext: o En este caso se ha tenido que bajar una versin especica que recomeno daban para que funcionase correctamente en el Windows Server 2003. Para que funcione sin problemas se ha tenido que meter en el directorio les de nuestro server. Esta es la ruta: E:\apps\xampp\htdocs\pitia\pfc\sites\default\files\ Para poder ejecutar correctamente la aplicacin hay que aadir el sio n guiente comando sobre la ruta anterior y todo ello integrarlo en Drupal: $> pdftotext.exe %file% Modicacin del search les: o Se ha modicado el archivo search les.module, concretamente en esta funcin: o function search_files_overview() { $output = ; $output .= " Search Files in <ul> <li>Attachments</li> <li>Directories</li> </ul> and extract their content for index and use with Drupal search. <p> <a href=\"search_files/attachments\">Manage Attachments</a><br /> <a href=\"search_files/helpers\">Manage Helpers</a> </p> 35

"; return $output; } Inconvenientes: Hay que pasar el Cron cada vez que subimos un PDF y queremos indexarlo para hacer sus correspondientes bsquedas. Aunque automticamente u a lo haga Drupal cada hora. Otro detalle es que dependiendo del tamao el Cron tardar ms en indexar. n a a

4.1.2.

Estudio e implementacin realizado por Ignacio o

Este punto del trabajo se ha dedicado al estudio y conguracin de los o mdulos Pdf2text y Swish-e, que a su vez hace uso de la herramienta extero na XPDF. A continuacin se har un pequeo resumen de todo el trabajo o a n realizado. Ambos mdulos en principio deber poder resolver nuestro proo an blema pero como veremos ms adelante lo harn de una forma poco ptima a a o o simplemente no lo harn. a Especicacin del Swish-e: o The Swish-E Indexer module is an implementation of of the open source Swish-E Search Engine (http://www.swish-e.org). This module will index uploaded les and will allow users to search over the full text of those documents. The module requires the installation of the Swish-E search engine and several dierent le lters to support fulltext indexing of various le types. The following le types are currently supported: Microsoft Word - catdoc Microsoft Excel - xls2csv Microsoft Powerpoint - ppthtml PDF - pdftotext RTF - unrtf Especicacin del Pdf2text: o This module provide users to upload PDF document in any content type. The uploaded PDF document will automatically convert into plain text in the body eld of the content type. This will make it easier for users to edit it and a number of them can be appended on after the other. Besides it, searching will be easy and document need not to be downloaded every

36

time to view it. Trabajo y estudio con Swish-e: En principio esta herramienta parec una solucin factible y adecuada a o para el problema de la bsqueda y la indexacin en documentos de tipo u o PDF, se comenz la bsqueda y el primer problema que surgi fue una o u o inexistencia del mdulo ocial para la versin de Drupal 6.x que es la que o o nosotros utilizamos. S exist en cambio, una versin en desarrollo para ella a o y se intent una pre-conguracin de la misma sobre el servidor. Despus de o o e su instalacin se realiz pruebas sin xito y decidimos seguir informndonos o o e a sobre el mdulo. o En pocas bsquedas se comenz a notar un problema generalizado del u o mdulo para los usuarios que intentaron el uso en esta versin (6.x). Una o o bsqueda en mayor profundidad nos llev a algunos art u o culos sobre el abandono de este proyecto por los usuarios de la comunidad, centrndose en el a mdulo Search les, el cual implementaba las funcionalidades de Swish-e y o s ten soporte para nuestra versin. a o Al alcanzar una solucin con el Pdf2text y los resultados de mi como paera se consider suciente para decantarnos por una solucin factible y n o o o ptima para el problema. Trabajo y estudio con Pdf2text: De utilizacin ms simple que los otros con los que nos hemos encontrao a do a lo largo de este problema, parec dar una solucin parcial al indexado a o pero de una forma poco ptima a primera vista. o Por defecto, slo te permit una indexacin de los PDFs que tuvieran o a o un mximo de 3MB. Obviamente, no podr a amos hacer uso del mdulo para o este n. Como alternativa y viendo que el resultado para los PDFs menores de 3MB era aceptable, ya que creaba nodos con toda la informacin del doo cumento, se decidi intentar realizar una modicacin del cdigo del propio o o o mdulo para eliminar esta restriccin. o o

37

Sobre el archivo pdf2text.module modicamos las siguientes l neas de cdigo: o function pdf2text_file_limits($user) { return array( extensions => pdf, file_size => 1048576 * 1000, user_size => 1048576 * 1000, resolution => 0, // zero for no limit ); } Con esto conseguimos aumentar el l mite de los PDFs a 1GB, partiendo de la base de que no habr documentos mayores a ese tamao en nuestro a n servidor. Aun as si hubiera sido viable este tamao se podr haber vuelto , n a a modicar para las cantidades necesarias. El problema surgi con el tiempo de procesado, pues descubrimos que o la limitacin de memoria no era aleatoria sino que a partir de ese tamao o n el tiempo de conversin aumentaba exponencialmente. Para probarlo se utio lizaron archivos de 5, 10 e incluso 60MB para poder hacernos una idea, y el resultado fue: tiempos de procesados superiores a los 30 minutos para documentos de estos tamaos, alcanzando incluso la hora con el de 60MB. n Inconvenientes: Aunque se consigui llegar a una solucin parcial con el Pdf2text consio o deramos que no es viable por la poca optimizacin en el proceso. El Swish-e o podr haber sido una solucin pero este proyecto evolucion a travs del a o o e Search les y dej de ser actualizado y mantenido por los creadores. o

4.1.3.

Conclusiones obtenidas por los alumnos

Despus de el trabajo realizado opinamos que la opcin de search les e o y pdftotext es la opcin ms ptima para el servidor, debido a la rpida o a o a indexacin que realiza comparndola con la otra opcin. o a o Aunque requiere una conguracin bastante extensa, una vez conseguida o resulta una solucin ptima. o o Creemos que es ms correcto indexar todos los cheros adjuntos de tipo a PDF antes que una carpeta espec ca, al no poder tener ambas opciones.

38

4.2.

Interfaz de usuario

En esta seccin vamos a explicar de un modo grco los componentes o a ms implicados en nuestro proyecto. a Para comenzar dirigindonos a la direccin http://pitia.unileon.es/ e o pfc, sin haber hecho un login previo nos redireccionar a la siguiente pana talla en la que los diferentes usuarios podrn acceder a su cuenta, as como a a la recuperacin de su contrasea si sta ha sido extraviada. o n e

Figura 4.1: Screen de la pantalla del Login

39

Una vez realizada la identicacin del usuario, nos enlazar con la pgio a a na principal, la cual variar dependiendo de los privilegios que ostente el a usuario registrado (en este caso la screen mostrar los elementos visibles a para un usuario de tipo profesor del departamento).

Figura 4.2: Pantallazo de la pgina principal a

40

Ahora realizaremos un breve recorrido por los elementos de navegacin de la web. o En primer lugar, en la esquina superior izquierda, justo debajo de los enlaces secundarios se encuentra el logo identicativo de nuestro proyecto, que a su vez hemos dotado de la capacidad de redireccionamiento a la pgina a principal (home).

Figura 4.3: Inicio alternativo En segundo lugar, tendremos la barra de accesos primarios, en la que adems de contar con un botn de inicio alternativo o primario, contaremos a o con todas las organizaciones (listas) de documentos que posteriormente explicaremos. Cuenta a su vez con un ultimo elemento que da acceso al formulario de suscripcin anteriormente explicado. o

Figura 4.4: Barra de enlaces primarios Y en tercer lugar, tendremos una segunda barra de navegacin con eleo mentos de ayuda sobre el proyecto, as como un elemento de desconexin. o

Figura 4.5: Barra de enlaces secundarios Como elemento adicional contaremos con el acceso de ayuda de la pgina a web.

Figura 4.6: Icono de ayuda 41

En este punto haremos mencin de los elementos de creacin de nueo o vos contenidos de documentos o cheros. Situados en la parte central del sitio web, en nuestra pgina de inicio, a comenzamos con un enlace a la creacin de nuevos nodos para documentos o PDF, los cuales sern indexados para bsquedas avanzadas. a u

Figura 4.7: Enlace a la seccin de creacin de nodos para PDFs o o Situado a la derecha del primero encontraremos el enlace para la subida de nuevos documentos con extensin de texto editable (.DOC, .ODT, .TXT, o etc.).

Figura 4.8: Enlace a la seccin de creacin de nodos para DOCs o o

42

En la esquina inferior izquierda de este conjunto de bloques, tendremos adems la posibilidad de enlazar archivos comprimidos a nuestro servidor. a

Figura 4.9: Enlace a la seccin de creacin de contenidos para archivos como o primidos Por ultimo y como herramienta adicional, ponemos al alcance del usua rio un sistema de enlazado para todo tipo de documentos de texto, que nos permitirn realizar una vista sobre la propia web del mismo. a

Figura 4.10: Enlace a la seccin de creacin de contenidos de Documentos o o Online

43

Siguiendo los enlaces de los bloques centrales explicados en el punto anterior, tenemos acceso al propio sistema de creacin de cada uno de ellos. o Partiendo, en primer lugar, de la creacin de tipos PDF llegar o amos a una seccin como la que mostramos en la siguiente captura de pantalla. o En ella tendremos un total de 6 elementos, empezando por el t tulo del documento (obligatorio), seguido de un campo body (opcional), en el cual podemos aadir informacin de inters que creamos conveniente, un desn o e plegable para enlazar el documento en cuestin (File attachments) y sobre o el que se realizar la indexacin. Como siguiente elemento tendremos un a o campo keywords para las palabras clave, un elemento desplegable con las categor disponibles y la opcin adicional y de enlazar el archivo para su as o vista online.

Figura 4.11: Pantalla de creacin del nodo para un archivo PDF o

44

Siguiendo el orden de los bloques anteriores llegamos a la seccin para o la creacin de elementos DOC. o En l tenemos 5 campos similares al anterior cambiando unicamente en e el campo Linked le que corresponder al lugar donde deberemos hacer un a upload de nuestro archivo. Y carece del elemento de vista Online, ya que esa opcin se da en el bloque de Online. o

Figura 4.12: Pantalla de creacin del nodo para un archivo DOC o

45

Continuamos con el anlisis de creacin de elementos de nuestro sitio a o web. El tercer elemento de nuestros bloques, nos da la opcin de crear un o nodo similar al citado justo encima pero en este caso, para archivos con extensiones de elementos comprimidos (.ZIP, .TAR, .TAR-GZ, .RAR, etc.).

Figura 4.13: Pantalla de creacin del nodo para un archivo comprimido o

46

En el ultimo caso, tenemos la posibilidad, como hemos ido anunciando, de crear elementos Online para su visionado desde nuestro sitio web. Adems de los campos body y title, disponibles en el resto de creaciones a de nodos tenemos los siguientes: 3 campos opcionales y solo rellenables en el caso en el que queramos incluir un documento ya existente en nuestro repositorio (en la mayor de los casos ser un documento nuevo y obviaremos a a estos campos, relegndolos a situaciones muy espec a cas). Por ultimo, tenemos un campo denominado File attachments similar a los citados anteriormente pero no slo realizar un enlazado del archivo, sino o a que crear una vista online del mismo, similar a la explicada en la creacin a o de nodos de tipo PDF.

Figura 4.14: Pantalla de creacin del nodo para un archivo Online o

47

Ahora entramos en la seccin de nuestros motores de vistas, los cuales o realizan la organizacin automtica de todos los contenidos creados por los o a bloques anteriores. Disponemos de una vista para los elementos asociados a documentos .PDF, ordenados alfabticamente por el campo t e tulo (sta ordenacin puee o de ser variada segn convenga para ajustarse a nuestras necesidades o lo que u es lo mismo, esta vista est ordenada orientativamente). a A su vez, disponemos de otro campo editable (category), as como un enlace a la edicin de borrado, editado y archivo enlazado en cada nodo. o

Figura 4.15: Organizacin de los documentos PDF o Similar al citado PDF, unicamente diere en el tipo de documento.

Figura 4.16: Organizacin de los documentos de texto o

48

Aqu mostramos un ejemplo de vista de archivos comprimidos.

Figura 4.17: Organizacin de los documentos comprimidos o Otro ejemplo de vista para mostrar los documentos Online de nuestra web.

Figura 4.18: Organizacin de los documentos Online o

49

Elemento importante dentro de nuestra estructura general es el apartado relacionado con las bsquedas, diferenciando en estos dos tipos principales: u Bsquedas enlazadas a los elementos propios del sitio web, tomndose u a estos como todas aquellas palabras introducidas por el usuario al crear un nuevo nodo (campos body, title, keywords, category, etc.). En la siguiente imagen mostramos el elemento de bsqueda simple de u nuestra web. Para utilizarlo tan slo necesitamos introducir la palabra o o palabras a buscar en el espacio reservado en gris.

Figura 4.19: Pantalla de bsqueda simple u Por otra parte, tenemos una bsqueda espec u ca diseada por los inten grantes del proyecto accediendo desde el bloque anterior. Tan slo debemos o pulsar la palabra here presente debajo del cajet sobre el que especicamos n las palabras de la bsqueda simple. De esta forma ser u amos redireccionados al siguiente elemento representado por la captura de pantalla inferior. En l sobre la pestaa Attachments tendremos un modelo similar al ane n terior en el cual debemos introducir las palabras a buscar pero en este caso no en el contenido creado sino en los archivos enlazados de tipo PDF.

Figura 4.20: Pantalla de bsqueda avanzada u

50

Como ejemplo de salida de bsqueda avanzada tenemos la siguiente capu tura. En ella vemos un listado de los archivos enlazados que contienen las palabras especicadas en la bsqueda, las cuales enlazan con el propio aru chivo. Adems al pie de cada elemento mostrado en la bsqueda disponemos a u de la autor del nodo, as como un enlace al nodo en cuestin (para modia o carlo, editarlo o visualizarlo). Estas bsquedas tienen como caracter u stica principal una ordenacin por o aparicin de la palabra especicada en la bsqueda, es decir, un documento o u con ms repeticiones de la palabra que otro tendr una posicin superior a a o en el listado.

Figura 4.21: Ejemplo de bsqueda avanzada u

51

En la parte superior izquierda de la web tenemos un botn llamado o Cron, el cual sirve para indexar inmediatamente los documentos PDF recin subidos a la pgina. e a Debemos saber que hemos congurado que la propia pgina web haa ga el Cron (indexado) automticamente cada hora, pero en caso de que el a usuario por el motivo que sea, quiere hacer una bsqueda dentro del docuu mento, ha de indexarlo ipso facto y para ello es necesario hacer uso del Cron.

Figura 4.22: Screen del botn del Cron o En el momento que pinchemos en esta parte y haya realizado correctamente el indexado (tardar acorde al tamao del documento), nos saldr una a n a ventana emergente como la siguiente dicindonos que el indexado ha sido e realizado con xito y ya podr e amos hacer uso de las bsquedas. u

Figura 4.23: Imagen de la ventana emergente citada 52

Nos ha parecido util crear una solicitud en la que cada usuario, cuando desee, puede registrarse y apuntarse en la categor de la que ms desee estar a a al tanto de las subidas, o del tipo de documento que se suba, y as recibir un correo de aviso, en la direccin que nos proporcione, de tal evento. o

53

Como parte aadida a la pgina, hemos creado un contenido en el que n a explique al usuario que desee saberlo, las caracter sticas del sitio a modo de ayuda si la necesitase. En este apartado explicamos todas y cada una de las actividades, funciones y controles de las que est disponible la pgina web. a a

54

Por ultimo, proporcionamos al usuario como en cualquier otra pgina un a mapa del sitio, para saber en todo momento a que lugares/contenidos es capaz de acceder, as como un enlace directo al sitio en cuestin, sin tener o que estar navegando por la web hasta llegar a nuestro destino.

55

Cap tulo 5

Conclusiones y l neas futuras


5.1. Conclusiones

Habiendo nalizado el proyecto y profundizado ampliamente en las capacidades de gestin en Drupal, hemos apreciado la potencia que puede llegar o a desarrollar este entorno con una combinacin de distintas herramientas. o En nuestro caso hemos dotado al sitio web con capacidades automticas a de organizacin, dando al usuario la libertad de centrarse tan slo en su o o trabajo evitando as las tareas engorrosas de mantenimiento y gestin del o mismo. Sobre los mdulos y herramientas externas utilizados remarcaremos la o gran optimizacin de indexacin obtenida y sobretodo la eciencia de ejeo o cucin de Pdftotext. No obstante, consideramos alguna de las partes de su o conguracin y enlazado demasiado complicadas como para plantearse moo dicaciones a la ligera en este campo. Se podr tener en mente tan slo una a o ampliacin de las capacidades mediante otras herramientas externas como o explicaremos en puntos siguientes. Aunque no podamos ver si este proyecto ocupar un lugar real el algn a u departamento o seccin de la universidad, creemos a ciencia cierta, que tiene o las capacidades necesarias para ser una herramienta de gran utilidad haciendo un correcto uso de ella. Como experiencia personal podemos armar que en algunas ocasiones, a lo largo de nuestro aprendizaje, hemos echado en falta una plataforma que englobase todas estas caracter sticas. Por lo tanto, recomendamos tener este trabajo en cuenta y evitar que acabe engrosando simplemente los archivos de proyectos de la escuela.

56

5.2.

L neas futuras

Habiendo llegado al punto de desarrollo actual del proyecto, nos dimos cuenta que cabe la posibilidad de llegar a implantar el gestor de manera real en algn mbito de la universidad. Por lo tanto, quisimos aportar nuestro u a conocimiento para solucionar este problema en la pgina web: a

Carga m ltiple de archivos: Si en algn momento este gestor llega u u a utilizarse de una manera prol fera y abundante, podr darse el caso a en el que se necesite una actualizacin constante y a gran escala de o contenidos, como puede ser la subida simultnea de un gran nmero a u de archivos. En el estado actual en el que est la web, la indexacin se realiza a o mediante distintas herramientas, pero slo en el caso de una creacin o o individual de cada nodo. A pequea escala esto no es una traba pero n orientado al caso antes citado, si podr llegar a serlo. a Solucin encontrada: Para solventarlo utilizamos el mdulo CCK o o junto con search les y la herramienta externa PdfToText. Con el primero creamos un campo mltiple de carga de archivos que u soluciona la primera parte del problema, pero posteriormente realizamos una modicacin en el search les para que acepte estos campos o como objetivos de la indexacin. En principio, slo ten en consideo o a racin el campo le attachments para este n. o

57

Con esto damos pie a siguientes mejoras para la indexacin del resto o de documentos, no slo de tipo PDF. As conseguimos dar soporte a o un mayor abanico de posibilidades y mayor ecacia para el usuario.

Figura 5.1: Subida mltiple de archivos u Como inicio del estudio para resolverlo, citamos la herramienta que engloba PdfToText, pero que da soporte a otras extensiones.

Figura 5.2: Herramienta para dar soporte a la indexacin de otras extensioo nes

58

Funcionalidad de edicin de texto online a adida: En el estudio o n inicial de documentacin sobre las funcionalidades de software de tero ceros y sitios web similares al nuestro, encontramos un ejemplo muy interesante para futuros estudios de mejora del sitio web. El que ms nos llamo la atencin fue el encontrado en el gestor docua o mental online documany. En l tenemos la opcin de editar en l e o nea nuestros documentos y guardar los cambios sin tener que descargar en ningn momento el documento ni herramientas adicionales en nuestra u mquina. a Esta mejora dar un recurso excepcional en nuestro entorno educativo a llegando incluso a un ahorro de costes en licencias de nuestros equipos. Mejora del servidor: Todo el proyecto ha sido realizado en un servidor con caracter sticas acordes a las pruebas bsicas para su implea mentacin. Para una puesta en marcha real del proyecto, consideramos o que es aconsejable un servidor propio para un traco medio/alto del sitio. Un proceso uido de trabajo es fundamental para el xito de una e plataforma de este estilo. Estas son algunas de las mejoras que se nos ocurren si en algn momento u se decide continuar con el desarrollo del proyecto.

59

Bibliograf a
[1] Angela Byron, Addison Berry, Nathan Haug, Je Eaton Using Drupal, Grupo Anaya Comercial, 2009. [2] John K. VanDyk Pro Drupal Development, Editorial Board, 2008. [3] Greg James Knaddison Cracking Drupal: A Drop in the Bucket, Editorial Ilustrada, 2009. [4] http://www.drupal.org [5] http://drupal.org.es/ [6] http://drupal.org.es/drupal [7] http://www.drupalweb.com/ [8] http://drupalmania.com/ [9] http://www.documany.com

60

Anexos
Cdigo editado de los mdulos Search les y pdf2text modicados en la o o fase de indexacin automtica de documentos o a

Cdigo Search Files o


Cdigo completo de la modicacin realizada en el archivo search les.module: o o <?php // $Id: search_files.module,v 1.19.2.24 2009/08/30 21:23:30 thl Exp $ /** * @file * Used to index files in attachments and directories */ /** * Implementation of hook_menu(). * * @return $items = array of menu items */ function search_files_menu() { $items = array(); $items[admin/settings/search_files] = array( title => Search Files, description => Manage searching for files in attachments and directories, page callback => search_files_overview, access arguments => array(administer search_files configuration), type => MENU_NORMAL_ITEM, ); $items[admin/settings/search_files/helpers] = array( title => Helpers, description => List Search Files Helper Applications, page callback => search_files_helper_list, access arguments => array(administer search_files configuration), 61

type => MENU_NORMAL_ITEM, weight => 0, ); $items[admin/settings/search_files/helpers/list] = array( title => List, description => List Search Files Helper Applications, page callback => search_files_helper_list, access arguments => array(administer search_files configuration), type => MENU_DEFAULT_LOCAL_TASK, weight => 0, ); $items[admin/settings/search_files/helpers/add] = array( title => Add, description => Add Search Files Helper Application, page callback => drupal_get_form, page arguments => array(search_files_helper_add_form), access arguments => array(administer search_files configuration), type => MENU_LOCAL_TASK, weight => 1, ); $items[admin/settings/search_files/helpers/autodetect] = array( title => Autodetect, description => Autodetect Search Files Helper Application, page callback => drupal_get_form, page arguments => array(search_files_helper_autodetect), access arguments => array(administer search_files configuration), type => MENU_LOCAL_TASK, weight => 2, ); $items[admin/settings/search_files/helpers/edit] = array( title => Edit, description => Edit Search Files Helper Application, page callback => drupal_get_form, page arguments => array(search_files_helper_edit), access arguments => array(administer search_files configuration), type => MENU_CALLBACK, ); $items[admin/settings/search_files/helpers/delete] = array( title => Delete, description => Delete Search Files Helper Application, page callback => search_files_helper_confirm_delete, access arguments => array(administer search_files configuration), type => MENU_CALLBACK, ); 62

return $items; } /** * generate form to autodetect helper apps * * @return (array) $form */ function search_files_helper_autodetect() { $form[submit] = array( #type => submit, #value => Autodetect, ); return $form; } function search_files_help($path, $arg) { $output = ; switch ($path) { case admin/settings/search_files/helpers/autodetect: $output .= this will only work; $output .= <ul>; $output .= <li>if PHP safemode is disabled (required by this module anyway)</li>; $output .= <li>if Server running Unix (Linux, BSD, Solaris, ...), not Windows (required "which" tool missing)</li>; $output .= <li>if search PATH inside Apache/PHP environment is set to include the directories containing the helpers</li>; $output .= </ul>; break; } return $output; } /** * autodetect helper apps */ function search_files_helper_autodetect_submit($form, &$form_state) { // load sample helper apps into database search_files_install_auto_helper_app_configuration(); drupal_goto(admin/settings/search_files/helpers/list); } /** * automatically detect helper apps and configure them 63

* */ function search_files_install_auto_helper_app_configuration() { // safe_mode will inhibit shell_exec() if (search_files_issafemode()) { // load sample helper apps into database search_files_helper_db_add("PDF", "pdf", "/usr/bin/env pdftotext %file% -"); search_files_helper_db_add("Text", "txt", "/usr/bin/env cat %file%"); } else { // test for pdftotext $location = trim(shell_exec(which pdftotext)); $location = preg_replace("/^no .*$/", "", $location); if ($location) { search_files_helper_db_add("PDF", "pdf", $location ." %file% -"); drupal_set_message(t(Helper app pdftotext has been detected and configured) ); } // test for cat $location = trim(shell_exec(which cat)); $location = preg_replace("/^no .*$/", "", $location); if ($location) { search_files_helper_db_add("Text files", "txt", $location ." %file%"); drupal_set_message(t(Helper app cat has been detected and configured)); } // test for catdoc $location = trim(shell_exec(which catdoc)); $location = preg_replace("/^no .*$/", "", $location); if ($location) { search_files_helper_db_add("Word Documents", "doc", $location ." %file%"); drupal_set_message(t(Helper app catdoc has been detected and configured)); } // test for xls2csv $location = trim(shell_exec(which xls2csv)); $location = preg_replace("/^no .*$/", "", $location); if ($location) { search_files_helper_db_add("Excel files", "xls", $location ." %file%"); drupal_set_message(t(Helper app xls2csv has been detected and configured)); } // test for catppt $location = trim(shell_exec(which catppt)); $location = preg_replace("/^no .*$/", "", $location); if ($location) { search_files_helper_db_add("Power Point Presentations", "ppt", $location ." 64

%file%"); drupal_set_message(t(Helper app catppt has been detected and configured)); } // test for unrtf $location = trim(shell_exec(which unrtf)); $location = preg_replace("/^no .*$/", "", $location); if ($location) { search_files_helper_db_add("Rich Text Format files", "rtf", $location ." %file%"); drupal_set_message(t(Helper app unrtf has been detected and configured)); } } } function search_files_overview() { $output = ; $output .= " Search Files in <ul> <li>Attachments</li> <li>Directories</li> </ul> and extract their content for index and use with Drupal search. <p> <a href=\"search_files/directories\">Manage Directories</a><br /> <a href=\"search_files/helpers\">Manage Helpers</a> </p> "; return $output; } /** * get an array of helper programs * * @return $helpers = array($helper->extension => $helper->helper_path); */ function search_files_get_helpers() { // Get all the registered helper applications and put them in static variable to eliminate unnecessary db queries // in search_files_nodeapi(). The query log feature of the dev module pointed out that this query was done // many times instead of once. Making $helpers a static variable reduced the number of queries by 25%. static $helpers; 65

if (! isset($helpers)) { $helpers = array(); $result = db_query("SELECT * FROM {search_files_helpers}"); while ($helper = db_fetch_object($result)) { $helpers[$helper->extension] = $helper->helper_path; } } return $helpers; } /** * Check whether we run in PHP safe_mode */ function search_files_issafemode() { return preg_match(/(1|on)/i, @ini_get("safe_mode")); } /** * check to make sure the $helper_id is valid (a number greater * than zero) then it fetches the deletion confirmation form, * then returns it * * @return (array) $form */ function search_files_helper_confirm_delete() { $helper_id = arg(5); if ($helper_id > 0 && is_numeric($helper_id)) { return drupal_get_form(search_files_helper_confirm_delete_form, $helper_id); } } /** * generate the deletion confirmation form for helper apps and return the form * * @param unknown_type $form_state * @param (int) $helper_id * @return (array) $form */ function search_files_helper_confirm_delete_form(&$form_state, $helper_id) { $helper_name = db_result(db_query("SELECT name FROM {search_files_helpers} WHERE id = %d", $helper_id)); $form = array(); $form[search_files_helper_id] = array( #type => hidden, 66

#value => $helper_id ); $form[search_files_helper_name] = array( #type => hidden, #value => $helper_name, ); return confirm_form($form, t(Are you sure you want to delete the %name helper? The text extracted by this helper will remain in the search index until the directory is reindexed., array(%name => $helper_name)), admin/settings/search_files/helpers/list, t(This action cannot be undone.), t(Delete), t(Cancel)); }

/** * remove row for the helper app from the search_files_helpers table */ function search_files_helper_confirm_delete_form_submit($form, &$form_state) { $result = db_query("DELETE FROM {search_files_helpers} WHERE id = %d", $form_state drupal_goto(admin/settings/search_files/helpers/list); } /** * display a themes table of the current helper apps set up in the system * * @return (string) html table */ function search_files_helper_list() { $output = ; $header = array(t(Helper name), t(Extension), array(data => t(Operations), $sql = " SELECT * FROM {search_files_helpers} ORDER BY extension "; $result = db_query($sql); $helpers[] = array(); $destination = drupal_get_destination(); while ($helper = db_fetch_object($result)) { $helpers[] = array($helper->name, $helper->extension, l(t(Edit), admin/settings/search_files/helpers/edit/. $helper->id), l(t(Delete), admin/settings/search_files/helpers/delete/. $helper->id), 67

array($destination)); } $output .= theme(table, $header, $helpers); // safe_mode will inhibit shell_exec() if (search_files_issafemode()) { $output .= t(<b>WARNING!</b> This server has safe_mode enabled, which inhibits use of helper applications); } else { $output .= t(Good. This server has safe_mode disabled, which allows use of helper applications); } $output .= "<br/>\n"; return $output; } /** * Implementation of hook_perm(). * * @return (array) permissions */ function search_files_perm() { return array(administer search_files configuration, view search_files results); } /** * generate form to add a helper app to the system * * @return (array) $form */ function search_files_helper_add_form() { $form[search_files_name] = array( #type => textfield, #title => t(Helper name), #size => 50, #maxlength => 50, #default_value => Foo extractor, #required => TRUE, #description => t(A name for this helper configuration.), ); $form[search_files_extension] = array( 68

#type => textfield, #title => t(Extension), #size => 10, #maxlength => 10, #default_value => foo, #required => TRUE, #description => t(Enter the extension for the files that you want the helper application to process. Do not include the period.), ); $form[search_files_helper_path] = array( #type => textfield, #title => t(Helper path), #size => 100, #maxlength => 255, #default_value => /opt/bin/foo-extract %file%, #validate => array(search_files_helpers_validate_add_edit => array()), #required => TRUE, #description => t(Enter the path to the helper application installed on your server. "%file%" is a placeholder for the path of the attachment file and is required. Include any command-line parameters as well (for example, pdftotext requires a - after the file to be processed).), ); $form[submit_done] = array( #type => submit, #value => Save and Done, ); $form[submit] = array( #type => submit, #value => Save add another, ); return $form; } /** * validate the existance of the helper app supplied by the * helper_add or helper_edit form * * @param unknown_type $field */ function search_files_helpers_validate_add_edit($field) { if (!preg_match(/%file%/, $field[#value])) { form_set_error($field[#title], t("%field" must contain the token %file%, array(%field => $field[#title]))); } 69

// Check to see if helper app can be found $helper_file = preg_replace(/\s.+$/, , $field[#value]); if (!file_exists($helper_file)) { form_set_error($field[#title], t("Cant find helper app %helper -please verify it is installed.", array(%helper => $helper_file))); } } /** * fetch the helper add form, alter the form for use as an edit form, * populate the #default_values fields and return the form * * @return unknown */ function search_files_helper_edit() { $sql = " SELECT * FROM {search_files_helpers} WHERE id = %d "; $result = db_fetch_object(db_query($sql, arg(5))); $form = search_files_helper_add_form(); $form[search_file_id] = array( #type => value, #value => $result->id, ); $form[search_files_helper_path][#value] = $result->helper_path; $form[search_files_extension][#value] = $result->extension; $form[search_files_name][#value]= $result->name; unset($form[submit_done]); $form[submit][#value] = Update; return $form; } /** * update the row in the table search_files_helpers for the given helper app */ function search_files_helper_edit_submit($form, &$form_state) { $sql = " UPDATE {search_files_helpers} SET name = %s, extension = %s, 70

helper_path = %s WHERE id = %d "; $result = db_query($sql, $form_state[clicked_button][#post] [search_files_name], $form_state[clicked_button][#post] [search_files_extension], $form_state[clicked_button][#post] [search_files_helper_path], $form_state[values][search_file_id]); if ($result) { drupal_set_message(t(Helper app %helper_name has been updated, array(%helper_name => $form_state[values][search_files_name]))); drupal_goto(admin/settings/search_files/helpers/list); } } /** * validates uniqueness of directory */ function search_files_helper_add_form_validate($form, $form_state) { $name = $form_state[values][search_files_name]; $sql = "SELECT * FROM {search_files_helpers} WHERE name = %s"; $result = db_query($sql, $name); while ($row = db_fetch_object($result)) { form_set_error("search_files_helper", t(Helper name already in list)); } $extension = $form_state[values][search_files_extension]; $sql = "SELECT * FROM {search_files_helpers} WHERE extension = %s"; $result = db_query($sql, $extension); while ($row = db_fetch_object($result)) { form_set_error("search_files_helper", t(Extension already in list)); } } /** * insert a row in the search_files_helpers table for the helper * app given by the form */ function search_files_helper_add_form_submit($form, $form_state) { $result = search_files_helper_db_add( $form_state[values][search_files_name], $form_state[values][search_files_extension], $form_state[values][search_files_helper_path] ); if ($result) { 71

drupal_set_message(t(%helper helper added, array(%helper => $form_state [values][search_files_name]))); } if ($form_state[clicked_button][#id] == edit-submit-done) { drupal_goto(admin/settings/search_files/helpers/list); } } /** * insert a row in the search_files_helpers table for the helper app given */ function search_files_helper_db_add($name, $extension, $helper_path) { $sql = "INSERT INTO {search_files_helpers} (name, extension, helper_path) VALUES (%s, %s, %s)"; $result = db_query($sql, $name, $extension, $helper_path); return $result; } /** * Get the host systems character encoding and convert text from it to UTF-8, * Drupals default HTTP and database character encoding. */ function search_files_convert_to_utf8($text) { $encoding = iconv_get_encoding("output_encoding"); $text = drupal_convert_to_utf8($text, $encoding); return $text; } /** * format the result items before that are displayed * * @param (array) $item * @param (string) $type * @return (string) $output formatted string */ function search_files_search_item_format($item, $type) { //drupal_set_message(entry = <pre>.var_export($item, true).</pre>); $output = <dt class="title"><a href=". check_url($item[link]) .">. check_plain($item[title]) .</a></dt>; $info = array(); if ($item[type]) { $info[] = check_plain($item[type]); } if ($item[user]) { 72

// Add this here so the user name appears at the end of the output $item[extra][] = $item[user]; } if ($item[date]) { $info[] = format_date($item[date], small); } if (is_array($item[extra])) { $info = array_merge($info, $item[extra]); } $output .= <dd>. ($item[snippet] ? <p>. $item[snippet] .</p> : ) . <p class="search-info">. implode( - , $info) .</p></dd>; return $output; } /** * returns an array of the file extensions with the extension as * the key and the name of the file type as the value, this data * is retrieved from the search_files_helpers table * * @return (array) */ function search_files_get_file_extensions() { $extensions = array(); $result = db_query("SELECT extension, name FROM {search_files_helpers}"); while ($helper = db_fetch_object($result)) { $extensions[$helper->extension] = $helper->name; } return $extensions; } /** * Get the name of a helper for the given extension. */ function search_files_helper_name($ext) { $result = db_query("SELECT name FROM {search_files_helpers} WHERE extension = %s", $ext); if ($helper = db_fetch_object($result)) { return $helper->name; } } function search_files_settings() { return ; }

73

/** * search_files_update_totals($type) * marks all words of $type dirty, then updates search totals * * @param (string) $type */ function search_files_update_totals($type) { $result = db_query("SELECT data FROM search_dataset WHERE type = %s", $type); while ($obj = db_fetch_object($result)) { foreach (explode(" ", $obj->data) as $word) { search_dirty($word); } } search_update_totals(); }

74

Cdigo Pdf2Text o
Cdigo completo de la modicacin realizada en el archivo pdf2text.module: o o <?php // Including the file with the code for conversion of pdf into html include("pdf2text.pdf2text.inc"); /** * @file * File-handling and conversion of atteched pdf files into * text and then displaying them using the body field of the node. * */ /** * Implementation of hook_help(). */ function pdf2text_help($path, $arg) { // Checking the browser type $browser_type=(string)($_SERVER["HTTP_USER_AGENT"]); $found=preg_match("/MSIE/i", "$browser_type"); if($found) { return; }

switch ($path) { case admin/help#pdf2text: $output = <p>. t(The pdf2text allows users to upload pdf files and view them as normal text files. The ability to upload files is important for members of a community who want to share work and the conversion of pdf to text allows user to add information originally in the pdf format as text in body field of the node.) .</p>; $output .= <p>. t(Users with the upload files permission can add content within the body of the node. Uploads may be enabled for specific content types on the content types settings page. Only files with pdf format and upto 1000MB of size can be uploaded.) .</p>; $output .=<p>.t(This module is not compatible with Internet Explorer.). </p>; return $output; case admin/settings/pdf2text: return <p>. t(Users with the <a href="@permissions">upload pdf files 75

permission</a> can upload files. Users with the <a href="@permissions"> view uploaded pdf files permission</a> can view uploaded files. You can choose which post types can take attachments on the <a href="@types">content types settings</a> page., array(@permissions => url(admin/user/permissions), @types => url(admin/settings/types))) .</p>; } } /** * Implementation of hook_perm(). */ function pdf2text_perm() { return array(upload pdf files, view uploaded pdf files); } /** * Implementation of hook_menu(). */ function pdf2text_menu() { // Checking the browser type $browser_type=(string)($_SERVER["HTTP_USER_AGENT"]); $found=preg_match("/MSIE/i", "$browser_type"); if($found) { drupal_set_message(t(The Pdf-To-Text Module is not compatible with Internet Explorer),error); return; }

$items[admin/settings/pdf2text] = array( title => Upload Settings, description => Control how files may be attached to content., page callback => drupal_get_form, page arguments => array(pdf2text_admin_settings), access arguments => array(administer site configuration), type => MENU_NORMAL_ITEM, file => pdf2text.admin.inc, ); return $items; } function pdf2text_menu_alter(&$items) { 76

$items[system/files][access arguments] = array(view uploaded pdf files); } /** * Implementation of hook_nodeapi(). */ function pdf2text_nodeapi(&$node, $op, $teaser) { // Checking the browser type $browser_type=(string)($_SERVER["HTTP_USER_AGENT"]); $found=preg_match("/MSIE/i", "$browser_type"); switch ($op) { case load: $output = ; if (variable_get("pdf2text_$node->type", 1) == 1 && !found) { $output[files] = pdf2text_load($node); return $output; } break; case view: break; case insert: case update: if (user_access(upload pdf files) && !$found) { pdf2text_save($node); } break; case delete: if(!$found) pdf2text_delete($node); break; case delete revision: if(!$found) pdf2text_delete_revision($node); break; } 77

} function pdf2text_load($node) { // Checking the browser type $browser_type=(string)($_SERVER["HTTP_USER_AGENT"]); $found=preg_match("/MSIE/i", "$browser_type"); $files = array(); if ($node->vid && !$found) { $result = db_query(SELECT * FROM {files} f INNER JOIN {pdf2text} r ON f.fid = r.fid WHERE r.vid = %d ORDER BY r.weight, f.fid, $node->vid); while ($file = db_fetch_object($result)) { $files[$file->fid] = $file; } } return $files; }

function pdf2text_form($node) { global $user; // Checking the browser type $browser_type=(string)($_SERVER["HTTP_USER_AGENT"]); $found=preg_match("/MSIE/i", "$browser_type"); $form = array( #cache => TRUE, ); // Making the Content specific settings $types_to_attach=variable_get(pdf2text_node_types, array(page)); $flag=0; $ntype=$node->type; foreach($types_to_attach as $types => $values ) { if($ntype == $types && $values) { $flag=1; } }

78

if (user_access(upload pdf files) && $flag && !$found) { $limits = pdf2text_file_limits($user); $form[add][#weight] = 10; $form[add][pdf2text] = array( #type => file, #title => t(Attach a file), #size => 40, #description => t(The maximum upload size is %filesize. Only files with the following extensions may be uploaded: %extensions. , array(%extensions => $limits[extensions], %filesize => format_size($limits[file_size]))), ); $form[add][upload] = array( #type => submit, #value => t(Upload), #name => upload, #submit => array(node_form_submit_build_node), ); } return $form; }

function pdf2text_form_alter(&$form, $form_state, $form_id) { if (isset($form[type]) && isset($form[#node])) { $node = $form[#node]; // Checking the browser type $browser_type=(string)($_SERVER["HTTP_USER_AGENT"]); $found=preg_match("/MSIE/i", "$browser_type");

if($found) { drupal_set_message(t(The Pdf-To-Text Module is not compatible with Internet E } // Making the Content specific settings $types_to_attach1=variable_get(pdf2text_node_types, array(page)); $flag1=0; $ntype1=$node->type; foreach($types_to_attach1 as $types => $values ) { if($ntype1 == $types && $values) { $flag1=1; 79

} } if ($form[type][#value] ._node_form == $form_id && variable_get ("pdf2text_$node->type", TRUE) && $flag1 && !$found) { // Attachments fieldset $form[pdf attachments] = array( #type => fieldset, #access => user_access(upload pdf files), #title => t(Convert PDF), #collapsible => TRUE, #collapsed => FALSE, #description => t(In case of multiple uploads, the content is appended. ), #weight => 2, ); // Settings fieldset $form[pdf attachments][settings] = array( #type => fieldset, #access => user_access(upload pdf files), #title => t(Display settings), #collapsible => TRUE, #collapsed => empty($node->files), #description => t(Settings for tweaking the display of content being uploaded.), ); $selected = array(); if(isset($form_state[values][options])) { foreach($form_state[values][options] as $key => $val) { $selected[] = $val; } } $form[pdf attachments][settings][options] = array( #type => checkboxes, #title => Options, #required => FALSE, #default_value => $selected, #options => array( div => t(No styling), font => t(Fixed font), 80

), ); $form[pdf attachments][wrappers] = array( #prefix => <div id="attach-wrapper">, #suffix => </div>, ); // Make sure necessary directories for pdf2text.module exist and are // writable before displaying the attachment form. $path = file_directory_path(); $temp = file_directory_temp(); // Note: pass by reference

if (!file_check_directory($path, FILE_CREATE_DIRECTORY) || !file_check_directory($temp, FILE_CREATE_DIRECTORY)) { $form[pdf attachments][#description] = t(File attachments are disabled. The file directories have not been properly configured.); if (user_access(administer site configuration)) { $form[pdf attachments][#description] .= . t(Please visit the <a href="@admin-file-system">file system configuration page</a>., array(@admin-file-system => url(admin/settings/file-system))); } else { $form[pdf attachments][#description] .= . t(Please contact the sit administrator.); } } else { $form[pdf attachments][wrappers] += pdf2text_form($node); $form[#attributes][enctype] = multipart/form-data; } } $form[#submit][] = pdf2text_node_form_submit; } } /** * Save new uploads and store them in the session to be associated to the node * on upload_save. * * @param $node * A node object to associate with uploaded files. 81

*/ function pdf2text_node_form_submit(&$form, &$form_state) { global $user; // Checking the browser type $browser_type=(string)($_SERVER["HTTP_USER_AGENT"]); $found=preg_match("/MSIE/i", "$browser_type"); $limits = pdf2text_file_limits($user); $validators = array( file_validate_extensions => array($limits[extensions]), file_validate_image_resolution => array($limits[resolution]), file_validate_size => array($limits[file_size], $limits[user_size]), ); $file = file_save_upload(pdf2text, $validators, file_directory_path()); $err = 0; $lent = strlen($form_state[values][body]); // max size of contents that can be added into body under default configuration of mysql if($lent >= 182844) { $err=1; } // error checking if($file && $file->filemime!=application/pdf) { drupal_set_message(t(Invalid File extension),error); $err=1; } elseif($file && $file->filesize>(1048576 * 1000)) { drupal_set_message(t(File size is exceeded),error); $err=1; } // Save new file uploads. elseif (user_access(upload pdf files) && $file && !$err && !$found) { $file->list = variable_get(pdf2text_list_default, 1); $file->description = $file->filename; $file->weight = 0; $file->new = TRUE;

82

$selected = $form_state[values][options]; //set the contents of the file as the body of the node $file_path = file_directory_path()."/".$file->filename; $file_content = (string)pdf2text_pdf_to_text($file_path, $selected); $content = $body_content = (string)$form_state[values][body]; $len5 = strlen($file_content); // Checking the string for Unwanted characters for ($i = 0; $i < $len5; $i++) { $cont = $file_content[$i]; $val = ($cont==< || $cont==> || $cont== || $cont==? || $cont==, || $cont==. || $cont==/ || $cont==; || $cont==: || $cont==\ || $cont==\" || $cont==[ || $cont=={ || $cont==} || $cont==] || $cont==\\ || $cont==| || $cont==- || $cont==_ || $cont=== || $cont==+ || $cont==) || $cont==( || $cont==* || $cont==& || $cont==^ || $cont==% || $cont==$ || $cont==# || $cont==@ || $cont==!|| $cont==~ || $cont==); $abc = ($cont==a || $cont==b || $cont==c || $cont==d || $cont==e || $cont==f || $cont==g || $cont==h || $cont==i || $cont==j || $cont==k || $cont==l || $cont==m || $cont==n || $cont==o || $cont==p || $cont==q || $cont==r || $cont==s || $cont==t || $cont==u || $cont==v || $cont==w || $cont==x || $cont==y || $cont==z); $AB = ($cont==A || $cont==C || $cont==D || $cont==B || $cont==E || $cont==F || $cont==G || $cont==H || $cont==I || $cont==J || $cont==K || $cont==L || $cont==M || $cont==N || $cont==O || $cont==P || $cont==Q || $cont==R || $cont==S || $cont==T || $cont==U || $cont==V || $cont==W || $cont==X || $cont==Y || $cont==Z); $num = ($cont==1 || $cont==\0 || $cont==2 || $cont==3 || $cont==4 || $cont==5 || $cont==6 || $cont==7 || $cont==8 || $cont==9 || $cont==0); if(!$val && !$num && !$abc && !$AB) { $cont= ; } if ($AB) { $temp = strtolower($cont); $check = ($temp==a || $temp==b || $temp==c || $temp==d || $temp==e || $temp==f || $temp==g || $temp==h || $temp==i 83

|| $temp==j || || $temp==o || || $temp==t || || $temp==y || if (!$check) { $count=; }

$temp==k || $temp==l || $temp==m || $temp==n $temp==p || $temp==q || $temp==r || $temp==s $temp==u || $temp==v || $temp==w || $temp==x $temp==z);

} $file_content[$i] = $cont; } // Adding Scroll Bar $scroll = <style type="text/css">.divScroll-3 {width:100%; overflow:hidden; white-space:nowrap;}</style><div class="divScroll-3"><div><object>; $len1 = strlen($body_content); $len2 = strlen($scroll); $match = 0; for ($i = 0; $i < $len1; $i++) { if ($body_content[$i] == $scroll[0]) { for ($j = 0; $j < $len2 && ($i + $j) < $len1; $j++) { if ($body_content[$i+$j] != $scroll[$j]) { $match=0; break; } } if($j == $len2 || ($j + $i) == $len1){ $match = 1; break; } } } // Appending the file content to body content if (!$match) { $content = $scroll; $content .= $body_content; } else { $strip = </div></object>; $len_strip = strlen($strip); $len_body = strlen($body_content); 84

$content = substr($body_content,0,$len_body-$len_strip); } $content.=$file_content; $content.=</div></object>; $len=strlen($content); // max size of contents that can be added into body under default configuration of mysql if ($len >= 182844) { drupal_set_message(t(The content size is way too large, nothing was appended.),error); } else { $form_state[values][body]=$content; drupal_set_message(t(The file content have been successfully appended to the body.)); } } // Delete the file form the location $path = file_directory_path() . "/" . $file->filename; file_delete($path); } function pdf2text_save(&$node) { if (empty($node->files) || !is_array($node->files)) { return; } foreach ($node->files as $fid => $file) { // Convert file to object for compatibility $file = (object)$file; // Remove file. Process removals first since no further processing // will be required. if (!empty($file->remove)) { db_query(DELETE FROM {pdf2text} WHERE fid = %d AND vid = %d, $fid, $node->vid); // If the file isnt used by any other revisions delete it. $count = db_result(db_query(SELECT COUNT(fid) FROM {pdf2text} WHERE fid = %d, $fid)); if ($count < 1) { 85

file_delete($file->filepath); db_query(DELETE FROM {files} WHERE fid = %d, $fid); } // Remove it from the session in the case of new uploads, // that you want to disassociate before node submission. unset($node->files[$fid]); // Move on, so the removed file wont be added to new revisions. continue; } // Create a new revision, or associate a new file needed. if (!empty($node->old_vid) || $file->new) { db_query("INSERT INTO {pdf2text} (fid, nid, vid, list, description, weight) VALUES (%d, %d, %d, %d, %s, %d)", $file->fid, $node->nid, $node->vid, $file->list, $file->description, $file->weight); file_set_status($file, FILE_STATUS_PERMANENT); } // Update existing revision. else { db_query("UPDATE {pdf2text} SET list = %d, description = %s, weight = %d WHERE fid = %d AND vid = %d", $file->list, $file->description, $file->weight, $file->fid, $node->vid); file_set_status($file, FILE_STATUS_PERMANENT); } } } function pdf2text_delete($node) { $files = array(); $result = db_query(SELECT DISTINCT f.* FROM {pdf2text} u INNER JOIN {files} f ON u.fid = f.fid WHERE u.nid = %d, $node->nid); while ($file = db_fetch_object($result)) { $files[$file->fid] = $file; } foreach ($files as $fid => $file) { // Delete all files associated with the node db_query(DELETE FROM {files} WHERE fid = %d, $fid); file_delete($file->filepath); } // Delete all file revision information associated with the node db_query(DELETE FROM {pdf2text} WHERE nid = %d, $node->nid); 86

} function pdf2text_delete_revision($node) { if (is_array($node->files)) { foreach ($node->files as $file) { // Check if the file will be used after this revision is deleted $count = db_result(db_query(SELECT COUNT(fid) FROM {pdf2text} WHERE fid = %d, $file->fid)); // if the file wont be used, delete it if ($count < 2) { db_query(DELETE FROM {files} WHERE fid = %d, $file->fid); file_delete($file->filepath); } } } // delete the revision db_query(DELETE FROM {pdf2text} WHERE vid = %d, $node->vid); } /** * Determine the limitations on files that a given user may upload. The user * may be in multiple roles so we select the most permissive limitations from * all of their roles. * * @param $user * A Drupal user object. * @return * An associative array with the following keys: * extensions * A white space separated string containing all the file extensions this * user may upload. * file_size * The maximum size of a file upload in bytes. * user_size * The total number of bytes for all for a users files.(not used by the module) * resolution * A string specifying the maximum resolution of images.(not used by the module) */ function pdf2text_file_limits($user) { return array( 87

extensions => pdf, file_size => 1048576 * 1000, user_size => 1048576 * 1000, resolution => 0, // zero for no limit ); } /** * Implementation of hook_file_download(). */ function pdf2text_file_download($filepath) { $filepath = file_create_path($filepath); $result = db_query("SELECT f.*, u.nid FROM {files} f INNER JOIN {pdf2text} u ON f.fid = u.fid WHERE filepath = %s", $filepath); if ($file = db_fetch_object($result)) { if (user_access(view uploaded pdf files) && ($node = node_load($file->nid)) && node_access(view, $node)) { return array( Content-Type: . $file->filemime, Content-Length: . $file->filesize, ); } else { return -1; } } } /** * Determine how much disk space is occupied by a users uploaded files. * * @param $uid * The integer user id of a user. * @return * The amount of disk space used by the user in bytes. */ function pdf2text_space_used($uid) { return file_space_used($uid); } /** * Determine how much disk space is occupied by uploaded files. * * @return 88

* The amount of disk space used by uploaded files in bytes. */ function pdf2text_total_space_used() { return db_result(db_query(SELECT SUM(f.filesize) FROM {files} f INNER JOIN {pdf2text} u ON f.fid = u.fid)); }

89

También podría gustarte