je vais te laisser relire le code...
mais "blabla" je pense pas que ça soit réellement la valeur correcte à utiliser...
je vais te laisser relire le code...
mais "blabla" je pense pas que ça soit réellement la valeur correcte à utiliser...
...
peut-être par child.toAbsolutePath ou du truc du genre non?
Mais à quoi / quel fichier fait référence cette ligne ? A quoi sert options.setinfile() ? Parce que pour l'instant je vois toujours pas quoi mettre![]()
Sinon j'ai corrigé une autre erreur de mon code, à savoir que je renvoyais filename à la classe BasicSignerOptions alors que je dois renvoyer le chemin entier du nouveau fichier
Classe test, qui me dit lorsqu'il y a un nouveau fichier dans le répertoire surveiller :
Et les modifications de la classe BasicSignerOptions en rouge :
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 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(Infiletest.getInFile()); //on prend le chemin complet du fichier infile Path cheminout = Paths.get(Infiletest.getOutFile()); // on prend le chemin complet du fichier outfile qui viens d'être signer manuellement 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 Path FileIn = Paths.get(dir+ "/" + filename); // chemin complet du fichier d'entrée Path FileOut = Paths.get(dirout+ "/" + filename); // chemin complet du fichier de sortie 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; } int eventest = 1; //On passe la variable eventest à 1 lorsqu'il y a un nouveau fichier BasicSignerOptions options = new BasicSignerOptions(); options.setInFile(child.toAbsolutePath); SignerLogic sl = new SignerLogic(options); sl.signFile(); //Appel de la classe qui signe les fichiers } 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 }
J'ai également une question pour la suite, comment faire pour que le main() de ma classe test tourne en continue après qu'un fichier soit signé "manuellement" ?
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 public String getInFile() { test Infiletest = new test(); String nouveaufichier=Infiletest.FileIn; int valeur = Infiletest.eventest; if(valeur == 1) { inFile=nouveaufichier; } return inFile; } public void setInFile(final String inFile) { this.inFile = inFile; } public String getOutFile() { test Infiletest = new test(); String fichierprec=Infiletest.FileOut; int valeur = Infiletest.eventest; if(valeur == 1) { outFile=fichierprec; } return outFile; } public String getOutFileX() { //Retourne un autre nom de fichier de sortie s'il n'est pas renseigné String tmpOut = StringUtils.defaultIfBlank(outFile, null); // vérifie si outFile contient du texte if (tmpOut == null) { // s'il n'en a pas String tmpExtension = ""; String tmpNameBase = StringUtils.defaultIfBlank(getInFile(), null); //vérifie si infile contient du texte if (tmpNameBase == null) { //s'il n'en a pas tmpOut = "facnor.pdf"; } else { //si outfile n'a pas de texte et que infile en a if (tmpNameBase.toLowerCase().endsWith(".pdf")) { //si le nom d'entrée finit par .pdf final int tmpBaseLen = tmpNameBase.length() - 4; tmpExtension = tmpNameBase.substring(tmpBaseLen); tmpNameBase = tmpNameBase.substring(0, tmpBaseLen); // sur les 3 lignes, on transforme exemple.pdf } // en exemple (extrait le nom seul) tmpOut = tmpNameBase + Constants.DEFAULT_OUT_SUFFIX + tmpExtension; // le nom de sortit sera le nom } // de base + une constante + } // l'extension soit : return tmpOut; //exemple+_facnor+.pdf } public void setOutFile(final String outFile) { this.outFile = outFile;
Ou alors la ligne
sert à faire, dans la classe BasicSignerOptions, InFile = child ? Du coup ce que j'ai rajouter en rouge sur mon post précédent ne sert à rien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part options.setInFile(child.toAbsolutePath);
Si c'est ça il faudrait rien modifier dans la classe BasicSignerOptions et dans ma classe test il faut que je fasse :
Je me trompe ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Path FileOut = Paths.get(dirout+ "/" + filename); //On initialise le fichier de sortie Path FileIn = Paths.get(dir+ "/" + filename); // On initialise le fichier d'entrée BasicSignerOptions options = new BasicSignerOptions(); // On appel la classe options options.setInFile(FileIn.toString()); // On envoie notre chemin d'entrée options.setOutFile(FileOut.toString()); // Et de sortie SignerLogic sl = new SignerLogic(options); // On appel la classe pour signer sl.signFile(); // On signe
EDIT :
Donc j'ai effectué ces modifications, la procédure pour signer fonctionne lorsqu'il y a un nouveau fichier, j'ai renseigné les répertoires manuellement dans ma classe pour l'instant.
Mais j'ai une erreur qui est :
Donc je continue à bosser dessus (pas le choix de toute façon :p)
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:139) INFO Opération terminée. Echec de la signature du fichier PDF.
Mon erreur précédente était une erreur de // / \ dans les noms de fichiers
Code d'erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 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.
Après vérifications avec le debugger, les fichiers Infile et Outfile sont bien "mis à jour" avec le setinfile() et setoutfile(). L'erreur proviendrait donc de la classe SignerLogic et de la méthode signFile().
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.
Je sais pas pourquoi ça échoue, je vais essayer de trouver. A mon avis on doit "charger" d'autres classes/méthodes avant de lancer la méthode signFile(). Si vous avez une idée, ou si vous pouvez m'aider, hésitez pas :p
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager