Impression unique... mais pas en PHP :)

Eléphant du PHP | 441 Messages

22 juin 2006, 17:46

Bonjour à tous,
je vous fais part d'un problème que je rencontre actuellement sur un de mes projets :D

Alors le contexte:
Application WEB (Java/J2EE) de comptabilité.
Pas d'active X. Peu de déploiement sur les clients.


Problème:
Lorsque les utilisateurs saisissent certaines opérations comptables, l'application est censé générer une quittance (un justificatif de dépense).
Or la direction des finances nous impose que cette impression doit être unique.


Conséquence:
Donc nous ne pouvons pas passer par le navigateur pour l'impression (car il permet d'imprimer N exemplaires). Il nous faut donc en gros balancer le flux d'impression directement sur l'imprimante du client. Donc il nous faut connaître cette imprimante.

Pour le moment, on pense à une applet côté client...mais bon cela exige une "installation" (mineure je le concède) de composant sur le poste client.


Existe-il des solutions JS ou autre qui pourraient nous guider vers une solution satisfaisante à tous les points de vue?
J'aimerai avoir vos retours d'expérience, vos opinions ou idées voir même des solutions
:D

Merci à tous!!
Futures Stars par ici >> www.apel-doorn.com
fan d'info et du ... PSG !! :D
Apprendre, comprendre et maîtriser telle est ma devise!
Fan inconditionnel de netvibes

Mammouth du PHP | 1511 Messages

22 juin 2006, 18:26

Le problème est que normalement, toute facture est stockée dans une base de données, si je ne me trompe pas, il est facile d'y réacceder...
@+

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

22 juin 2006, 21:58

cela exige une "installation" (mineure je le concède) [...]
J'aurais plutôt dit "majeure", et pas qu'un peu. Pour empêcher d'imprimer deux exemplaires d'une facture il faut avoir écrit le driver de l'imprimante sinon il est toujours possible de multiplier le nombre d'exemplaires ou même sauver la page dans un fichier pour l'imprimer plus tard.

En fait je pense qu'il est à peu près aussi dur d'empêcher une impression en double qu'écouter un MP3 plusieurs fois, c'est à dire : virtuellement impossible. Numérotez chaque impression avec un identificateur unique, c'est le mieux que l'on puisse obtenir.

Eléphant du PHP | 441 Messages

23 juin 2006, 08:58

Le problème est que normalement, toute facture est stockée dans une base de données, si je ne me trompe pas, il est facile d'y réacceder...
@+
Non pas de sauvegarde justement car ce n'est pas vraiment une facture. Il ne conserve que le format papier et non numérique.
J'aurais plutôt dit "majeure", et pas qu'un peu. Pour empêcher d'imprimer deux exemplaires d'une facture il faut avoir écrit le driver de l'imprimante sinon il est toujours possible de multiplier le nombre d'exemplaires ou même sauver la page dans un fichier pour l'imprimer plus tard.
Disons que si jamais l'imprimante n'est pas branchée ou vide de papier etc... c'est mort pour l'utilisateur, le flux n'est transmis qu'une seule et unique fois mais c'est une exigence des énarques de la direction financière.
Futures Stars par ici >> www.apel-doorn.com
fan d'info et du ... PSG !! :D
Apprendre, comprendre et maîtriser telle est ma devise!
Fan inconditionnel de netvibes

ViPHP
ViPHP | 1024 Messages

23 juin 2006, 09:12

ici on a ce fonctionnement pour la facturation, dans un programme:
_ lorsqu'on facture, une page est imprimée
_ si on veut réimprimer, le document est barré d'un DUPLICATA en grand

si ça peut aider...

A+

Pascal

Eléphant du PHP | 332 Messages

23 juin 2006, 12:04

Ash ! Toujours les exigences de certains administratifs un peu déconnectés de la technique. Moi, j'en avais un qui voulait qu'on empêche les hardcopies d'écran ... jusqu'à ce que je lui demande comment il voulait qu'on traite le cas du type qui prend l'écran en photo. Est-ce que tu peux leur demander ce qu'ils veulent que tu fasses pour empêcher qu'un type photocopie ou scanne ce document "unique" ? Il y a d'excellentes photocopieuses et je met quiconque au défi de faire la différence entre l'original et la copie.

Bref, tu peux peut-être expliquer aux énarques qui te posent le problème que tu peux mettre en place un max de protections, mais que celui qui voudra vraiment imprimer plusieurs fois, il pourra le faire. Il faut donc s'arrêter à un niveau suffisant de sécurité, mais faut pas pousser non plus.

Honnêtement, je ne vois pas de beaucoup de solution à ton problème : le seul moyen à mon avis de contrôler parfaitement, c'est de faire une impression sur le serveur, mais ce n'est pas tout à fait ta question. Parce que comme cela a été signalé, rien n'empêche un utilisateur de mettre son imprimante en copie multiple. Ensuite, il y a les caches en local sur la machine ...

Autre idée : générer un PDF. Il est possible de mettre du javascript dans un document PDF pour faire une auto-impression dès qu'il s'ouvre (voir http://www.fpdf.org/fr/script/script36.php ) sans passer par la boîte de dialogue (ça je l'ai déjà fait, ça marche).
Il faudrait alors voir s'il est possible en javascript de fermer immédiatement le document après l'impression.

Pour éviter que l'utilisateur prenne le PDF dans le cache local pour le réimprimer, je pense qu'il est possible de vérifier que la date/heure à laquelle l'impression est lancée (heure du système) est dans un intervalle d'une minute par rapport à la date de génération du document. Il faudrait se plonger dans la doc de Javascript pour PDF.

Spéculation : et si le javascript dans le PDF pouvait modifier le document après la première impression pour le rendre non-imprimable ? La propriété "non-imprimable" existe, mais je ne sais pas si un javascript dans un PDF peut modifier le document lui-même.

Et ça ne résoud toujours pas le problème de la photocopie :)

Eléphant du PHP | 441 Messages

23 juin 2006, 12:32

bah le problème c'est que ca vient de très haut... inaccessible pour moi hélas. Donc on doit faire avec et on les avait prévenus par rapport au photocopie etc... mais bon les utilisateurs finaux ne sont pas non plus des stars en informatique loin de là ;)

Le gros pb est l'impression unique...
Existe-t'il une documentation complète de PDF? histoire de voir les options d'impression etc... ???
Futures Stars par ici >> www.apel-doorn.com
fan d'info et du ... PSG !! :D
Apprendre, comprendre et maîtriser telle est ma devise!
Fan inconditionnel de netvibes

Eléphant du PHP | 332 Messages

23 juin 2006, 14:25

http://partners.adobe.com/public/develo ... rence.html

Bonne lecture dans ces documents de 1200 pages ... pas franchement lisibles. Il vaudrait mieux que tu t'orientes vers un forum de développeurs PDF style http://www.planetpdf.com/

Tiens nous au courant, c'est un problème intéressant.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

23 juin 2006, 18:42

bah le problème c'est que ca vient de très haut... inaccessible pour moi hélas. Donc on doit faire avec et on les avait prévenus par rapport au photocopie etc... mais bon les utilisateurs finaux ne sont pas non plus des stars en informatique loin de là ;)
Stars en informatique ou pas j'ai toujours du mal à voir comment on peut empêcher quelqu'un d'aller à la boîte à copie la plus proche et faire 10 photocop' pour un euro :roll:

Sinon, l'idée d'un PDF qui s'auto-ferme est amusante et intéressante en théorie, mais en pratique êtes-vous sûr de vouloir confier l'impression d'un document important à du Javascript et un plugin susceptible de planter sous certains navigateurs en sachant que si la tentative échoue il sera impossible de réimprimer ce document pourtant légitime ? En réalité, cette solution aussi est une impasse pour deux raisons:
  • la plupart des drivers afficheront quand même la boîte de dialogue et la copie multiple sera possible. Ah, et la plupart des spouleurs d'impressions que j'ai utilisé gardent en mémoire une copie de la page donc il est toujours possible de réimprimer la page plus tard
  • une décision de justice récente va empêcher une bonne partie des navigateurs (et tout spécialement Internet Explorer) à lancer des plugins sans une action de l'utilisateur. Autrement dit, impossible d'afficher le PDF (et par extension, l'imprimer) avant que l'utilisateur ne l'ai autorisé. Pire, il y a des chances pour que ça l'aide même à sauvegarder le fichier en question
Donc une fois pour toute, fais marcher la chaîne hiérarchique dans l'autre sens pour prévenir tout le monde qu'il est strictement impossible d'empêcher l'impression multiple d'un document transmit via la web. La seule façon de garantir une impression unique est de réunir les trois conditions suivantes :
  • écrire votre propre pilote d'impression, que chacun des destinataire devra installer en espérant qu'il soit compatible avec son imprimante
  • écrire votre propre programme de distribution, à installer également sur l'ordinateur final. Tout autre solution passant par un navigateur est définitivement vouée à l'échec.
  • utiliser une combinaison de papier/encre anti-photocopie
La seule solution à moins de 150K € est d'utiliser un numéro d'identification unique pour chaque document. Ensuite, demande à la direction des finances de vérifier que chaque numéro n'est remboursé qu'une seule fois, à priori c'est leur métier.

Eléphant du PHP | 332 Messages

23 juin 2006, 19:12

Permet moi une petite remarque :

Dans la solution d'auto-impression décrite, ce n'est pas la boîte de dialogue du browser qui est sollicitée, mais celles d'Acrobat Reader. Quand tu met une auto-impression dans un document PDF en Javascript, tu n'es pas dans le browser, tu es dans le plugin Acrobat et son propre interpréteur javascript. Le browser lance le plug-in, le plug-in lance l'impression. Il n'y a pas de copie multiple puisque tu ne vois pas la boîte de contrôle de l'impression d'Acrobat. Tu peux même si tu veux copier le fichier sur ton disque dur et l'ouvrir après, hors browser : il s'imprime tout seul.
Et je te confirme que ça marche tout seul sans boîte de dialogue : d'ailleurs pendant que je faisais des tests de mise en page, j'avais oublié d'enlever ce paramètre. Et au bout de deux heures, le mec dans le bureau à côté (là où il y avait l'imprimante) est venu m'apporter 2 kilos de papier. :oops:

Quant au reste, que dire ? De toute façon, toute solution est vouée à l'échec. Il faut donc rester raisonnable, trouver une solution qui n'incite pas à la multi-copie, qui ne soit pas trop contraignante, qui ne soit pas une usine à gaz et qui ne demande pas 12 mois de développement.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

23 juin 2006, 20:08

[...] tu ne vois pas la boîte de contrôle de l'impression d'Acrobat.
...mais tu vois la boîte de contrôle de ton driver. Je me rappelle avoir constaté ça sur deux Canon LBP (810 et... euh, celle sortie après ;)). Après avoir configuré l'impression sous Acrobat tu te retrouvais avec pratiquement la même boîte sous l'utilitaire de Canon (désolé, c'est vieux je ne me rappelle plus des détails ;)). Si mes souvenirs sont bons, au moment de l'impression la fenêtre du spouleur réapparaissait pour montrer l'avancement des différents travaux en cours, et là encore on pouvait relancer la même impression ("offline", même si elle provenait d'un autre ordinateur du réseau) avec un clic droit.

Ce qui est important pour moi, c'est que starkeus --et surtout sa direction-- comprennent que le ratio entre la complexité des subterfuges qu'ils pourront employer et leur efficacité va être astronomique. Si ils restent "raisonnable", l'efficacité sera pratiquement nulle. Et si ils visent un niveau d'efficacité "moyen" (c'est-à-dire mauvais, comme 90% des moyens de sécurité déployés en entreprise :)) les coûts seront prohibitifs.

Eléphant du PHP | 332 Messages

23 juin 2006, 20:30

Si ils restent "raisonnable", l'efficacité sera pratiquement nulle.
Je crois profondément à la paresse (en étant méchant) ou à la méconnaissance (en étant gentil) des utilisateurs. Un truc qui charge le document, l'imprime et ferme le document empêchera 90% des utilisateurs de se poser la question de savoir s'ils peuvent ou pas faire ceci ou cela. Ce n'est pas une protection physique, c'est une protection psychologique :)

Exemple : une superbe petite icone apparaît en bas à droite quand on lance une impression. J'avais surpris pas mal de monde (dont des informaticiens) en leur montrant qu'en cliquant dessus on avait l'état d'avancement de la file, qu'on pouvait suspendre, effacer ... relancer ! Pour 90% des gens, c'est juste une icône "passive" qui montre qu'il y a une impression en cours et qui disparaît quand l'impression est terminée. Les spouleurs, les drivers, ... ça passe au-dessus de la tête de pas mal de monde.

Quant aux 10% restants, de toute manière, ils feront tout pour casser la protection. Tout ce qu'ils peuvent faire, c'est leur rendre la tâche plus ou moins ardue.

Mais on est d'accord sur le fond. Reste à savoir où ils veulent placer la barre coût/sécurité ou plutôt la barre coût/"impression de verrouillage".

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

23 juin 2006, 21:21

Puisqu'on sait que n'importe quel utilisateur un tout petit peu expérimenté (ou sachant se servir d'une photocopieuse :lol:) pourra faire des duplicata du document, à quoi sert de rendre la tâche spécifiquement ardue ? On a alors plus de chance d'entraver l'utilisation normale du document, par exemple si une erreur se produit durant l'impression. Au final, c'est une protection inexistante pour les pirates et une entrave à l'utilisation par les gens honnêtes. Toute ressemblance avec les DRM serait purement fortuite :)

Une question à starkeus, sais-tu pourquoi les duplicata sont interdits ? La seule raison que j'ai pu trouver c'est qu'il n'y a aucun moyen de contrôle des documents et que le service en question ne pourrait pas empêcher l'utilisateur de se faire rembourser la même note de frais ou un truc du genre. Ce qui fait évidemment très peur à imaginer :roll:

Eléphant du PHP | 377 Messages

23 juin 2006, 22:49

Il faut donc rester raisonnable, trouver une solution qui n'incite pas à la multi-copie, qui ne soit pas trop contraignante, qui ne soit pas une usine à gaz et qui ne demande pas 12 mois de développement.
Mettre tout plein de couleurs qui vident les cartouches, ca marche?
:oops: ok je :arrow:
Petit scarabée deviendra grand

Eléphant du PHP | 332 Messages

24 juin 2006, 09:38

Au final, c'est une protection inexistante pour les pirates et une entrave à l'utilisation par les gens honnêtes. Toute ressemblance avec les DRM serait purement fortuite
C'est comme fermer ta voiture à clé : cela ne sert à rien contre un mec vraiment décidé à te la piquer car il a le matos et le savoir-faire et cela ne sert à rien contre quelqu'un d'honnête puisqu'il n'aura même pas l'idée d'essayer d'y pénétrer.
Alors, autant la laisser ouverte, non ? Et pourtant, tout le monde ferme sa voiture à clé.

C'est ce que je voulais dire en parlant de protection psychologique. Cela empêche la "petite délinquance" (je déteste ce terme).

Mais comme le dit Hubert, il faut se demander à quoi ça sert, s'il n'y a pas d'autres moyens de contrôle, ... Et s'ils veulent vraiment une protection, que tout le monde dans la chaîne de décision soit parfaitement au courant des limites de cette protection (un conseil : mets tout ça par écrit, parce que rien n'est plus facile que de dire dans 6 mois "je n'avais pas compris ça ... mais si j'avais su, je n'aurais jamais admis ... vous auriez du nous prévenir ...")