Archive for the ‘Páginas web’ Category

Todo lo que quisiste hacer con un PDF pero no supiste cómo.

Domingo, Enero 11th, 2009

A través de Menéame descubro este genial artículo de Blogoff en el que explican cómo trastear y manipular a nuestro antojo documentos PDF sin necesidad de tener el programa Adobe Acrobat versión completa (es decir, no el Reader que es gratuíto sino el completo, el de pago). Decido incorporarlo a mi propio blog para tenerlo más mano cuando lo necesite y para de paso hacerlo llegar a más gente. El artículo de Blogoff se puede encontrar aquí y a su vez está basado en el artículo en inglés original que se puede leer aquí.

Todo lo que sigue a continuación no está escrito por mí sino que es el contenido íntegro de la entrada en el blog Blogoff...

1. ¿Cómo creo documentos PDF en mi ordenador sin necesidad de Adobe Acrobat?

Hazte con una copia del programa gratuito DoPDF [Ver tutorial]

2. Pero no quiero instalar un programa cuando lo único que voy a convertir son unos pocos documentos.

Sube tus documentos a Google Docs a través del explorador y luego expórtalos como PDF. Así de simple

3. Un cliente me ha mandado una presentación PowerPoint por e-mail y aquí no tengo nada para abrirlo ¿qué puedo hacer?

Reenvía el correo (con el powerpoint adjunto) a pdf@koolwire.com. Ellos convertirán la presentación a PDF y te la mandarán de vuelta para que la puedas ver en la mayoría de los dispositivos portátiles.

4. ¿Cómo guardo una página web como PDF sin guardarla como HTML primero?

Sólo tienes que ir a PrimoPDF, escribir la dirección de la página y recibirás una copia de la misma en PDF en el correo que les hayas proporcionado.

5. ¿Cómo puedo transformar un PDF a otros formatos como documento de Word, imagen, HTML, etc…?

A través de una web como Zamzar [ver tutorial]

6. ¿Cómo puedo juntar dos archivos PDF en uno? ¿Y cambiar el orden de las páginas?

PDFill es una utilidad muy versátil que te permitirá combinar varios documentos PDF en uno, reordenar las páginas e incluso rotarlas desde dentro del PDF.

7. Quiero extraer el texto de un PDF para usarlo en mi documento de Word ¿cuál es la mejor opción?

Abre PDF Text Extraction y sube tu PDF. Extraerá las 10 primeras páginas de tu documento en formato texto.

8. No puedo usar el truco de arriba porque el documento PDF no se hizo desde Word sino que fue escaneado.

Hay un modo de extraer el texto de estos documentos a través del OCR de Google. Quizás no la forma más rápida pero posiblemente la mejor solución gratuita.

9. Tengo documentos PDF en mi ordenador en el sentido de que no se pueden imprimir o seleccionar texto en ellos con el ratón.

PDF Unlocker es una utilidad gratuita que borra las restricciones más habituales sobre un PDF sin pedir ningún tipo de password.

10. Algunos PDF de mi empresa están protegidos con contraseñas que nadie recuerda después de la cena de empresa de ayer ¿qué puedo hacer?

Échale un vistazo a How to Open Password Protected PDF

11. Busco un servicio que permita a mis visitantes bajarse los artículos como PDF.

Añade el botón Web2PDF en algún sitio de tu página web. Convertirá la página a PDF de forma instantánea y además te permitirá mantener un registro de las conversiones.

12. Alguien me ha enviado un documento PDF en un idioma que no entiendo.

Puedes traducirlo con Google Translate y Zoho Viewer.

13. ¿Cómo puedo añadir anotaciones o notas de texto a mis documentos PDF?

Descarga PDF-X Viewer que es como Adobe Reader pero con algunas funciones adicionales. Puedes añadir las anotaciones que quieras e incluso pegar imágenes. Otra opción parecida es PDF Escape.

14. ¿Cómo puedo abrir un documento PDF online sin tener el software de Adobe?

Una alternativa fácil para abrir PDF en el navegador es el Free Online PDF Viewer, aunque hay otras muchas.

15. ¿Puedo rellenar formularios PDF online sin Acrobat Reader?

Sólo tienes que ir a PDF Filler, subir el archivo y empezar a escribir.

16. ¿Cómo puedo añadir una marca de agua o mi propia firma a un PDF?

Lo primero que tienes que hacer es crear tu marca de agua o firma con Paint o cualquier otro programa de dibujo y luego guardarla como imagen. Asegúrate de haber recortado bien la firma y abre el documento PDF en el PDF-X Viewer que ya hemos mencionado. Una vez allí sólo tienes que pegarla dentro del documento.

17. Tengo un libro en PDF que llega a las 200 páginas ¿hay algún modo de extraer algunas páginas en concreto y salvarlas como otro PDF?

Puedes usar tanto PDF Merge como PDF SAM para hacer esta operación.

18. ¿Cómo puedo proteger mi documento PDF con una contraseña?

En PDF Hammer subes tu documento y le asignas la contraseña que quieras.

19. Un PDF tiene muchos enlaces pero no puedo hacer click en ellos porque están en texto plano. ¿Cómo puedo convertilos en enlaces estándar?

Una vez más, acude a PDF Escape, sube el PDF y coloca los hipervínculos donde consideres oportuno.

20. ¿Qué servicios me rec0mendarías para subir archivos PDF a internet?

En el artículo original recomiendan Issuu que aún no he probado. De los que he visto me quedo con Scribd.

21 [Blogoff Bonus Track]. ¿Cómo puedo abrir un PDF más rápido con Adobe Reader?

Desactivando los plugins o usando Foxit PDF como lector de escritorio.

21 [Blogoff Bonus Track]. ¿Cómo crear un PDF de un documento de Word?

Con Express PDF (mi herramienta favorita)

22. [Blogoff Bonus Track]. ¿Cómo puedo manejar archivos PDF en OpenOffice?

Plugin para editar archivos PDF en Open Office sin Adobe Reader

Calendario en JavaScript traído del baúl de los recuerdos.

Viernes, Julio 18th, 2008

Ordenando estos días viejos archivos que tenía en discos duros varios, he topado con algunas cosas que había desarrollado hace ya tiempo y que en algunos casos ni recordaba. Una de las que me ha parecido más interesante es este calendario para página web creado con JavaScript que presento hoy. Recuerdo que lo creé para recoger una fecha con la que acotar una consulta. Quería evitar problemas con los formatos de entrada de fechas (día/mes/año, mes/día/año, etc) y además me apetecía crear algo más estético que un simple cuadro de texto. Por eso surgió este calendario. De modo que todo el código es de hace unos cuantos años, cuando era un programador 100% amateur, así que no se aceptan críticas despiadadas sobre su corrección... ;-) Ahora simplemente le he echado un vistazo por encima y le he puesto algún comentario y alguna tabulación, nada más.

No tiene mucho misterio explicar cómo funciona, solo hay que crear el calendario en el punto de la página web que se desee con una llamada así:

<script>drawCalendar('date01');</script>

Y después tener algún cuadro de texto que recoja la fecha que se selecciona en el calendario. Este cuadro lo podemos hacer visible o invisible a nuestro antojo, pero tenemos que tener la precaución de asignarle un identificador igual al parámetro que hemos pasado como argumento a la función drawCalendar:

<input type="textbox" id="date01" value=" "/>

Con esto el calendario queda ya plenamente operativo. Aquí va un ejemplo:

Y aquí os dejo el código JavaScript completo del archivo calendar.js:

/*-------------------------------------------------------------------
 Author:      Albert Mata (www.albertmata.net)
 Date:        20080718
 Description: Old JavaScript calendar I programmed a long time ago. 
-------------------------------------------------------------------*/

/*-------------------------------------------------------------------
 Attributes.
-------------------------------------------------------------------*/

var monthShown;
var yearShown;
var textboxId;
var firstMonthWeekDay;

/*-------------------------------------------------------------------
 Draws calendar giving identifiers to each button.
-------------------------------------------------------------------*/
function drawCalendar(txtId) {
    var currentDate;

    textboxId = txtId;

    /* Getting current month and year. */
    currentDate = new Date();
    monthShown = currentDate.getMonth();
    yearShown = currentDate.getFullYear();

    /* Opening HTML table. */
    document.write('<table width="126" bgcolor="#FFFFFF"' 
                 + 'align="center" cellspacing="0" cellpadding="0"'
                 + 'border="0">');
    document.write('<tr><td width="6"><img src="left.gif"' 
                 + 'style="cursor: hand;" onClick="SafeRefill(1);"/>'
                 + '</td><td width="60"><input type="button"' 
                 + 'style="width: 60px; background-color: #FFFFFF;'
                 + 'font-size: 10px; text-align: center;' 
                 + 'font-family: Arial, Helvetica, sans-serif;' 
                 + 'border: 0px;" id="mth"' 
                 + 'value="'+monthName(monthShown)+'"/></td>'
                 + '<td width="6"><img src="right.gif"' 
                 + 'style="cursor: hand;" onClick="SafeRefill(2);"/>'
                 + '</td><td width="10"></td><td width="6">'
                 + '<img src="left.gif" style="cursor: hand;"' 
                 + 'onClick="SafeRefill(3);"/></td>'
                 + '<td width="32"><input type="button"' 
                 + 'style="width: 32px; background-color: #FFFFFF;'
                 + 'font-size: 10px; text-align: center;' 
                 + 'font-family: Arial, Helvetica, sans-serif;' 
                 + 'border: 0px;" id="yea" value="'+yearShown+'"/>'
                 + '</td><td width="6"><img src="right.gif"' 
                 + 'style="cursor: hand;" onClick="SafeRefill(4);"/>'
                 + '</td></tr>');
    document.write('<tr><td width="126" colspan="7">');
   
    /* Adding buttons. */
    for (i = 0; i < 42; i++) {
        document.write('<input type="button" style="width: 18px;' 
                     + 'background-color: #FFFFFF; font-size: 10px;'
                     + 'text-align: center;' 
                     + 'font-family: Arial, Helvetica, sans-serif;'
                     + 'border: 0px;" id="day' + i + '" value=" "'
                     + 'onMouseOver="Hover('+i+',1);"' 
                     + 'onMouseOut="Hover('+i+',0);"' 
                     + 'onClick="ShowDate(' + i + ');"/>');
        if (((i+1) % 7) == 0) {
            document.write('<br/>');
        }
    }

    /* Closing HTML table. */
    document.write('</td></tr>');
    document.write('</table>');

    Refill();
}

/*-------------------------------------------------------------------
 Prevents possible wrong values for month and refills calendar.
-------------------------------------------------------------------*/
function SafeRefill(action) {
    /* Increasing or decreasing month and year. */
    if (action == 1) { monthShown-- }
    if (action == 2) { monthShown++ }
    if (action == 3) { yearShown-- }
    if (action == 4) { yearShown++ }
   
    /* Moving from January to December. */
    if (monthShown == -1) {
        monthShown = 11;
        yearShown--;
    }
   
    /* Moving from December to January. */
    if (monthShown == 12) {
        monthShown = 0;
        yearShown++;
    }
   
    Refill();
}

/*-------------------------------------------------------------------
 Redraws calendar when month or year has changed, using identifiers
 previously given to all buttons.
-------------------------------------------------------------------*/
function Refill() {
    var firstMonthDay;
    var lastMonthDay;
    var lastMonthWeekDay;

    /* Getting first month day and weekday. */
    firstMonthDay = new Date(yearShown,monthShown,1);
    firstMonthWeekDay = firstMonthDay.getDay();
    if (firstMonthWeekDay == 0) {
        firstMonthWeekDay = 7;
    } 

    /* Getting last month day and weekday. */
    lastMonthDay = new Date(yearShown,monthShown,
                            monthDays(monthShown,yearShown));
    lastMonthWeekDay = lastMonthDay.getDay();
    if (lastMonthWeekDay == 0) {
        lastMonthWeekDay = 7;
    } 

    /* Clearing all buttons. */
    for (i = 0; i < 42; i++) {
        document.getElementById('day'+i).value = " ";
        document.getElementById('day'+i).style.cursor = 'default';
    }

    /* Giving new values to buttons. */
    for (i = 1; i <= monthDays(monthShown,yearShown); i++) {
        document.getElementById('day'+(i+firstMonthWeekDay-2))
                                              .value = i;
        document.getElementById('day'+(i+firstMonthWeekDay-2))
                                              .style.cursor = 'hand';
    }

    /* Giving new values to month and year buttons. */
    document.getElementById('mth').value = monthName(monthShown);
    document.getElementById('yea').value = yearShown;
}

/*-------------------------------------------------------------------
 Function to calculate a month's number of days depending on it's a 
 leap year or not. It's a leap year when it can be divided by 4, but
 it's not when it can be divided by 100 as well. And it's a leap
 year again when it can be divided by 100 and by 400.
-------------------------------------------------------------------*/
function monthDays (mm, yyyy) {
    var februaryDays;
    var daysNumber;

    februaryDays = 28;

    /* Deciding number of days for February. */
    if ((yyyy % 4) == 0) {
        if ((yyyy % 100) == 0) {
            if ((yyyy % 400) == 0) { 
                februaryDays = 29;
            } 
        } else { 
            februaryDays = 29;
        }
    } 

    daysNumber = new Array (31, februaryDays, 31, 30, 31, 30, 
                            31, 31, 30, 31, 30, 31);

    /* Returning number of days for selected month and year. */
    return daysNumber[mm];
}

/*-------------------------------------------------------------------
 Returns month name.
-------------------------------------------------------------------*/
function monthName (mm) {
   var monthNames;

   monthNames = new Array('enero','febrero','marzo','abril',
                          'mayo','junio','julio','agosto',
                          'septiembre','octubre','noviembre',
                          'diciembre');

   return monthNames[mm];
}

/*-------------------------------------------------------------------
 Customizes mouseOver effects.
-------------------------------------------------------------------*/
function Hover(dd,x) {
    if (document.getElementById('day'+dd).value != " ") {
        if (x == 1) {
            document.getElementById('day'+dd).style.background = 
                                                       '#CCCCFF' 
        } else { 
            document.getElementById('day'+dd).style.background = 
                                                       '#FFFFFF' 
        }
    }
}

/*-------------------------------------------------------------------
 Returns selected data to textbox.
-------------------------------------------------------------------*/
function ShowDate(dd) {
    var selDay;
    var selMonth;

    /* Formatting day. */
    if ((dd - firstMonthWeekDay + 2) < 10) {
        selDay = '0' + (dd - firstMonthWeekDay + 2);
    } else {
        selDay = (dd - firstMonthWeekDay + 2);
    }

    /* Formatting month. */
    if ((1+monthShown) < 10) {
        selMonth = '0' + (1 + monthShown);
    } else {
        selMonth = (1 + monthShown);
    }

    /* Returning date to textbox. */
    if (document.getElementById('day'+dd).value != ' ' ) { 
        /* Customize this line to change output format!!! */
        document.getElementById(textboxId).value = selDay + '/' 
                                                 + selMonth + '/' 
                                                 + yearShown; 
    }
}

Para que funcione bonito es preciso que en el mismo directorio donde esté ubicado el archivo calendar.js se encuentren también las imágenes left.gif y right.gif que se pueden descargar desde esta misma página haciendo click derecho en las propias imágenes (los triangulitos azules que aparecen en el calendario para desplazarse entre meses y/o años).

Por último, ni que decir tiene que este calendario es muy mejorable y ampliable en funciones... ¡pero no seré yo quien lo haga! Simplemente lo dejo aquí por si a alguien puede servirle o puede aportarle alguna idea. ;-)

Servidor de bolsillo con WOS Portable.

Domingo, Mayo 25th, 2008

En el proyecto en el que actualmente estoy trabajando, decidimos utilizar una base de datos MySQL por su bajo coste y excelente rendimiento. De hecho fue una recomendación mía que la Dirección aceptó, por lo cual celebro que de momento nos esté dando el resultado tan bueno que nos está dando.

Así pues en mi portátil de trabajo tengo instalado un servidor MySQL en local. En él hago toda la fase de desarrollo antes de pasar tablas, triggers, procedimientos y demás al servidor MySQL del servidor de la empresa. Pero en ocasiones no tengo mi portátil a mano y me gustaría poder probar algunas cosas en otro PC. Hasta ahora tenía que desestimar la idea porque andar instalando el servidor MySQL en ordenadores ajenos es inviable. Pero hace poco he descubierto WOS Portable. Una maravilla. WOS Portable es un software que se instala en un pendrive cualquiera (bueno, dicen que algunos modelos dan problemas, pero parecen ser los menos y en cualquier caso a mí no me ha ocurrido) y nos permite que al conectar después ese pendrive en cualquier PC con Windows y ejecutar el archivo wos.exe automáticamente dispondremos de un servidor Apache + PHP + MySQL funcionando perfectamente, de tal manera que si en un navegador escribimos:

http://localhost

Obtendremos la página index.php que tenemos alojada en el pendrive (en el directorio www). Y si en una consola escribimos:

mysql -u root

Tendremos un servidor MySQL a nuestra entera disposición. (ver nota 1)

Personalmente este software me ha parecido una maravilla y creo que es muy útil para desarrolladores que solemos trabajar con más de un PC, ya que así nuestros datos pueden estar siempre en el pendrive y no tenemos que andar backupeándolos y restaurándolos constantemente. También se me ha ocurrido que puede resultar extremadamente útil como sistema de seguridad. Me explico: en mi empresa las aplicaciones funcionan como he dicho contra una base de datos MySQL alojada en el servidor. Si éste sufriera un accidente o cualquier imprevisto, la actividad se paralizaría y hasta que se restaurara el correcto funcionamiento del servidor podrían pasar horas o incluso días. En cambio ahora tenemos un pendrive con WOS Portable y cada X días le restauramos una copia de seguridad de la base de datos productiva. Con ello, ante cualquier eventualidad nos basta con conectar este pendrive, hacer un doble clic y ya tenemos de nuevo las aplicaciones funcionando. Realmente genial y recomendable.

Pues bien, WOS Portable se puede descargar libremente (es GNU-GPL) desde su sitio web. Para ello la única peculiaridad es que en lugar de bajarnos un archivo estándar podemos configurar qué aplicaciones extras (Joomla, Mambo, Wordpress, etc) queremos incorporar al paquete de instalación. Lo básico es Apache + PHP + MySQL, y personalmente no recomiendo añadirle mucha cosa más desde un inicio, puesto que siempre estamos a tiempo de hacer actualizaciones con nuevos paquetes. No obstante, yo sí le añadí el phpMyAdmin porque considero que en ocasiones resulta muy útil.

Una vez seleccionados los componentes nos generarán un archivo comprimido personalizado que sólo tendremos que bajarnos, descomprimirlo en el pendrive y ejecutar el fichero wos.exe. Con eso se llevará a cabo un proceso de configuración que tarda un ratito pero que no tiene complicación alguna. ;-)

Nota 1.

Para que esta sentencia funcione tenemos que tener un cliente MySQL (un archivo mysql.exe) en el PC y la ruta donde éste se encuentra guardada en la variable del sistema Path. Si no es así, cosa probable si no estamos en nuestro PC, siempre podemos ir primero a buscar el cliente:

F:
cd mysql/bin
mysql -u root