Actualizar java en Ubuntu


Para conseguir que un fichero .jar funcione en Ubuntu deben cumplirse dos requisitos

      1. Tener instalada la máquina virtual de java
      2. Definir el programa a utilizar para abrir los ficheros .jar

Comentar que existen dos versiones

      1. El JRE o Java Runtime Enviroment que no es más que el conjunto de aplicaciones y librerías necesarias para poder usar una aplicación Java (prácticamente la máquina virtual y algunas herramientas más)
      2. El JDK o Java Development Kit que está formado por el JRE mencionado en el punto anterior y todo lo necesario para poder desarrollar aplicaciones en este lenguaje de programación.

Si tiene instalado el JRE,bastara con hacer click con el botón derecho sobre un fichero .jar y seleccionar  en el formulario que nos aparece, escribir a continuación escribiremos

java -jar

Bueno ¿y  si no nos funciona?  

Pues en ocasiones si intentamos instalar el JRE  en Ubuntu   puede  ser casi  un verdadera  odisea pues es frecuente que  muestre un  error similar al siguiente:

introducir el código aquí sudo apt install oracle-java8-set-default
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias       
Leyendo la información de estado... Hecho
, pero algún
otro paquete hace referencia
a él. Esto puede significar que el paquete falta, está obsoleto o sólo         
se encuentra disponible desde alguna otra fuente
Sin embargo, los siguientes paquetes lo reemplazan:
oracle-java12-set-default oracle-java11-set-default-local

E: El paquete «oracle-java8-set-default» no tiene un candidato para la 
instalación

También si  intenta con el siguiente  comando nos da el mismo error

sudo apt install oracle-java8-installer

Puede   que muestre este mensaje :

 los siguientes paquetes lo reemplazan: oracle-java12-set-default oracle-java11-set-default-local

El problema es que si adicionamos  también el repositorio de webupd8 esos paquetes se encuentran en otro  repositorio .

sudo add-apt-repository ppa:webupd8team/java – 

Pero   aun así , si lo intentamos instalar  seguimos obteniendo el mismo error

Este es un log de ejemplo de lo que pueda usted también sufriendo intentando instalar el jdk por ejemplo para  crear aplicaciones en java con el Ide de Eclpise  o simplemente porque necesita  ejecutar un jar  desde Ubuntu Linux Mint o cualquier otra version de Linux: 




[email protected]:~$ sudo add-apt-repository ppa:webupd8team/java
[sudo] contraseña para soloelectronicos:
The Oracle JDK License has changed for releases starting April 16, 2019.

The new Oracle Technology Network License Agreement for Oracle Java SE is substantially different from prior Oracle JDK licenses. The new license permits certain uses, such as personal use and development use, at no cost -- but other uses authorized under prior Oracle JDK licenses may no longer be available. Please review the terms carefully before downloading and using this product. An FAQ is available here: https://www.oracle.com/technetwork/java/javase/overview/oracle-jdk-faqs.html

Oracle Java downloads now require logging in to an Oracle account to download Java updates, like the latest Oracle Java 8u211 / Java SE 8u212. Because of this I cannot update the PPA with the latest Java (and the old links were broken by Oracle).

For this reason, THIS PPA IS DISCONTINUED.

For Oracle Java 11, see a different PPA -> https://www.linuxuprising.com/2019/06/new-oracle-java-11-installer-for-ubuntu.html

That same PPA also has Oracle Java 13 -> https://www.linuxuprising.com/2019/09/install-oracle-java-13-on-ubuntu-linux.html

and Oracle Java 14 ->
https://www.linuxuprising.com/2020/03/how-to-install-oracle-java-14-jdk14-on.html

Old description:

Oracle Java (JDK) Installer (automatically downloads and installs Oracle JDK8). There are no actual Java files in this PPA.

Important -> Why Oracle Java 7 And 6 Installers No Longer Work: http://www.webupd8.org/2017/06/why-oracle-java-7-and-6-installers-no.html

Update: Oracle Java 9 has reached end of life: http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.html

The PPA supports Ubuntu 18.10, 18.04, 16.04, 14.04 and 12.04.

More info (and Ubuntu installation instructions):
- http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html

Debian installation instructions:
- Oracle Java 8: http://www.webupd8.org/2014/03/how-to-install-oracle-java-8-in-debian.html
Más información: https://launchpad.net/~webupd8team/+archive/ubuntu/java
Pulse [ENTRAR] para continuar o Ctrl+C para cancelar la adición.

Obj:1 http://ppa.launchpad.net/thopiekar/cura/ubuntu bionic InRelease
Des:2 http://ppa.launchpad.net/webupd8team/java/ubuntu bionic InRelease [15,4 kB]
Obj:3 http://es.archive.ubuntu.com/ubuntu bionic InRelease
Des:4 http://security.ubuntu.com/ubuntu bionic-security InRelease [88,7 kB]
Obj:5 https://repo.skype.com/deb stable InRelease
Des:6 http://es.archive.ubuntu.com/ubuntu bionic-updates InRelease [88,7 kB]
Des:7 http://es.archive.ubuntu.com/ubuntu bionic-backports InRelease [74,6 kB]
Des:8 http://security.ubuntu.com/ubuntu bionic-security/main amd64 DEP-11 Metadata [38,7 kB]
Des:9 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 DEP-11 Metadata [42,1 kB]
Des:10 http://es.archive.ubuntu.com/ubuntu bionic-updates/main i386 Packages [669 kB]
Des:11 http://security.ubuntu.com/ubuntu bionic-security/multiverse amd64 DEP-11 Metadata [2.464 B]
Des:12 http://es.archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [915 kB]
Des:13 http://es.archive.ubuntu.com/ubuntu bionic-updates/main amd64 DEP-11 Metadata [301 kB]
Des:14 http://es.archive.ubuntu.com/ubuntu bionic-updates/universe i386 Packages [1.014 kB]
Des:15 http://es.archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [1.065 kB]
Des:16 http://es.archive.ubuntu.com/ubuntu bionic-updates/universe amd64 DEP-11 Metadata [273 kB]
Des:17 http://es.archive.ubuntu.com/ubuntu bionic-updates/universe DEP-11 64x64 Icons [458 kB]
Des:18 http://es.archive.ubuntu.com/ubuntu bionic-updates/multiverse amd64 DEP-11 Metadata [2.468 B]
Des:19 http://es.archive.ubuntu.com/ubuntu bionic-backports/universe amd64 DEP-11 Metadata [7.968 B]
Descargados 5.057 kB en 4s (1.376 kB/s)
Leyendo lista de paquetes... Hecho
[email protected]:~$ sudo apt update
Obj:1 http://ppa.launchpad.net/thopiekar/cura/ubuntu bionic InRelease
Obj:2 http://es.archive.ubuntu.com/ubuntu bionic InRelease
Des:3 http://security.ubuntu.com/ubuntu bionic-security InRelease [88,7 kB]
Obj:4 http://ppa.launchpad.net/webupd8team/java/ubuntu bionic InRelease
Des:5 http://es.archive.ubuntu.com/ubuntu bionic-updates InRelease [88,7 kB]
Obj:6 https://repo.skype.com/deb stable InRelease
Des:7 http://es.archive.ubuntu.com/ubuntu bionic-backports InRelease [74,6 kB]
Des:8 http://security.ubuntu.com/ubuntu bionic-security/main amd64 DEP-11 Metadata [38,6 kB]
Des:9 http://es.archive.ubuntu.com/ubuntu bionic-updates/main amd64 DEP-11 Metadata [301 kB]
Des:10 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 DEP-11 Metadata [42,1 kB]
Des:11 http://security.ubuntu.com/ubuntu bionic-security/multiverse amd64 DEP-11 Metadata [2.464 B]
Des:12 http://es.archive.ubuntu.com/ubuntu bionic-updates/universe amd64 DEP-11 Metadata [273 kB]
Des:13 http://es.archive.ubuntu.com/ubuntu bionic-updates/multiverse amd64 DEP-11 Metadata [2.468 B]
Des:14 http://es.archive.ubuntu.com/ubuntu bionic-backports/universe amd64 DEP-11 Metadata [7.968 B]
Descargados 920 kB en 3s (307 kB/s)
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Se pueden actualizar 12 paquetes. Ejecute «apt list --upgradable» para verlos.
[email protected]:~$ sudo apt install oracle-java8-installer
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
El paquete oracle-java8-installer no está disponible, pero algún otro paquete hace referencia
a él. Esto puede significar que el paquete falta, está obsoleto o sólo se
encuentra disponible desde alguna otra fuente

E: El paquete «oracle-java8-installer» no tiene un candidato para la instalación

[email protected]:~$ apt list --upgradable
Listando... Hecho
binutils/bionic-updates,bionic-security 2.30-21ubuntu1~18.04.3 amd64 [actualizable desde: 2.30-21ubuntu1~18.04.2]
binutils-common/bionic-updates,bionic-security 2.30-21ubuntu1~18.04.3 amd64 [actualizable desde: 2.30-21ubuntu1~18.04.2]
binutils-x86-64-linux-gnu/bionic-updates,bionic-security 2.30-21ubuntu1~18.04.3 amd64 [actualizable desde: 2.30-21ubuntu1~18.04.2]
gnome-software/bionic-updates 3.28.1-0ubuntu4.18.04.15 amd64 [actualizable desde: 3.28.1-0ubuntu4.18.04.14]
gnome-software-common/bionic-updates,bionic-updates 3.28.1-0ubuntu4.18.04.15 all [actualizable desde: 3.28.1-0ubuntu4.18.04.14]
libbinutils/bionic-updates,bionic-security 2.30-21ubuntu1~18.04.3 amd64 [actualizable desde: 2.30-21ubuntu1~18.04.2]
libjson-glib-1.0-0/bionic-updates 1.4.2-3ubuntu0.18.04.1 amd64 [actualizable desde: 1.4.2-3]
libjson-glib-1.0-common/bionic-updates,bionic-updates 1.4.2-3ubuntu0.18.04.1 all [actualizable desde: 1.4.2-3]
libnautilus-extension1a/bionic-updates 1:3.26.4-0~ubuntu18.04.5 amd64 [actualizable desde: 1:3.26.3-0ubuntu4]
python3-update-manager/bionic-updates,bionic-updates 1:18.04.11.12 all [actualizable desde: 1:18.04.11.10]
update-manager/bionic-updates,bionic-updates 1:18.04.11.12 all [actualizable desde: 1:18.04.11.10]
update-manager-core/bionic-updates,bionic-updates 1:18.04.11.12 all [actualizable desde: 1:18.04.11.10]
[email protected]:~$ java --version
openjdk 11.0.7 2020-04-14
OpenJDK Runtime Environment (build 11.0.7+10-post-Ubuntu-2ubuntu218.04)
OpenJDK 64-Bit Server VM (build 11.0.7+10-post-Ubuntu-2ubuntu218.04, mixed mode, sharing)
[email protected]:~$ sudo apt install oracle-java8-installer
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
El paquete oracle-java8-installer no está disponible, pero algún otro paquete hace referencia
a él. Esto puede significar que el paquete falta, está obsoleto o sólo se
encuentra disponible desde alguna otra fuente

E: El paquete «oracle-java8-installer» no tiene un candidato para la instalación
[email protected]:~$ sudo apt install default-jre
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
default-jre ya está en su versión más reciente (2:1.11-68ubuntu1~18.04.1).
El paquete indicado a continuación se instaló de forma automática y ya no es necesario.
libllvm6.0
Utilice «sudo apt autoremove» para eliminarlo.
0 actualizados, 0 nuevos se instalarán, 0 para eliminar y 12 no actualizados.
[email protected]:~$
[email protected]:~$ sudo apt install oracle-java8-installer
[sudo] contraseña para soloelectronicos:
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
El paquete oracle-java8-installer no está disponible, pero algún otro paquete hace referencia
a él. Esto puede significar que el paquete falta, está obsoleto o sólo se
encuentra disponible desde alguna otra fuente

E: El paquete «oracle-java8-installer» no tiene un candidato para la instalación

 

RESOLUCION

Pues el problema es que el repo webupd8team lo han descontinuado desde hace ya tiempo; teniendo el mismo inconveniente en Mint 19.1 queriendo instalar la JDK 1.8.0_31, y  la solución que he encontrado es netamente manual pero muy sencilla :

Lo primero es descargar la JDK desde el sitio web de Oracle    donde nos van a pedir las credenciales  para acceder ( es gratuito)

Después, desde  una ventana  de terminal  ejecute los siguientes comandos (tenga cuidado pues los comandos varian en la version de JDK!):

  1. Descomprimir al directorio /usr/lib/jvm:

sudo tar -zxf ~/Descargas/jdk-8u202-linux-x64.tar.gz -C /usr/lib/jvm

  1. Actualizar el comando java:

sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_202/bin/java 100

  1. Actualizar el comando javac:

sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.8.0_202/bin/javac 100

  1. Establecer la JDK de Oracle como default:

sudo update-alternatives --config java

Y seleccione la opción correspondiente a la JDK 8( en el ejemplo  seleccione 3):

 

[email protected]:~/Descargas$ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_202/bin/java 100
[email protected]:~/Descargas$ sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.8.0_202/bin/javac 100
[email protected]:~/Descargas$ sudo update-alternatives --config java
Existen 2 opciones para la alternativa java (que provee /usr/bin/java).

Selección Ruta Prioridad Estado
------------------------------------------------------------
* 0 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1111 modo automático
1 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1111 modo manual
2 /usr/lib/jvm/jdk1.8.0_202/bin/java 100 modo manual

Pulse <Intro> para mantener el valor por omisión [*] o pulse un número de selección: 2
update-alternatives: utilizando /usr/lib/jvm/jdk1.8.0_202/bin/java para proveer /usr/bin/java (java) en modo manual





Anuncio publicitario

Enviar correo internamente usando JavaMail API


En realidad no es demasiado difícil crear un aplicación capaz de enviar correos electrónicos usando el IDE de Android Studio  .De hecho gracias al APi de Javmail   podremos enviar e-mails sin utilizar la aplicación de correo electrónico que android incluye por defecto utilizando javamail API para crear nuestro propio email del remitente herramientas que enviará correo internamente.

Tenemos que seguir los pasos que se dan a continuación:

1. Descargar los archivos de biblioteca de api de java.

Tenemos que descargar  tres   librerías java: 

    1. activation.jar
    2. mail.jar.
    3.  additionnal.jar

    Lo puede descargar de Clic aquí.

    2 Ahora crear una  app en Android studio

    3-Ir a la carpeta del proyecto -> aplicación -> libs y agregue todos los archivos jar en libs ahora uno por uno, haga clic en biblioteca de archivos en la opción haga clic en Agregar como biblioteca en todos los archivos jar.

    libs

    También puede Agregar biblioteca por otro camino, pero lo  importante es que incluya esta tres librerías:

    1. activation.jar
    2. mail.jar.
    3.  additionnal.jar

    Ir a archivo >Proyecto estructura > seleccione aplicación> opción derecha haga clic en dependencias ahora haga clic en el botón de pulse(+) para agregar > seleccione dependencia de archivo> archivo seleccione Biblioteca > OK.

    addjar

    4. Ahora abrir el archivo manifest.xml y poner los permisos de internet.

     <uses-permission android:name="android.permission.INTERNET"/>

    Ahora busque manifiesto está buscando como.

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.sp.sendmailinternally">
        <uses-permission android:name="android.permission.INTERNET"/>
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>

    4. Ahora abrael fichero  activity_main.xml para crear el archivo de diseño agregar después de código.

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.sp.sendmailinternally.MainActivity">
        <EditText
            android:id="@+id/edittext_recipient_id"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Recipient Email"
            android:textSize="18sp" />
        <EditText
            android:id="@+id/edittext_subject"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Subject"
            android:textSize="18sp" />
        <EditText
            android:id="@+id/edittext_message"
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:gravity="start"
            android:hint="Message"
            android:textSize="18sp" />
        <Button
            android:id="@+id/btn_send_mail"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="Send Mail"
            android:textAllCaps="false" />
    </LinearLayout>

    5. Cree la  clase de Asyntask para el envío de llamada correo API.

    package com.sp.sendmailinternally;
    import android.app.ProgressDialog;
    import android.content.Context;
    import android.os.AsyncTask;
    import android.widget.Toast;
    import java.util.Properties;
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.PasswordAuthentication;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    /**
     * Created by ps205 on 3/1/17.
     */
    public class SendMailAsynTask extends AsyncTask<Void, Void, Void> {
        //Declaring Variables
        private Context context;
        private Session session;
        //Information to send email
        private String email;
        private String subject;
        private String message;
        //Progressdialog to show while sending email
        private ProgressDialog progressDialog;
        //Class Constructor
        public SendMailAsynTask(Context context, String email, String subject, String message) {
            //Initializing variables
            this.context = context;
            this.email = email;
            this.subject = subject;
            this.message = message;
        }
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            //Showing progress dialog while sending email
            progressDialog = ProgressDialog.show(context, "Sending message", "Please wait...", false, false);
        }
        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            //Dismissing the progress dialog
            progressDialog.dismiss();
            //Showing a success message
            Toast.makeText(context, "Message Sent", Toast.LENGTH_LONG).show();
        }
        @Override
        protected Void doInBackground(Void... params) {
            //Creating properties
            Properties props = new Properties();
            //Configuring properties for gmail
            //If you are not using gmail you may need to change the values
            props.put("mail.smtp.host", "smtp.gmail.com");
            props.put("mail.smtp.socketFactory.port", "465");
            props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            props.put("mail.smtp.auth", "true");
            props.put("mail.smtp.port", "465");
            //Creating a new session
            session = Session.getDefaultInstance(props,
                    new javax.mail.Authenticator() {
                        //Authenticating the password
                        protected PasswordAuthentication getPasswordAuthentication() {
                            return new PasswordAuthentication(Config.EMAIL, Config.PASSWORD);
                        }
                    });
            try {
                //Creating MimeMessage object
                MimeMessage mm = new MimeMessage(session);
                //Setting sender address
                mm.setFrom(new InternetAddress(Config.EMAIL));
                //Adding receiver
                mm.addRecipient(Message.RecipientType.TO, new InternetAddress(email));
                //Adding subject
                mm.setSubject(subject);
                //Adding message
                mm.setText(message);
                //Sending email
                Transport.send(mm);
            } catch (MessagingException e) {
                e.printStackTrace();
            }
            return null;
        }
    }

    6. Ahora abra MainActivity.java y agregue el siguiente código.

    package com.sp.sendmailinternally;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    public class MainActivity extends AppCompatActivity {
        EditText edittext_recipient_id, edittext_subject, edittext_message;
        Button btn_send_mail;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //initializr vista para encontar vista por id
            edittext_recipient_id = (EditText) findViewById(R.id.edittext_recipient_id);
            edittext_subject = (EditText) findViewById(R.id.edittext_subject);
            edittext_message = (EditText) findViewById(R.id.edittext_message);
            btn_send_mail = (Button) findViewById(R.id.btn_send_mail);
    //activar un listener  onclick en un  boton
            btn_send_mail.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //get  input data from view
                    String mRecipientMail = edittext_recipient_id.getText().toString();
                    String mSubject = edittext_subject.getText().toString();
                    String mMessage = edittext_message.getText().toString();
                    new SendMailAsynTask(MainActivity.this, mRecipientMail, mSubject, mMessage).execute();
    //llama al contructor de send mail asyntask mediante el envio de un parametroperameter } }); } }

    7. Ya puede construir y ejecutar la aplicación  

    Nota:- cuando ponga su id debe ser accesible acceso menos seguro aplicaciones .Para cambiar configuración para motivos de seguridad de correo vaya a cambiar la configuración   y actiíela .

     

    sendmail1

    Por cierto todo el código  esta disponible en descargar código fuente

     

     

     

    Ingeniería inversa con java


    Si alguna vez  ha tenido un proyecto java compilado en forma de fichero .class  o .jar   y necesita conocer como esta construido el código para  hacer ingeniería inversa o simplemente para investigar su  funcionamiento,  la herramienta que vamos a ver, lo hace de maravilla ! y además es gratuita!, veamos en detalle en que consiste.

    En  efecto el «proyecto Java Decompiler» tiene como objetivo desarrollar herramientas para descompilar y analizar el «código de bytes» de Java 5 y las versiones posteriores siendo  JD-GUI la utilidad gráfica independiente que muestra los códigos fuente de Java de los archivos «.class».

    Con esta herramienta puede explorar el código fuente reconstruido con la GUI de JD para obtener acceso instantáneo a los métodos y campos Incluso puede integrarse  con el IDE de Eclipse  gracias a  JD-Eclipse, que  es un complemento para la plataforma Eclipse.

    La herramienta le permite mostrar todas las fuentes Java durante su proceso de depuración, incluso si no las tiene todas. JD-Core es una biblioteca que reconstruye el código fuente de Java de uno o más archivos «.class». JD-Core se puede usar para recuperar el código fuente perdido y explorar la fuente de las bibliotecas de tiempo de ejecución de Java.

    Se admiten las nuevas características de Java 5, como anotaciones, genéricos o tipo «enum». JD-GUI y JD-Eclipse incluyen la biblioteca JD-Core. JD-Core, JD-GUI y JD-Eclipse son proyectos de código abierto publicados bajo la licencia GPLv3.

    Veamos un poco algo sobre la historia de esta  interesante  herramienta:

    • En 2011, Alex Kosinsky inició una variante de JD-Eclipse que admite la alineación del código descompilado por los números de línea de los originales, que a menudo se incluyen en el Bytecode original como información de depuración.
    • En 2012, una rama de JDEclipse-Realign de Martin «Mchr3k» Robertson  extendió la funcionalidad mediante el control de descompilación manual y el soporte para Eclipse 4.2 (Juno).
    • Y llegamos a la actualidad    D (Java Decompiler) ,  es un decompilador para el lenguaje de programación Java.Se proporciona como una herramienta GUI, así como en forma de complementos para los entornos de desarrollo integrado Eclipse (JD-Eclipse) e IntelliJ IDEA (JD-IntelliJ).Es compatible con la mayoría de las versiones de Java desde 1.1.8 hasta 1.7.0, así como JRockit 90_150, Jikes 1.2.2, Eclipse Java Compiler y Apache Harmony y, por lo tanto, a menudo se utiliza donde anteriormente se operaba el popular JAD

    Java decompiler

    Instalación

    Se puede descargar directamente desde  su pagina de Github

    La versión ultima   disponibles  es la 1.5.2

    Esta versión incluye los siguientes cambios:

    • Actualizando JD-Core a 1.0.3
    • Adición de soporte de archivos AAR (archivo de Android)
    • Adición de soporte de archivos JMOD (módulo Java 9)

    Este   es el enlace para descargar el  jd-gui-windows-1.5.2.zip   que es la versión  que   funciona sobre windows.

    Descomprimimos el  ficherpo zip ( https://github.com/java-decompiler/jd-gui/releases/download/v1.5.2/jd-gui-windows-1.5.2.zip)

    Finamente lanzaremos la aplicación  jd-gui.exe

    JD-GUI es una utilidad gráfica independiente que muestra los códigos fuente de Java de los archivos «.class»  y también  «.jar»  . Puede explorar el código fuente reconstruido con la GUI de JD para obtener acceso instantáneo a los métodos y campos.

    Existe JD-Eclipse es un complemento para la plataforma Eclipse. Le permite mostrar todas las fuentes Java durante su proceso de depuración, incluso si no las tiene todas.

    JD-GUI es una utilidad gráfica independiente que muestra los códigos fuente de Java de los archivos «.class». Puede explorar el código fuente reconstruido con la GUI de JD para obtener acceso instantáneo a los métodos y campos.

    Mas  información en su sitio  http://java-decompiler.github.io/

    Como acceder desde Java a contenidos de celdas en Excel


    Lo cierto es puede que  en  ocasiones necesitemos procesar ficheros excel u otro tipo de hojas de cálculo de   forma automatizada, por ejemplo  para extraer  información  de determinadas celdas, manipular estas , generar ficheros de metadatos que  sigan ciertas reglas , etc

    En este caso nos vamos a centrar en los documentos OLE 2 de Microsoft, que manipularemos  usando la libreria  Apache POI – the Java API for Microsoft Documents, que nos proporciona acceso a los diferentes tipos de ficheros de Microsoft que utilizan esta estructura como:  Excel Word o  Powerpoint, también hay otros proyectos dentro de esta API para Visio y Publisher por ejemplo

    Como se  puede   imaginar de todos estos el más desarrollado es Excel Workbooks y es precisamente el tipo de fichero elegido para este ejemplo.

    Antes de empezar  usaremos  la librería POI-HSSF and POI-XSSF – Java API To Access Microsoft, donde HSSF es el proyecto POI de implementación total en Java para ficheros excel.Esta libreria usa cuatro componentes fundamentalmente:

    • HSSFWorkbook: Representación de alto nivel de un libro (Workbook) que será nuestra documento excel. Es el primer objeto que construiremos si vamos a leer o escribir una hoja excel.
    • HSSFSheet: representación de alto nivel de una hoja excel, podemos elegir la hoja de la excel usando el HSSFWorkBook.
    • HSSFRow: representación de celda de una fila de la hoja excel, solo las filas que tienen filas se pueden añadir a la hoja.
    • HSSFCell: representación de una celda en una fila de la un hoja de la excel, la utilizaremos para manejar el contenido de la celda.

    Bien, sin más  dilaciones,  empezamos  a  ver como podemos procesar ficheros de Tipo Excel  

    Paso 1: Descargar librería Apache Poi Java API

    Antes de nada, tenemos que descargar la librería API Apache Poi Java, para añadirla a nuestro proyecto, voy a explicar cómo hacerlo en el IDE que estoy usando para este ejemplo: Netbeans, en otros IDES será similar la forma de integración de las librerías.

    En nuestro proyecto buscamos la carpeta Libraries nos colocamos encima y seleccionamos Add Library, no tiene mucho que explicar así que te lo mostraré en imágenes:

    La librería es  https://www.apache.org/dyn/closer.lua/poi/release/bin/poi-bin-4.1.0-20190412.zip

     

     

     

     

    Paso 2-Registro de la librería en nuestro proyecto

    Una vez  descargada y descomprimida, nos iremos a Properties del proyecto , después a   Java Build Path y   pincharemos en la pestaña  Libraries

    Aquí  pulsaremos Add External JARs  seleccionando «poi-4.01.jar» desde al ruta donde la hayamos dejado esta librería.

     

     

    Paso 3-Incluir las librerías

    Ahora toca pasarse  a  programar, pero antes , no debemos olvidar importar las  cuatro librerias  que comentaabamos al principio

    • HSSFRow: representación de celda de una fila de la hoja excel, solo las filas que tienen filas se pueden añadir a la hoja.
    • HSSFWorkbook: Representación de alto nivel de un libro (Workbook) que será nuestra documento excel. Es el primer objeto que construiremos si vamos a leer o escribir una hoja excel.
    • HSSFSheet: representación de alto nivel de una hoja excel, podemos elegir la hoja de la excel usando el HSSFWorkBook.
    • HSSFCell: representación de una celda en una fila de la un hoja de la excel, la utilizaremos para manejar el contenido de la celda

    Visto asi , adjuntando otras librerias utiles , la cabecera de importaciones de librerias quedaria  asi: 

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;


    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.Iterator;
    import java.util.ArrayList;
    import java.util.List;

    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.hssf.usermodel.HSSFSheet;

    import java.io.FileDescriptor;

    import org.apache.poi.ss.usermodel.Cell;

     

    Paso 4-Convertir al menos a  formato excel97  o superior

    Antes de proseguir , en caso de tener ficheros excel en formato muy antiguos( por ejemplo Excel 95) .  deberemos  convertir estos   al menos al  formato excel 97,  para ello, en caso de que el formato sea de excel 95 deberemos abrir dicho fichero e irnos  a la opción   Guardar como seleccionamos   «libro de Excel 97-2003(*.xls)»

     

     

     

    5-Pasemos al código

    Una vez salvada  la hoja en formato excel 97 o superior  veamos un simple ejemplo de cómo capturar  los valores contenidos en las celdas

     

                          ——

          FileInputStream file = new FileInputStream(new File("C:\\prueba.xls"));

        // Crear el objeto que tendrá el libro de Excel

          XSSFWorkbook workbook = new XSSFWorkbook(file);

          /** Obtenemos la primera pestaña a la que se quiera procesar indicando el indice.

         * Una vez obtenida la hoja excel con las filas que se quieren leer obtenemos el iterator

          * que nos permite recorrer cada una de las filas que contiene.

          */



          XSSFSheet sheet = workbook.getSheetAt(0);

          Iterator<Row> rowIterator = sheet.iterator();

          Row row;

        // Recorremos todas las filas para mostrar el contenido de cada celda

          while (rowIterator.hasNext()){

              row = rowIterator.next();

             // Obtenemos el iterator que permite recorres todas las celdas de una fila

              Iterator<Cell> cellIterator = row.cellIterator();

              Cell celda;

              while (cellIterator.hasNext()){

                celda = cellIterator.next();

                // Dependiendo del formato de la celda el valor se debe mostrar como String, Fecha, boolean, entero...

                switch(celda.getCellType()) {

                case Cell.CELL_TYPE_NUMERIC:

                    if( DateUtil.isCellDateFormatted(celda) ){

                       System.out.println(celda.getDateCellValue());

                    }else{

                       System.out.println(celda.getNumericCellValue());

                    }

                    break;

                case Cell.CELL_TYPE_STRING:

                    System.out.println(celda.getStringCellValue());

                    break;

                case Cell.CELL_TYPE_BOOLEAN:

                    System.out.println(celda.getBooleanCellValue());

                    break;

                }

              }

          }


       // cerramos el libro excel

          workbook.close();


    Como vemos en el ejemplo anterior , crearemos el objeto que tendrá el libro de Excel(FileInputStream file = new FileInputStream(new File(«xxx..) y obtenemos la primera pestaña a la que se quiera procesar indicando el indice 0 (  XSSFSheet sheet = workbook.getSheetAt(0);

    Una vez obtenida la hoja excel con las filas que se quieren leer ,obtenemos el iterator que nos permite recorrer cada una de las filas que contiene. (  Iterator<Row> rowIterator = sheet.iterator()😉

    Y  ya bastaría ir recorriendo todas las filas con un bucle  while ( while (cellIterator.hasNext()))  ,  lo cual nos  va  a permitir  procesar  el contenido de cada celda

    Obtenemos el iterator(  row = rowIterator.next(); ) que permite recorrer todas las celdas de una fila y salvar el objeto en la variable row

    Ahora ya dependiendo del formato de la celda de la variable   row  ,  el valor se debe mostrar como String, Fecha, boolean, entero

    El programa tras recorrer todas las filas acaba cerrando el libro excel

     

     

    Como ejemplo más elaborado , vamos a ver como procesar  una hoja excel s donde cada fila representa los diferentes metadatos , por lo que con el programa  iremos capturando dicha información diferente  celda a celda para cada fila , para ir componiendo una fila de texto con los diferentes metadatos  capturados   y  que separaremos por el carácter almohadilla ( #) .

    Finalmente veamos  pues el ejemplo cuya finalidad es extraer de un excel un fichero csv de un modo automático via el siguiente programa en java;

     

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;


    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.Iterator;
    import java.util.ArrayList;
    import java.util.List;

    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.hssf.usermodel.HSSFSheet;

    import java.io.FileDescriptor;

    import org.apache.poi.ss.usermodel.Cell;

     

     

    public class Main {

    //private static String nombre;

    public static void main(final String[] args) throws IOException {

    String lineaslog=»»;
    String lineaslog2=»\r\n»;

    //fichero de log
    File filelog = new File(«d://ficherolog.txt»);
    FileOutputStream fos2log = new FileOutputStream(filelog);

     


    //añadimos 4 ceros la contador y generamos nuevo nombre
    nfichero= «salida.txt»;
    System.out.println(«Nuevo nombre fichero salida:» + nfichero);
    lineaslog=»Nuevo nombre fichero salida:» + nfichero;
    fos2log.write(lineaslog.getBytes());
    fos2log.write(lineaslog2.getBytes());
    //Procesar el excel a txt


    //Creamos nuevo fichero de metadatos del tipo texto
    File file = new File(nfichero);
    FileOutputStream fos1 = new FileOutputStream(file);
    FileDescriptor fd = fos1.getFD();


    FileOutputStream fos2 = new FileOutputStream(fd);

    String rutaArchivo=files22[ i ] ; //directorio3;
    System.out.println («Leyendo archivo :» + rutaArchivo );
    lineaslog=»Leyendo archivo :» + rutaArchivo ;
    fos2log.write(lineaslog.getBytes());
    fos2log.write(lineaslog2.getBytes());

    System.out.println («NOMBRE HOJA :»+ hoja);
    lineaslog=»NOMBRE HOJA :»+ hoja;
    fos2log.write(lineaslog.getBytes());
    fos2log.write(lineaslog2.getBytes());



    try (FileInputStream fileexcel = new FileInputStream(new File(rutaArchivo)))

    {
    System.out.println(«Leer archivo Excel «);
    lineaslog=»Leer archivo Excel «;
    fos2log.write(lineaslog.getBytes());
    fos2log.write(lineaslog2.getBytes());

    // leer archivo excel97
    HSSFWorkbook worbook = new HSSFWorkbook(fileexcel);

    System.out.println(«Leyendo la hoja del fichero excel»);
    lineaslog=»Leyendo la hoja del fichero excel»;
    fos2log.write(lineaslog.getBytes());
    fos2log.write(lineaslog2.getBytes());

    //obtener la hoja que se va leer
    HSSFSheet sheet = worbook.getSheetAt(0);

    System.out.println(«Obtener las hojas del fichero excel»);
    lineaslog=»Obtener las hojas del fichero excel»;
    fos2log.write(lineaslog.getBytes());
    fos2log.write(lineaslog2.getBytes());
    //obtener todas las filas de la hoja excel
    Iterator<Row> rowIterator = sheet.iterator();

    Row row;

    System.out.println(«La ruta del fichero excel es rutaarchivo :»+rutaArchivo);
    lineaslog=»La ruta del fichero excel es rutaarchiv:»+rutaArchivo;
    fos2log.write(lineaslog.getBytes());
    fos2log.write(lineaslog2.getBytes());


    Integer nm3=0;

    while (rowIterator.hasNext()) // se recorre cada fila hasta el final

    {

    //System.out.println(«linea1»);

    row = rowIterator.next();
    nm3=nm3+1;

    //se obtiene las celdas por fila
    Iterator<Cell> cellIterator = row.cellIterator();
    Cell cell;

    //se recorre cada celda
    int indice=0;
    while (cellIterator.hasNext()) {

    // se obtiene la celda en específico y se la imprime
    cell = cellIterator.next();

    //System.out.print(«(i»+i +»)=»+ cell.getStringCellValue()+» | «);

    switch (indice) //tomaremos diferentes columnas del fichero excel
    {

    case 0:
    {
    nombre_fichero=cell.getStringCellValue();
    }
    case 1:
    {
    boletin=cell.getStringCellValue();
    }
    case 2:
    {
    telefono=cell.getStringCellValue();
    }

    case 3: // cif o nif
    {
    ncif=cell.getStringCellValue();
    }

    case 4: //valor del cif
    {
    cif=cell.getStringCellValue();
    }

    case 8:
    {
    fecha=cell.getStringCellValue();
    }
    case 9:
    {
    hora=cell.getStringCellValue();
    }
    }



    linea= linea + cell.getStringCellValue() +»#»;

    indice=indice+1;

    }


    lineas=boletin +»#» +telefono +»#»+ncif+»#» + cif+»#»+tipo +»#» +fecha+» «+hora+»#» +»#» +»#» +»#»+ nombre_fichero+ «#»+ nombre_fichero+»#»;


    fos2.write(lineas.getBytes());

    //System.out.println();

    lineas=»\r\n»;

    fos2.write(lineas.getBytes());

    }

    worbook.close();


    linearesumen= directorio+»;»+ hoja +»;»+directorio22+ «P5_»+ fechaok+String.format(«%05d», contador) +»;»+nm3;

    fos3.write(linearesumen.getBytes());

    linearesumen=»\r\n»;

    fos3.write(linearesumen.getBytes());

    nm3=0;

    }
    catch (Exception e)

    {

    e.getMessage();
    System.out.println(e.getMessage());
    lineaslog=e.getMessage();
    fos2log.write(lineaslog.getBytes());
    fos2log.write(lineaslog2.getBytes());

    }

    fos1.close();
    fos2.close();

    System.out.println(«Fin de generacion del txt de metadatos desde excel a txt»);
    lineaslog=»Fin de generacion del txt de metadatos desde excel a txt»;
    fos2log.write(lineaslog.getBytes());
    fos2log.write(lineaslog2.getBytes());

    }

    Extracción de datos de un pdf desde Java


    A veces  necesitamos  extraer información de texto procedente de  ficheros  en formato pdf   por ejemplo  para automatizar la extracción de determinada información  relevante que contengan o simplemente porque deseamos guardar la información editable  en  otro formato mas amigable. En realidad es realmente interesante    intentar   automatizar esta  tarea  pues así nos   evitamos  manipulaciones manuales   y tediosas lo cual seguramente nos hagan perder mucho tiempo  con la gran escasez de este elemento de la vida moderna del que  tampoco disponemos

    Vamos  a ver dos métodos  para hacerlo  usando el IDE  de  Eclipse y el lenguaje Java

    Método 1; mediante un paso intermedio con conversión previa de los ficheros pdf a ficheros de texto

    PDF to TXT Converter es una aplicación de Windows para convertir archivos pdf a archivos de formato de texto sin formato en modo batch. Este programa también admite la conversión de rango de páginas específicas a archivos txt  de modo que después de la conversión, obtendrá el texto editable del documento PDF original

    PDF to TXT Converter

    Esta  utilidad la podemos descargar   desde  aqui

    Hay una pequeña pega con este programa, pues dado que es shareware en la versión gratuita   tiene  bastantes limitaciones ,entre ellas que no se procesaran más de 200 documentos de un sola vez  ( si se intenta con más de esa cantidad   el programa pierde el control)

    Un punto a su favor es que permite convertir automáticamente directorios enteros  con contenido de ficheros pdf y de este modo no necesitamos seleccionar  uno a uno cuál de ellos queremos convertir ( pero no olvide que, a no ser que compre la version completa, solo debería contener como máximo 200  ficheros)

    Como vemos ,lo interesante de este programa  es que permite convertir los  ficheros pdf a texto  lo cual nos facilitara  procesar estos  muy fácilmente desde   java

    Ahora    vamos a   ver un ejemplo    cómo extraer  los metadatos de un documento  de tipo texto obtenido usando el programa anterior

    La idea es que a partir de los pdf convertidos previamente a txt , es que iremos  leyendo el contenidos de cada fichero txt e  interpretando las cadenas extraidas de los pdf para buscar  por ejemplo cuatro  meta-datos que necesitamos , haciendo  cuenta del orden en el que aparecen asi como las palabras justo anteriors:
    -meta1,
    -meta2
    -meta3
    -meta4:

    En esta búsqueda tiene sentido el número de orden en el que aparecen las cadenas anteriores a  la busqueda  pues según el orden en que aparezca corresponderá a un meta-dato u otro.

    En este caso meta2 hay que buscarlo dos veces , pero según este orden la cadena siguiente es meta2 o meta4

    Veamos el ejemplo;

    //*******************************************************
    //BLOQUE PRINCIPAL PARA EXTRAER  4 METADATOS de un fichero
    //*******************************************************

    //abre el fichero
    Scanner in =null;
    DecimalFormat formateador = new DecimalFormat(«####################»);
    Integer contador=0;

    //solo procesaremos los ficheros con la extrension txt
    if (sub.matches(tipofichero)) try{

    in = new Scanner(new FileReader(nombreFichero));
    in.useLocale(Locale.ENGLISH);

    //lee el fichero palabra a palabra

    while (in.hasNext())
    {
    //lee primera palabra
    String palabra = in.next();
    caa=palabra;

    if (procesa==true)
    {
    //System.out.println(«Palabra:»+palabra+ «contador=»+contador);

    if (contador==1)
    {instalacion=palabra;
    }
    if (contador==5)
    {nif=palabra;
    }

    procesa=false;
    contador++;

    }

    if (caa.matches(«pedido:»))
    {
    // System.out.println(«<<<Palabra pedido: ENCONTRADA:>>>»);
    procesan=true;
    contador++;
    }

    if (caa.matches(«instalación:»))
    {
    //System.out.println(«<<<<Palabra instalación: ENCONTRADA:>>>>»);//fecha
    procesa=true;
    contador++;
    }

    if (caa.matches(«NIF/NIE/Pasaporte:»))
    {
    // System.out.println(«<<<<Palabra NIF/NIE/Pasaporte: ENCONTRADA>>>>»);
    procesa=true;
    contador++;
    }

    //lee números
    while (in.hasNextDouble())
    {
    // lee un double

    double d = in.nextDouble();

    if (procesan==true)
    {
    //System.out.println(«Número:»+formateador.format(d)+»contador=»+contador);
    if (contador==3)
    {pedido=d;
    }
    if (contador==7)
    {linea=d;
    }
    procesan=false;
    contador++;
    }

    }

    } // while (in.hasNext())

    //resumen de datos capturados del pdf convertidos en txt y capturada en 4 campos que necesitamos

    System.out.println(«Instalacion:»+instalacion); //fecha
    System.out.println(«Pedido:»+formateador.format(pedido));
    System.out.println(«NIF:»+nif);
    System.out.println(«Telefono:»+formateador.format(linea));

    ….

     

    Método 2  directo usando la Liberia ItextPDF

    iText es una biblioteca Open Source para crear y manipular archivos PDFRTF, y HTML en Java. Fue escrita por Bruno LowagiePaulo Soares, y otros; está distribuida bajo la Affero General Public License.

    El mismo documento puede ser exportado en múltiples formatos, o múltiples instancias del mismo formato. Los datos pueden ser escritos a un fichero o, por ejemplo, desde un servlet a un navegador web.

    Más recientemente, ha sido extendida a una biblioteca PDF de propósito general, capaz de rellenar formularios, mover páginas de un PDF a otro, y otras cosas. Estas extensiones son a menudo mutuamente excluyentes. Una clase te permite rellenar en formularios, mientras una clase diferente e incompatible hace posible copiar páginas de un PDF a otro.

    El soporte de PDF de iText es, sin embargo, bastante extensivo. Esto soporta firmas basadas en PKI de PDF, cifrado de 40-bit y 128-bit, corrección de colores, PDF/X, gestión de colores por perfiles ICC, y es anfitriona de otras característica

    Podemos descargar el fichero itextpdf-5.1.0.jar  desde el respositorio de Maven   o de esta web  http://www.java2s.com/Code/Jar/i/Downloaditextpdf510jar.htm

    No debemos olvidar importar el jar desde el Ide  del  Eclipse   en propiedades del proyecto-->Java Build Path–>libraries –>Add External   JARs

    Este es un ejemplo  de captura sencilla   de como procesar un pdf directaeente

    import java.io.IOException;

    import com.itextpdf.text.pdf.PdfReader;
    import com.itextpdf.text.pdf.parser.PdfTextExtractor;

    public class prueba {

    /**
    * @param args
    */
    public static void main(String[] args) {
    try {

    PdfReader reader = new PdfReader(«d:/ttttt.pdf»);

    System.out.println(«This PDF has «+reader.getNumberOfPages()+» pages.»);
    String page = PdfTextExtractor.getTextFromPage(reader, 1);
    System.out.println(«Page Content:\n\n»+page+»\n\n»);
    System.out.println(«Is this document tampered: «+reader.isTampered());
    System.out.println(«Is this document encrypted: «+reader.isEncrypted());

    reader.close();
    } catch (IOException e) {
    e.printStackTrace();
    }

    }

    }

    Es importante la sentencia String page = PdfTextExtractor.getTextFromPage(reader, 1);  porque si ponemos 0 o un valor superior daría error

    Como   gracias  a la librería podemos capturar la informacion del   fichero pdf y aplicar la clase Sacanne para analizar las cadenas     para buscar determinada  informacion  que queremos catalogar vamos a  ver   el ejemplo anterior  usando los mismos campos  y con la misma casuitica:

    Este seria el mismo ejemplo de la  primer parte  , pero usando directamente los fichero pdf sin convertir a pdf:

    import java.awt.Rectangle;
    import java.awt.print.PageFormat;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.PrintStream;
    import java.io.PrintWriter;
    import java.text.DecimalFormat;
    import java.util.List;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileOutputStream;

    import java.io.IOException;

    import java.io.FileReader;
    import java.io.OutputStreamWriter;
    import java.io.Writer;
    import java.util.Scanner;
    import java.util.Locale;
    import java.io.FileNotFoundException;
    import java.nio.charset.StandardCharsets;
    import java.text.DecimalFormat;

    import java.io.StringReader;

    import java.util.Locale;
    import java.util.Scanner;

    import com.itextpdf.text.pdf.PdfReader;
    import com.itextpdf.text.pdf.parser.PdfTextExtractor;

    public class Main {

    /**
    * @param args
    */

    public static void main(final String[] args) throws IOException {

    String instalacion=»»;
    String nif=»»;
    double pedido=0;
    double linea=0;
    boolean procesa=false;
    boolean procesan=false;
    String tipofichero=»pdf»; // solo tomaremos ficheros con esta extension
    String caa = substring(20);

    String ruta = «D:\temp\ficheros\»;
    String ficherox=»28348758018_20181201000002.pdf»;
    String fichero=ruta+ ficherox;
    System.out.println(«Fichero a analizar =» +ficherox);

    int numero=ficherox.length()-3; //calcula donde empieza la extension del fichero
    // System.out.println(«numero=»+numero);
    String sub =ficherox.substring( numero); //calcula la extension del fichero
    System.out.println(«Extension del fichero :»+sub);

    //abrimos el PDF
    PdfReader reader = new PdfReader(fichero);
    int pages = reader.getNumberOfPages();
    System.out.println(«Este PDF tiene «+pages+» paginas.»);

    //empezamos la coversion a pdf
    String page = PdfTextExtractor.getTextFromPage(reader, 1); ////<———————————————–aqui da errror
    System.out.println(«Contenido del documento de la pagina «+pages);
    System.out.println(«\n\n»+page+»\n\n»);

    /////////////////////////////////////////////////////////////////////
    //solo procesaremos los ficheros con la extrension pdf
    ////////////////////////////////////////////////////////////////////

    if (sub.matches(tipofichero))

    /// try

    {

    //para procesar el texto lo copiamos a una cadena
    String nombreFichero = page ; //Fichero;

    System.out.println(«Convertido salida del conversor a un String «);

    //borra el scanner
    // Scanner in =null;

    //formatos de numeros
    DecimalFormat formateador = new DecimalFormat(«####################»);

    //inicializa conatdor
    int contador=0;

    //in = new Scanner(new FileReader(nombreFichero));///AQUI ESTA EL PROBLEMA PUES SCANNER NO EST ACEPTADNO EL STRING

    Scanner in = new Scanner(nombreFichero);

    in.useLocale(Locale.ENGLISH);
    System.out.println(«Es correcto el pdfl Convertido salida del conversor a un String «);
    //lee el fichero palabra a palabra

    while (in.hasNext()) //leemos toda la cadena
    {
    //lee primera palabra
    String palabra = in.next();
    caa=palabra;

    if (procesa==true)
    {
    //System.out.println(«Palabra:»+palabra+ «contador=»+contador);

    if (contador==1)
    {instalacion=palabra;
    }
    if (contador==5)
    {nif=palabra;
    }

    procesa=false;
    contador++;

    }

    if (caa.matches(«pedido:»))
    {
    // System.out.println(«<<<Palabra pedido: ENCONTRADA:>>>»);
    procesan=true;
    contador++;
    }

    if (caa.matches(«instalación:»))
    {
    //System.out.println(«<<<<Palabra instalación: ENCONTRADA:>>>>»);//fecha
    procesa=true;
    contador++;
    }

    if (caa.matches(«NIF/NIE/Pasaporte:»))
    {
    // System.out.println(«<<<<Palabra NIF/NIE/Pasaporte: ENCONTRADA>>>>»);
    procesa=true;
    contador++;
    }

    //lee números
    while (in.hasNextDouble())
    {
    // lee un double

    double d = in.nextDouble();

    if (procesan==true)
    {
    //System.out.println(«Número:»+formateador.format(d)+»contador=»+contador);
    if (contador==3)
    {pedido=d;
    }
    if (contador==7)
    {linea=d;
    }
    procesan=false;
    contador++;
    }

    }

    } // while (in.hasNext())
    in.close();

    //resumen de datos capturados del pdf convertido en txt

    System.out.println(«Instalacion:»+instalacion); //fecha
    System.out.println(«Pedido:»+formateador.format(pedido));
    System.out.println(«NIF:»+nif);
    System.out.println(«Telefono:»+formateador.format(linea));

    //fin de metatados de un documento INDIVIDUAL en el xml

    }

    }

    private static String substring(int i) {
    // TODO Auto-generated method stub
    return null;
    }//CLASS
    }

     

     

    Con esta librería como vemos  podemos procesar  de un modo relativamente sencilllo   cualquier contenido de un fichero  pdf    de un modo muy potente  como acabamos de ver .

    Como cambiar el idioma a español en el SonarQube


    Sonar nació para ser utilizada en desarrollos Java, pero actualmente soporta más de 20 lenguajes incluyendo Java, C#, JavaScript, TypeScript, C/C++, COBOL  y mas   integrándose  con  Maven, Ant y herramientas de integración continua como Atlassian Bamboo y Jenkins.

    SonarQube es pues  una potente herramienta open software  que permite analizar el código fuente  informándonos ,entre otras cosas, sobre código duplicado, estándares de codificación, pruebas unitarias, cobertura de código, complejidad ciclomática y mucho mas.

     

    Instalación  automática plugins

    SonarQube puede extender su funcionalidad por medio de la instalación de los famosos  plugins, los cuales atienden  a funcionalidades ampliadas  como pueden ser lenguajes soportados ( los mas normales son c#, java y js), otras herramientas de desarrollo,integración y gobierno así como otros  Idiomas soportados para el interfaz de Sonar

    De  forma general  siempre que queramos instalar un plugin debemos asegurarnos que dicho plugin está disponible para la versión de SonarQube que estamos usando   comprobándolo antes en la  matriz de versiones para cerciorarnos de que dicho plugin es compatible con nuestra versión

    Para instalar un plugin  de  forma automática por medio del Update Center  solamente hay que ir  Administration –> System  –>Update Center

    En el caso de querer instalar el  idioma español el plugin se llama Spanish Pack 

    Pulsaremos Install  sobre la opción Spanish  Pack el lado derecho    y luego realizada la descarga     no  olvidemos pulsar  el boton   Restart  en la parte superior y

     

    Instalación manual de Plugins

    Para instalar un plugin de forma manual  basta con ubicar el archivo JAR en la carpeta
    \sonarqube-XXXX\extensions\plugins y en el siguiente inicio de Sonar ya se contará con el plugin.

    En caso de no tener el archivo JAR tendremos que ejecutar un mvn package, mover el jar al directorio de plugins  y reiniciar el Sonar, procedimiento que podemos seguir por ejemplo  para cambiar el idioma del Sonar a esapañol .

    Para  instalar el  plugin para tener Sonar en Castellano  podemos seguir los siguientes pasos:

    1-Comprobamos también  antes en la  matriz de versiones para cerciorarnos de que dicho plugin es compatible con nuestra versión  pudiéndose instalar éstos  tanto de forma automática por medio del Update Center como de forma manual.

    En el caso de idioma español el plugin como hemos dicho , se llama Spanish Pack  y es compatible con todas las versiones del Sonar:

    spanishpack.PNG

    2- En la matriz de plugin  citada pulsamos en el link de Spanish Pack lo que nos lleva al repositorio de GitHub del siguiente pantallazo.
    Obtenemos asi la URL en la parte inferior derecha para, mediante git, clonar el repositorio. La  url del Git  seria:https://github.com/SonarQubeCommunity/sonar-l10n-es 

    github.PNG

    3-  Descargaremos el  archivo   ZIP   ,   descomprimiendo después el fichero en un directorio del ordenador

    4-Ahora , desde una ventana de comandos nos iremos al directorio donde los descargamos y  ejecutamos:  mvn  package

    consola

    Al finalizar el proceso , que como vemos tarda unos 13 minutos , en la carpeta target dentro de la  carpeta que descomprimimos, ya    tendremos el archivo JAR

    español.PNG

    Ahora  solo nos toca  copiar   dicho ficjero jar al directorio de Plugins  del sonnar  , y ya nos  servirá como plugin para modificar el idioma en cuanto se reinicie.

    sonarplugins

    Si esta el sonar ejecutándose sobre Windows habría que matar los procesos  java relacionados con el Sonar  o si no nos importa reiniciamos el equipo , y  volvemos a lanzar el Sonar

     

    Tanto si lo hace de forma automática como si hace la instalación del  plugin de forma manual al reiniciar ya debería tener el idioma español:

     

    Mas información  en  SonarQube,org

    Cambiar permisos en Solaris desde java


    Como es sabido , hay 3 atributos básicos en Unix  para archivos simples: lectura, escritura y ejecutar.

    •  R  , es decir permiso de lectura (read):Si tiene permiso de lectura de un archivo, puede ver su contenido.
    • W , es decir  permiso de escritura (write):Si tiene permiso de escritura de un archivo, puede modificar el archivo. Puede agregar, sobrescribir o borrar su contenido.
    • X, es decir permiso de ejecución (execute):Si el archivo tiene permiso de ejecución, entonces puedes decirle al sistema operativo que lo ejecute como si fuera un programa. Si es un programa llamado “foo” lo podremos ejecutar como cualquier comando.

    En este punto es muy interesante saber que un script en Cshell  (interprete) necesitara permisos de lectura y ejecución para poderlo lanzar, pero sin embargo un programa compilado  en java( por ejemplo en un jar) solo necesitara permisos de lectura  .

    Para  cambiar los permisos tanto en directorios como en ficheros en todas las versiones de unix y variantes   usamos el comando  chmod (change mode)  pudiéndose agregar o remover permisos a uno o mas archivos con + (mas) o – (menos)

    La representación octal de chmod es muy sencilla:

    • Lectura tiene el valor de 4
    • Escritura tiene el valor de 2
    • Ejecución tiene el valor de 1

    Entonces:

     rwx | 7 | Lectura, escritura y ejecución |
    rw- | 6 | Lectura, escritura |
    r-x | 5 | Lectura y ejecución |
    r– | 4 | Lectura |
    -wx | 3 | Escritura y ejecución |
    -w- | 2 | Escritura |
    –x | 1 | Ejecución |
    — | 0 | Sin permisos |

    Por lo tanto:

    chmod u=rwx,g=rwx,o=rwx | chmod 777 |
    chmod u=rwx,g=rx,o= | chmod 760 |
    chmod u=rw,g=r,o=r | chmod 644 |
    chmod u=rw,g=r,o= | chmod 640 |
    chmod u=rw,go= | chmod 600 |
    chmod u=rwx,go= | chmod 700 |

    Es decir para asignar a  un fichero o directorio permisos totales usaremos  el comando

    chmod 777  fichero

    Es una tarea habitual  que  nuestras aplicaciones java necesiten cambiar permisos  en el sistema de ficheros no solo windows sino tambien en la maquina donde se ejecutaran ( Solaris, Unix,etc)

    La forma tradicional de hacerlo a partir de Jr6   es mediante las primitivas  setReadable, setExecutable  o setWritable  del   objeto fichero (file)

    Por ejemplo para dar permisos totales (777) sobre un objeto file,   esta es  la sintaxis a usar:

         file.setReadable(true, false);

         file.setExecutable(true, false);

         file.setWritable(true, false);

    Por  desgracia   aunque podamos compilar código java mediante las primitivas  setReadable, setExecutable  o setWritable ,por ejemplo para dar permisos totales (777) sobre un objeto file ,   puede que en la maquina donde se ejecute  nos falle  porque tenga otra versión de java inferior

     

    Una solución bastante potente que  resuelve el problema es usar  el metodo untime.getRuntime().exec     que nos permite invocar  a otro programa java o incluso comandos del sistema operativo ( en nuestro  caso chmod 77)

     

    Como ejemplo ,  os  muestro una clase que cambia los permisos a 777 un fichero o directorio que se le pase como parámetro:

    public static void permisos777 (final String pathname)
    {

    Process theProcess = null;

    //intentamos cambiar los permisos del fichero recien creado
    System.out.println(«Cambiamos permisos 777 a «+pathname);
    try
    {
    theProcess = Runtime.getRuntime().exec(«chmod 777 «+ pathname);
    }
    catch(IOException e)
    {
    System.out.println(«Error en el método exec()»);
    }
    //fin de cambio de permisos

    }