Intro

J'ai créé ce blog pour partager avec vous une de mes passions : le développement informatique. J'essaierais de vous faire profiter de mes découvertes et surtout de publier régulièrement des articles. N'hésitez pas à apporter vos commentaires!

dimanche 15 mai 2011

Itext : Protéger votre pdf contre la copie

Ces derniers jours, j’ai passé pas mal de temps sur la génération de PDF . Pour cela j’ai utilisé la librairie java IText(v 2.1.7), qui permet de créer et de modifier des PDFs très facilement.

Une de mes contraintes était que le PDF généré devait empêcher l’utilisateur de faire des copier-coller. Pour cela rien de plus simple, il suffit d’utiliser la méthode setEncryption de la manière suivante :
     writer = PdfWriter.getInstance(document, documentOutput);
     writer.setEncryption(null, "test".getBytes(),
  ~(PdfWriter.ALLOW_COPY), PdfWriter.ENCRYPTION_AES_128);

Les paramètres de cette fonction sont :
  1. Le mot de passe de l’utilisateur (mot de passe à rentrer à l’ouverture du PDF)
  2. Le mot de passe du propriétaire (mot de passe demandé lorsqu’ on souhaite déverrouiller certaines options du PDF)
  3. Les permissions du document, notez bien la présence du ~ devant la permission que vous souhaitez retirer.
  4. Le type d’encryptage utilisé.
La méthode setEncryption doit être appliquée avant que la méthode open() soit appelée sur le document sinon une erreur sera lancée.

A ce stade, je pensais que le tour était joué, en effet cela fonctionnait nickel avec Adobe Reader mais une fois le PDF ouvert avec le logiciel Aperçu (Mac) je pouvais librement faire des copier – coller. Pour empêcher un utilisateur d’effectuer cette opération quelque soit le logiciel de lecture, il faut aussi retirer l’option PdfWriter.ALLOW_SCREENREADERS :
     writer = PdfWriter.getInstance(document, documentOutput);
     writer.setEncryption(null, "test".getBytes(),
  ~(PdfWriter.ALLOW_COPY | PdfWriter.ALLOW_SCREENREADERS),
  PdfWriter.ENCRYPTION_AES_128);
D’autres permissions existent notamment pour empêcher la modification du contenu d’un PDF. Vous pourrez les trouvez ici.

Je posterai d’autres billets sur cette librairie, notamment pour vous montrer comment convertir du texte au format TLF (Text Layout Framework) en PDF. Si d’ici là vous avez des questions n’hésitez pas.

6 commentaires:

Anonyme a dit…

est ce que vous pouvez donner des indication sur la définition des trois variables utilisées:writer,document et documentout merci d avance

Anonyme a dit…

Autre question please "test" c est quoi ??

_TomTom_ a dit…

Pour les 3 variables voilà les instantiations :
Document document = new Document();
OutputStream documentOutput = new ByteArrayOutputStream();
PdfWriter writer = PdfWriter.getInstance(document, documentOutput);

Il ne faut pas oublier de catcher les éventuelles exceptions (DocumentException).

Sinon la chaine de caractère "test" est juste un mot de passe pour verrouiller les options d'un fichier pdf (exemple : autoriser le copier/coller).

Anonyme a dit…

En fait j utilise la version 2.1.5 de iText et ça ne cesse pas de faire apparaitre l erreur suivante: "Exception in thread "main" java.lang.NoClassDefFoundError: org/bouncycastle/asn1/ASN1OctetString" est ce qu il y a un moyen pour regler ça ??

_TomTom_ a dit…

A partir de iText 2 tu as besoin des jars BouncyCastle pour l'encryptage.

Anonyme a dit…

Bon j arrive pas a trouver le meilleur code a chaque que je regle un probleme un autre apparait cette fois ci je comprends pas pk le fichier resultat ne se génére pas voila le code que j'utilise pr la réalisation :
try {
PdfReader reader = new PdfReader("filepathsource");
Document document = new Document();
document.open();
for (int i = 0; i < reader.getNumberOfPages(); i++) {
document.add(new Paragraph((reader.getPageContent(i)).toString()));
document.newPage();
}
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream"filepathresultat"));
writer.setEncryption(null, "test".getBytes(), ~(PdfWriter.ALLOW_COPY | PdfWriter.ALLOW_SCREENREADERS), PdfWriter.ENCRYPTION_AES_128);
document.close();
writer.close();
} catch (Exception e) {
}
pouvez vous m aider a regler ce probleme.??