IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Documents Java Discussion :

Supprimer les metadata d'un PDF


Sujet :

Documents Java

  1. #1
    Membre habitué Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 759
    Points : 184
    Points
    184
    Par défaut Supprimer les metadata d'un PDF
    Bonjour,

    J'essaye, comme dit dans le titre, de supprimer les metadatas d'un document PDF.
    Avec iText, j'arrive à récupérer toutes les informations (clé / valeur), mais je ne sais pas comment les supprimer ensuite, ou mettre leur valeur à null.


    Voila le code que j'ai trouver pour afficher les metadatas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    PdfReader reader = new PdfReader("tuto.pdf");
        Map info = reader.getInfo();
        for (Iterator i = info.keySet().iterator(); i.hasNext();) {
          String key = (String) i.next();
          String value = (String) info.get(key);
          jTextArea1.append(key + ": " + value + "\n");
    Si quelqu'un connaît ? Avec iText ou autre, si c'est libre.
    Merci d'avance,
    Très cordialement,

    ANDRE Ani
    ANDRE Ani
    GNU/Linux et Informatique Libre
    https://andre-ani.fr

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Avec IText, il suffit de soumettre une map avec les propriétés à effacer mappée sur null. Avec un PDFStamper pour copier le fichier source par exemple.

    Exemple :

    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
    public static void main(String[] args) {
    	try {
    		removePdfInfo("source.pdf", "target.pdf", "Author");
    	} catch (IOException | DocumentException e) {
    		e.printStackTrace();
    	}
    }
     
    /**
     * Supprimer des informations d'un fichier PDF
     * 
     * @param sourcePath path du fichier source
     * @param targetPath path de destination (différent de source)
     * @param names liste des propriétés à supprimer, ou aucune pour toutes
     * @throws IOException
     * @throws DocumentException
     */
    public static void removePdfInfo(String sourcePath, String targetPath,
    		String... names) throws IOException, DocumentException {
     
    	HashMap<String, String> pdfInfo = null;
     
    	PdfReader reader = null;
    	try {
    		reader = new PdfReader(sourcePath);
    		pdfInfo = reader.getInfo();
     
    		try (OutputStream outputstream = new FileOutputStream(targetPath)) {
    			PdfStamper stamper = null;
    			try {
    				stamper = new PdfStamper(reader, outputstream);
    				// suppression des propriétés
    				if (names.length==0 ) {
    					for (String name : pdfInfo.keySet()) {
    						pdfInfo.put(name, null);
    					}
    				}
    				else {
    					for (String name : names) {
    						if (pdfInfo.containsKey(name)) {
    							pdfInfo.put(name, null);
    						}
    					}
    				}
    				stamper.setMoreInfo(pdfInfo);
    				// fin suppression
    			} finally {
    				if (stamper != null) {
    					stamper.close();
    				}
    			}
    		}
    	} finally {
    		if (reader != null) {
    			reader.close();
    		}
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre habitué Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 759
    Points : 184
    Points
    184
    Par défaut
    Salut,

    Merci pour ces explications.
    Mais j'ai encore un soucis, ne connaissant pas à l'avance le nom des clés / valeurs à supprimer.

    J'ai ajouter ceci pour les récupérer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for (Iterator i = pdfInfo.keySet().iterator(); i.hasNext();) {
                    String key = (String) i.next();
                    String value = (String) pdfInfo.get(key);
    Mais après, je ne sais pas trop comment gérer ceci (les String name et names) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for (String name : names) {
    	if (pdfInfo.containsKey(name)) {
    	pdfInfo.put(name, null);
    	}
    Va falloir que je vois ça. Je voudrais pouvoir supprimer toutes les metadata, sans avoir à connaître à l'avance leur nom.

    En tous cas, merci beaucoup ;-)
    ANDRE Ani
    GNU/Linux et Informatique Libre
    https://andre-ani.fr

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    J'ai géré ce cas : pour supprimer toutes les propriétés, tu appelles ma méthode comme ça (Voir javadoc de la méthode) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static void main(String[] args) {
    	try {
    		removePdfInfo("source.pdf", "target.pdf");
    	} catch (IOException | DocumentException e) {
    		e.printStackTrace();
    	}
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre habitué Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 759
    Points : 184
    Points
    184
    Par défaut
    D'accord, je n'avais pas bien regardé le code semble-t-il.

    J'ai une fenêtre dans laquelle je commence par afficher les metadata après apuis sur un bouton. Et un autre bouton pour effacer les metadata, puis ré afficher pour vérifier.
    Mais, je dois faire une bêtise quelque part car ça ne fonctionne pas. J'utilise bien ton code pour effacer les metadata. Et j'utilise celui-ci, avant et après, afin de vérifier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    PdfReader reader = new PdfReader("/home/andre_ani/tuto_mod.pdf");
        Map info = reader.getInfo();
        for (Iterator i = info.keySet().iterator(); i.hasNext();) {
          String key = (String) i.next();
          String value = (String) info.get(key);
          jTextArea1.append(key + ": " + value + "\n");
        }
        if (reader.getMetadata() == null) {
          jTextArea1.append("No XML Metadata.");
        } else {
         jTextArea1.append("XML Metadata: " + new String(reader.getMetadata()));
        }
        reader.close();
    Voila ce que j'obtiens avant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Subject: Gnu Linux débutants
    Creator: Writer
    Author: Moi
    CreationDate: D:20140610174431+02'00'
    Producer: LibreOffice 4.2
    Title: Débuter sous Gnu Linux

    Puis après :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ModDate: D:20140825152513+02'00'
    Subject: Gnu Linux débutants
    Creator: Writer
    CreationDate: D:20140610174431+02'00'
    Producer: LibreOffice 4.2; modified using iText® 5.5.2 ©2000-2014 iText Group NV (AGPL-version)
    Title: Débuter sous Gnu Linux
    Peut-être un reader qui n'est pas close comme il faut avant de re ouvrir et relire le fichier ? Ou un soucis avec les variables sourcePath et targetPath (il faut que j'ajoute un sélecteur de fichir pour ne pas avoir à coder en dur le nom du fichier en entrée).
    Je vais regarder tout cela pour voir et essayer de trouver le problème.

    Merci pour tout en tous cas.
    ANDRE Ani
    GNU/Linux et Informatique Libre
    https://andre-ani.fr

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    1) On ne peut pas écrire avec PdfStamper un fichier qu'on est en train de lire avec un PdfReader, donc mon code créé un nouveau fichier. Si tu relis l'ancien, tu ne verras effectivement aucun changement.

    Il te faut à la fin de l'appel qui supprime les infos, s'il n'y a pas eu d'erreurs bien sûr, supprimer le fichier d'origine (sourcePath), et renommer le nouveau (targetPath) en sourcePath, ou, plus sécurisé, renommer le fichier d'origine en .bak, renommer le nouveau , puis supprimer le .bak (en cas d'erreur, ça te permet de restaurer le fichier d'origine, sauf double erreur, mais là, tu n'aurais vraiment pas de chance).

    Pourtant dans ton exemple, il semble qu'il y ait des changements, donc je ne vois pas trop comment tu obtiens ce résultat. Tu fais bien mapInfo.put( key, null) et pas mapInfo.remove( key ) ?

    Remets moi le code exact que tu utilises pour supprimer les infos.

    2) Par ailleurs, dans ton code d'origine, je ne vois que l'affichage des infos, pas des metadata, même si ton message parle effectivement de metadata. J'en ai déduis que tu voulais supprimer les infos. Et là dans ton code, tu affiches les métadatas XMP (Mais il semble que tu n'en ai pas, d'après la trace que tu mets). Pour les XMP, la méthode que je t'ai donné ne fonctionne pas.

    Il faut soit faire (pour tout supprimer) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    reader.getCatalog().remove(PdfName.METADATA);
    reader.removeUnusedObjects();
    Soit, pour n'en supprimer que quelques uns, c'est plus complexe (parser le XML, créer un XMPWriter, et affecter les métas qu'on veut conserver, et réinjecter le tableau d'octets correspondant à la sérialisation du XML avec XMPWriter, avec stamper.setXMPMetadata(byteArray).

    Par contre, lire les métadatas avec new String(), c'est pas la bonne manière, à cause de l'encodage (XMP c'est du XML).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre habitué Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 759
    Points : 184
    Points
    184
    Par défaut
    Oui, ça, j'ai bien compris pour le sourcePath et targetPath, je lis le nouveau fichier créé par ton code.

    Bon, je me suis un peu mélangé les pinceaux, ce que je souhaite, c'est supprimer toutes les metadata (XMP donc) et pas les infos.

    J'arrive à les afficher avec le code (avec les infos également) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    PdfReader reader = new PdfReader("/home/andre_ani/tuto_mod.pdf");
        Map info = reader.getInfo();
        for (Iterator i = info.keySet().iterator(); i.hasNext();) {
          String key = (String) i.next();
          String value = (String) info.get(key);
          jTextArea1.append(key + ": " + value + "\n");
        }
        if (reader.getMetadata() == null) {
          jTextArea1.append("No XML Metadata.");
        } else {
         jTextArea1.append("XML Metadata: " + new String(reader.getMetadata()));
        }
        reader.close();
    Mais je n'arrive pas à les supprimer... Et donc, avec ton code, ça ne fonctionne pas pour les metadata.
    Le but, c'est d'anonymiser un document.
    ANDRE Ani
    GNU/Linux et Informatique Libre
    https://andre-ani.fr

  8. #8
    Membre habitué Avatar de lostsoul
    Homme Profil pro
    Rédacteur web, blogueur, développeur web junior
    Inscrit en
    Novembre 2003
    Messages
    759
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Rédacteur web, blogueur, développeur web junior
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2003
    Messages : 759
    Points : 184
    Points
    184
    Par défaut
    Merci beaucoup pour tout. J'arrive bien à supprimer les metadata de mon pdf, c'est ce que je voulais ;-)
    ANDRE Ani
    GNU/Linux et Informatique Libre
    https://andre-ani.fr

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Supprimer les metadata d'un PDF
    Par lostsoul dans le forum Général Java
    Réponses: 0
    Dernier message: 24/08/2014, 16h11
  2. Comment supprimer les doublons
    Par djelloulc dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 17/09/2013, 14h30
  3. supprimer les liens pdf
    Par Balbuzard dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 17/04/2009, 13h52
  4. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  5. [String] Comment supprimer les accents
    Par iuz dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 08/03/2004, 02h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo