Bonjour à tous,

Suite à ce sujet : http://www.developpez.net/forums/d14...e/#post7769992

J'ai avancer et je pense m'approcher d'un fonctionnement "brut" mais ça ne fonctionne pas

Pour résumer je dois modifier une application (JSignPDF), open source, qui signe les document pdf numériquement avec une clé de cryptage de tel sorte à ce que la signature soit faite automatiquement dés qu'un nouveau document arrive dans un répertoire. Le fonctionnement de base est que l'on doit renseigner "manuellement" le fichier d'entrée et sortie à l'application pour ensuite lancer celle-ci : perte de temps.

Bref, j'ai réussi à utiliser l'API Path de JAVA : j'arrive à savoir lorsqu'il y a un nouveau fichier et récupérer son nom, chemin et indiquer à l'appli "de base" le nom/chemin des nouveaux fichiers d'entrées/sorties. Suite à la détection d'un nouveau fichier j'appelle la méthode pour signer un fichier PDF. Je pensais que ça aller fonctionner mais toujours pas.

Voici le code de la classe que j'ai ajouter :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
public class test {
 
	public static void main(String[] args)
	{
		// TODO Auto-generated method stub
try {
 
		BasicSignerOptions Infiletest = new BasicSignerOptions();     // On appelle la classe basicsigneroptions
		Path chemin = Paths.get(Chemin1);    //on prend le chemin complet du fichier infile
                Path cheminout = Paths.get(Chemin2);  // on prend le chemin complet du fichier outfile qui viens d'être signer manuellement
// Le futur but sera de tout d'abord signer un document "manuellement" avec l'appli pour avoir un répertoire d'entrée et de sortie à utiliser
 
		final Path dir = chemin.getParent();        // on prend le répertoire du fichier infile
                Path dirout = cheminout.getParent();      // on prend le répertoire du fichier outfile
 
		WatchService watcher = FileSystems.getDefault().newWatchService();
 
		WatchKey key = dir.register(watcher,
	    		StandardWatchEventKinds.ENTRY_CREATE);
 
 
		for (;;) {
 
 
 
		    try {
		        key = watcher.take();
		    } catch (InterruptedException x) {
		        return;
		    }
 
		    for (WatchEvent<?> event: key.pollEvents()) {
		        WatchEvent.Kind<?> kind = event.kind();
 
 
		        WatchEvent<Path> ev = (WatchEvent<Path>)event;
		        Path filename = ev.context();
                String type = Files.probeContentType(filename); 
		        try {
		            Path child = dir.resolve(filename);
		            if (!Files.probeContentType(child).equals("application/pdf")) {		          
		                System.err.format("New file '%s'" +
		                    " is not a pdf application file.%n", filename);
		                continue;		               		              
		           }
		        } catch (IOException x) {
		            System.err.println(x);
 
		            continue;
		        }
 
System.out.println("Le fichier est : " + dir+ "\\" + filename ); //Le fichier est : C:\Users\avidegrain\Desktop\repertoire_1\test.pdf

Path FileOut = Paths.get(dirout+ "\\" + filename);
System.out.println("Le fichier Out est : " + FileOut); //Le fichier Out est : C:\Users\avidegrain\Desktop\repertoire_2\test.pdf

Path FileIn = Paths.get(dir+ "\\" + filename);
System.out.println("Le fichier In est : " + FileIn); //Le fichier In est : C:\Users\avidegrain\Desktop\repertoire_1\test.pdf

BasicSignerOptions options = new BasicSignerOptions();
options.setInFile(FileIn.toString()); //BasicSignerOptions.InFile=C:\Users\avidegrain\Desktop\repertoire_1\test.pdf
options.setOutFile(FileOut.toString()); // BasicSignerOptions.OutFile= C:\Users\avidegrain\Desktop\repertoire_2\test.pdf
SignerLogic sl = new SignerLogic(options);
sl.signFile(); //On signe => ECHEC.

//Les print me permettent de vérifier les chemins lors du lancement de l'appli
 
		    }
 
		    boolean valid = key.reset();
		    if (!valid) {
		        break;
		    }
		}
} catch (IOException x) {
	    System.err.println(x);
	}
 
}
	public String FileOut;
	public String FileIn;
	public int eventest;                           // Ici on rend les variables public pour les utiliser dans d'autre classe
}
Et voici mon message d'erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
INFO  Vérification des chemins des fichiers d'entrée/sortie
INFO  Lecture de l'alias de la clé
INFO  Utiliser un alias pour la clé : null
INFO  Lecture de la clé privée
ERROR L'application a rencontré un problème.
java.lang.NullPointerException
	at sun.security.provider.JavaKeyStore$JKS.convertAlias(JavaKeyStore.java:57)
	at sun.security.provider.JavaKeyStore.engineGetKey(JavaKeyStore.java:118)
	at sun.security.provider.JavaKeyStore$JKS.engineGetKey(JavaKeyStore.java:55)
	at java.security.KeyStore.getKey(KeyStore.java:1011)
	at net.sf.jsignpdf.utils.KeyStoreUtils.getPkInfo(KeyStoreUtils.java:428)
	at net.sf.jsignpdf.SignerLogic.signFile(SignerLogic.java:136)
	at net.sf.jsignpdf.test.main(test.java:141)
INFO  Opération terminée. Echec de la signature du fichier PDF.
Voilà, et me voilà bloquer de nouveau Pourtant j'ai l'impression de presque obtenir un fonctionnement "brut", c'est d'autant plus rageant :p