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

Langage Perl Discussion :

Convertir fichier PDF en fichier txt


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut Convertir fichier PDF en fichier txt
    Bonjour à tous,

    Je souhaite convertir plusieurs fichiers PDF en txt voici le code que j'utilise :
    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
     
    use strict;
    use warnings;
    use CAM::PDF;
    use CAM::PDF::PageText;
    use Config::IniFiles;
     
    my @repertoire;
    my @fichier_facture; ## tous les fichiers facture au format PDF ##
    my @fichier_facture1;## tous les fichiers facture au format TXT ##
    my @fichier_paie;## tous les fichiers paie au format PDF ##
    my @fichier_paie1;## tous les fichiers paie au format TXT ##
     
    sub convert_pdf_to_text ($$) {
       my $pdf  = CAM::PDF->new(shift);
       my $tmp = $pdf->getPageContentTree(1);
       my $text = CAM::PDF::PageText->render($tmp);
       # ajustements à effectuer par rapport à la sortie,
       # sur un exemple simple, il me fallait ceci:
       $text =~ s/\n{5}/\n/g;
       $text =~ s/\n{4}/ /g;
     
       open my $fout, '>>', shift;
       print $fout $text;
       close $fout;
    }
     
    my $pdf_filename = $fichier_facture[0];   ##'C:\facture\/exemple_facture.pdf';
    my $txt_filename = $fichier_facture1[0];  ##'C:\facture\/exemple_facture.txt'; 
     
     $pdf_filename = $fichier_facture[1];     ##'C:\facture\/exemple_facture1.pdf';
     $txt_filename = $fichier_facture1[1];    ##'C:\\facture\/exemple_facture1.txt'; 
     
     $pdf_filename = $fichier_paie[0];        ##'C:\bulletin_paie\/paie.pdf';
     $txt_filename = $fichier_paie1[0];       ##  'C:\bulletin_paie\/paie.txt';
     
     $pdf_filename = $fichier_paie[1];        ##'C:\bulletin_paie\/paie1.pdf';
     $txt_filename = $fichier_paie1[1];       ##  'C:\bulletin_paie\/paie1.txt';
     
     $pdf_filename = $fichier_paie[2];        ##'C:\bulletin_paie\/paie2.pdf';
     $txt_filename = $fichier_paie1[2];       ##  'C:\bulletin_paie\/paie2.txt';
     
     convert_pdf_to_text($pdf_filename, $txt_filename);
    Le soucis que je rencontre c'est que je suis obligé de le faire un par un et que mon programme doit s'exécuter deux fois avant de me créer le fichier en question de ce fait je met les autres fichiers en commentaire et lorsque je retire les commentaires et que j'exécute deux fois le programme il me crée uniquement le dernier fichier.
    Est-ce possible de réaliser une boucle permettant que tout les fichiers PDF se trouvant dans les répertoires bulletin_paie et facture doivent être convertit au format txt et en exécutant qu'une seule fois le programme ?

    Pour vérifier que les fichiers ont bien été crées j'utilise cette fonction :
    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
    my $cfg = Config::IniFiles->new( -file => $ARGV[0] );
    foreach ('REP_FACTURE','REP_BULLETIN','REP_FACTURE_TXT','REP_BULLETIN_TXT') {
    	  push @repertoire, $cfg->val('repertoire', $_) if $cfg->val('repertoire', $_);
    	  }
    foreach ('FIC_1','FIC_2') {
    	  push @fichier_facture, $cfg->val('fichier_facture', $_) if $cfg->val('fichier_facture', $_) ;
    	  }
    foreach ('FIC_3','FIC_4') {
    	  push @fichier_facture1, $cfg->val('fichier_facture1', $_) if $cfg->val('fichier_facture1', $_) ;
    	  }
     
    foreach ('FIC_5','FIC_6','FIC_7') {
    	  push @fichier_paie, $cfg->val('fichier_paie', $_) if $cfg->val('fichier_paie', $_);
    	  }
     
    foreach ('FIC_8','FIC_9','FIC_10') {
    	  push @fichier_paie1, $cfg->val('fichier_paie1', $_) if $cfg->val('fichier_paie1', $_);
    	  }
     
     
    sub GetFilesList 
    {
            my $Path = $_[0];
            my $FileFound;
            my @FilesList=();
     
            ## Lecture de la liste des fichiers
            opendir (my $FhRep, $Path)
                    or die "Impossible d'ouvrir le repertoire $Path\n";
            my @Contenu = grep { !/^\.\.?$/ } readdir($FhRep);
            closedir ($FhRep);
     
            foreach my $FileFound (@Contenu) {
                    ## Traitement des fichiers
                    if (-f "$Path/$FileFound") {
                            push (@FilesList, "$Path/$FileFound" );
                    }
                    ## Traitement des repertoires
                    elsif ( -d "$Path/$FileFound") {
                            ## Boucle pour lancer la recherche en mode recursif
                            push (@FilesList, GetFilesList("$Path/$FileFound") );
                    }
            }
            return @FilesList;
    }
    my @Files = GetFilesList ($repertoire[0]);
    foreach my $File  (@Files) { 
    	next unless $File =~ /\.pdf$/i;
    	print "$File \n";
    }
     
    @Files = GetFilesList  ($repertoire[1]);
    foreach my $File  (@Files) { 
    	next unless $File =~ /\.pdf$/i;
    	print "$File \n";
    } 
     
    @Files = GetFilesList  ($repertoire[2]);
    foreach my $File  (@Files) { 
    	next unless $File =~ /\.txt$/i;
    	print "$File \n";
    } 
     
    @Files = GetFilesList  ($repertoire[3]);
    foreach my $File  (@Files) { 
    	next unless $File =~ /\.txt$/i;
    	print "$File \n";
    }
    Je vous remercie d'avance pour votre aide.

    En espérant que vous arrivez à comprendre ce que je vous demande, parce qu'il se pourrait que mes informations ne soient pas tout à fait claire.

    Cordialement

    Solerian

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Quand tu fais ceci:
    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
     
    my $pdf_filename = $fichier_facture[0];   ##'C:\facture\/exemple_facture.pdf';
    my $txt_filename = $fichier_facture1[0];  ##'C:\facture\/exemple_facture.txt'; 
     
     $pdf_filename = $fichier_facture[1];     ##'C:\facture\/exemple_facture1.pdf';
     $txt_filename = $fichier_facture1[1];    ##'C:\\facture\/exemple_facture1.txt'; 
     
     $pdf_filename = $fichier_paie[0];        ##'C:\bulletin_paie\/paie.pdf';
     $txt_filename = $fichier_paie1[0];       ##  'C:\bulletin_paie\/paie.txt';
     
     $pdf_filename = $fichier_paie[1];        ##'C:\bulletin_paie\/paie1.pdf';
     $txt_filename = $fichier_paie1[1];       ##  'C:\bulletin_paie\/paie1.txt';
     
     $pdf_filename = $fichier_paie[2];        ##'C:\bulletin_paie\/paie2.pdf';
     $txt_filename = $fichier_paie1[2];       ##  'C:\bulletin_paie\/paie2.txt';
     
     convert_pdf_to_text($pdf_filename, $txt_filename);
    Toutes ces lignes à par les trois dernières ne servent à rien, puisque à chaque fois, tu écrases le contenu de $pdf_filename et de $txt_filename
    avec les valeurs de la paire de ligne qui suit. A la fin tu appelles ta fonction convert_pdf_to_text avec seulement la dernière paire. A la place, il faut faire une boucle pour traiter chaque fichier un par un. Quelque chose du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for my $i (0..2) {
        convert_pdf_to_text($fichier_facture[$i]; $fichier_facture1[$i]);
    }
    for my $i (0..2) {
        # même chose pour les fichiers paie
    }
    Essaie aussi de modifier ta fonction comme suit:

    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
    sub convert_pdf_to_text {  # n'utilise pas de prototypes pour tes fonctions, à moins de très bien comprendre ce qu'ils font
       my $pdf  = CAM::PDF->new(shift);
       my $fic_txt_out = shift;
       my $tmp = $pdf->getPageContentTree(1);
       my $text = CAM::PDF::PageText->render($tmp);
       # ajustements à effectuer par rapport à la sortie,
       # sur un exemple simple, il me fallait ceci:
       $text =~ s/\n{5}/\n/g;
       $text =~ s/\n{4}/ /g;
     
       open my $fout, '>', $fic_txt_out or die "Ouverture impossible de $fic_txt_out $!"; # vérifie que l'ouverture a réussi
       print $fout $text;
       close $fout;
    }

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut
    je ne comprend pas trop pourquoi tu as mis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for my $i (0..2) {
        convert_pdf_to_text($fichier_facture[$i]; $fichier_facture1[$i]);
    0..2 repose sur mes 2 fichiers factures ?

    Moi je serai parti sur 0..1 comme je lis une sorte de tableau pour convertir le fichier ?

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Oui, pour facture, ce serait plutôt 0..1. C'est pour les fichiers paie où il y en a 3, donc 0..2.

    Mais je ne pensais pas vraiment que ces valeurs soient codées en dur, je pensais qu'il s'agissait chez toi d'un exemple. En fait, comme tu ne montres apparemment pas tout ton code, je suis réduit à deviner certaines choses, comme la façon dont les tableaux @fichier_facture et @fichier_facture1 sont remplis au départ.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut
    C'est tout mon code, je ne fais pas apparaître les chemins ou se trouve mes fichiers je passe par le module Config::IniFiles.

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    OK, et ça marche, ce que j'ai proposé?

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut
    ça ne me convertit pas mes fichiers et ça me renvoi ce message d'erreur :

    Use of uninitialized value $fic_txt_out in open at C:\users\baranowp\Documents\2016_03_14_18\convertir_pdf_en_txt.pl line 93.
    Use of uninitialized value $fic_txt_out in concatenation (.) or string at C:\users\baranowp\Documents\2016_03_14_18\convertir_pdf_en_txt.pl line 93.
    Ouverture impossible de No such file or directory at C:\users\baranowp\Documents\2016_03_14_18\convertir_pdf_en_txt.pl line 93.

    Je ne comprend pas trop ce message d'erreur
    a mon avis ce que tu m'as donné doit fonctionner c'est surement dans mon code qu'il y a un problème

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut
    Par contre lorsque j'exécute une seconde fois le programme il me crée le fichier exemple_facture.txt

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut
    Comme les fichiers factures et et paie sont au format PDF et que dans le répertoire facture et paie il n'y a que des fichiers PDF.
    Est-ce possible de s'intéresser uniquement au répertoire ou faut il traiter chaque fichier un à un ?

    Est-ce que l'on peut écrire ceci en Perl :

    Pour chaque fichier PDF se trouvant dans le répertoire facture et paie il faudra le convertir aux format txt, en redirigeant les fichiers vers un autre répertoire ou le même.

  10. #10
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Oui, c'est possible, je dirais même que c'est la bonne manière de faire.

    Idéalement, il faut lire la liste des fichiers PDF du répertoire (par exemple dans un tableau), et, pour chaque nom de fichier PDF, construire le nom du fichier txt correspondant, et appeler la procédure de conversion en passant les deux noms.

    Mais tu ne donnes tes informations qu'au compte-gouttes, du coup c'est un peu compliqué de d'aider. En particulier, je ne peux déboguer ton code sans le voir...

    Sur le principe, un truc dans ce genre devrait marcher et être bien plus simple que ce que tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    my @pdf_files = glob ("c:/facture/*.pdf"); # récupère les fichiers PDF
     
    for my $in_file (@pdf_files) {
        my $out_file = $in_file;
        $out_file =~ s/\.pdf/.txt/;   # construit le nom de fichier en sortie à partir du nom en entrée
        convert_pdf_to_text($in_file, $out_file);
    }
    Avec la version modifiée de convert_pdf_to_text que je t'ai proposée.

    A ajuster selon que les fichiers PDF ont l'extension en minuscules ou en majuscules.

    Si tu as une erreur, donne l'ensemble de ton code, impossible de déboguer sans.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut
    Merci pour cette réponse je vais essayer de faire les différentes modifications afin de voir si ça fonctionne
    Désolé ne pas être assez clair j'ai du mal à expliquer ce que je souhaite.

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut
    Est-ce que tu souhaites voir le fichier d'initialisation ?

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut
    lorsque j'exécute le programme il me liste les différents fichiers PDF présent dans les répertoires.
    Mais ne me convertit pas les fichiers PDF aux formats txt.

    Voici mon code :
    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
     
    use strict;
    use warnings;
    use CAM::PDF;
    use CAM::PDF::PageText;
    use Config::IniFiles;
     
    my @repertoire;
    my @filelist;
     
    my $cfg = Config::IniFiles->new( -file => $ARGV[0] );
    foreach ('REP_FACTURE','REP_BULLETIN','REP_FACTURE_TXT','REP_BULLETIN_TXT') {
    	  push @repertoire, $cfg->val('repertoire', $_) if $cfg->val('repertoire', $_);
    	  }
     
     
     
    sub GetFilesList 
    {
            my $Path = $_[0];
            my $FileFound;
            my @FilesList=();
     
            ## Lecture de la liste des fichiers
            opendir (my $FhRep, $Path)
                    or die "Impossible d'ouvrir le repertoire $Path\n";
            my @Contenu = grep { !/^\.\.?$/ } readdir($FhRep);
            closedir ($FhRep);
     
            foreach my $FileFound (@Contenu) {
                    ## Traitement des fichiers
                    if (-f "$Path/$FileFound") {
                            push (@FilesList, "$Path/$FileFound" );
                    }
                    ## Traitement des repertoires
                    elsif ( -d "$Path/$FileFound") {
                            ## Boucle pour lancer la recherche en mode recursif
                            push (@FilesList, GetFilesList("$Path/$FileFound") );
                    }
            }
            return @FilesList;
    }
    my @Files = GetFilesList ($repertoire[0]);
    foreach my $File  (@Files) { 
    	next unless $File =~ /\.pdf$/i;
    	print "$File \n";
    }
     
    @Files = GetFilesList  ($repertoire[1]);
    foreach my $File  (@Files) { 
    	next unless $File =~ /\.pdf$/i;
    	print "$File \n";
    } 
     
    @Files = GetFilesList  ($repertoire[2]);
    foreach my $File  (@Files) { 
    	next unless $File =~ /\.txt$/i;
    	print "$File \n";
    } 
     
    @Files = GetFilesList  ($repertoire[3]);
    foreach my $File  (@Files) { 
    	next unless $File =~ /\.txt$/i;
    	print "$File \n";
    } 
    sub convert_pdf_to_text  {
    my @pdf_files = glob ("$repertoire[0]/*.pdf"); # répertoire facture
      for my $in_file (@Files) {
        my $out_file = $in_file;
        $out_file =~ s/\.pdf/.txt/;   # construit le nom de fichier en sortie à partir du nom en entrée
     
     
        convert_pdf_to_text($in_file, $out_file);
        }
     
    }
    Voici ci joint le fichier d’initialisation il faut juste modifier le .txt en .ini

    En espérant que ça vous apporte un e aide supplémentaire pour m'aider à résoudre ce problème

    Cordialment
    Fichiers attachés Fichiers attachés

  14. #14
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Je ne comprends pas pourquoi tu fais des trucs aussi compliqués.

    Une chose est sûre, ta fonction convert_pdf_to_text n'est jamais appelée, puisque son seul appel est un appel récursif à l'intérieur d'elle-même:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    sub convert_pdf_to_text  {
    my @pdf_files = glob ("$repertoire[0]/*.pdf"); # répertoire facture
      for my $in_file (@Files) {
        my $out_file = $in_file;
        $out_file =~ s/\.pdf/.txt/;   # construit le nom de fichier en sortie à partir du nom en entrée
     
     
        convert_pdf_to_text($in_file, $out_file);
        }
    }
    Je ne vois d'ailleurs pas de raison de l'appeler récursivement.

    Au minimum, il faudrait remplacer le code ci-dessus par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    my @pdf_files = glob ("$repertoire[0]/*.pdf"); # répertoire facture
    for my $in_file (@Files) {
        my $out_file = $in_file;
        $out_file =~ s/\.pdf/.txt/;   # construit le nom de fichier en sortie à partir du nom en entrée
        convert_pdf_to_text($in_file, $out_file);
    }
    et remettre le code de ta vraie fonction de conversion:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    sub convert_pdf_to_text {  # n'utilise pas de prototypes pour tes fonctions, à moins de très bien comprendre ce qu'ils font
       my $pdf  = CAM::PDF->new(shift);
       my $fic_txt_out = shift;
       my $tmp = $pdf->getPageContentTree(1);
       my $text = CAM::PDF::PageText->render($tmp);
       # ajustements à effectuer par rapport à la sortie,
       # sur un exemple simple, il me fallait ceci:
       $text =~ s/\n{5}/\n/g;
       $text =~ s/\n{4}/ /g;
     
       open my $fout, '>', $fic_txt_out or die "Ouverture impossible de $fic_txt_out $!"; # vérifie que l'ouverture a réussi
       print $fout $text;
       close $fout;
    }
    Mais, pour information, cette ligne de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my @pdf_files = glob ("$repertoire[0]/*.pdf");
    récupère dans @pdf_files le nom de tous les fichiers *.pdf dans le répertoire source (avec le chemin) et remplace donc ce que tu fais dans tes opendir/readdir.

    Si tu as besoin de parcourir récursivement l'arborescence des répertoires, on pourra le faire après. Essaie déjà de faire marcher ton programme sur un seul répertoire. Quand ça marchera on pourra ajouter ce qui va bien pour parcourir l'arborescence.

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut
    Le code juste pour la fonction conversion ça donnerait ceci :
    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
     
    use strict;
    use warnings;
    use CAM::PDF;
    use CAM::PDF::PageText;
    use Config::IniFiles;
     
    my @repertoire;
    my $cfg = Config::IniFiles->new( -file => $ARGV[0] );
    foreach ('REP_FACTURE','REP_BULLETIN','REP_FACTURE_TXT','REP_BULLETIN_TXT') {
    	  push @repertoire, $cfg->val('repertoire', $_) if $cfg->val('repertoire', $_);
    	  }
    sub convert_pdf_to_text  {
       my $pdf  = CAM::PDF->new(shift);
       my $fic_txt_out = shift;
       my $tmp = $pdf->getPageContentTree(1);
       my $text = CAM::PDF::PageText->render($tmp);
       # ajustements à effectuer par rapport à la sortie,
       # sur un exemple simple, il me fallait ceci:
       $text =~ s/\n{5}/\n/g;
       $text =~ s/\n{4}/ /g;
     
     
    my @pdf_files = glob ("$repertoire[0]/*.pdf"); # répertoire facture
      for my $in_file (@Files) {
    	my $out_file = $in_file;
    	$out_file =~ s/\.pdf/.txt/;   # construit le nom de fichier en sortie à partir du nom en entrée
     
       convert_pdf_to_text($in_file, $out_file);
        }
     
    }

  16. #16
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Presque...

    Ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    my @pdf_files = glob ("$repertoire[0]/*.pdf"); # répertoire facture
      for my $in_file (@Files) {
    	my $out_file = $in_file;
    	$out_file =~ s/\.pdf/.txt/;   # construit le nom de fichier en sortie à partir du nom en entrée
     
       convert_pdf_to_text($in_file, $out_file);
    doit se trouver en-dehors de la fonction convert_pdf_to_text. Il faut fermer l'accolade juste avant. Donc, essaie ceci:

    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
    use strict;
    use warnings;
    use CAM::PDF;
    use CAM::PDF::PageText;
    use Config::IniFiles;
     
    my @repertoire;
    my $cfg = Config::IniFiles->new( -file => $ARGV[0] );
    foreach ('REP_FACTURE','REP_BULLETIN','REP_FACTURE_TXT','REP_BULLETIN_TXT') {
    	  push @repertoire, $cfg->val('repertoire', $_) if $cfg->val('repertoire', $_);
    }
     
    sub convert_pdf_to_text  {
        my $pdf  = CAM::PDF->new(shift);
        my $fic_txt_out = shift;
        my $tmp = $pdf->getPageContentTree(1);
        my $text = CAM::PDF::PageText->render($tmp);
        # ajustements à effectuer par rapport à la sortie,
        # sur un exemple simple, il me fallait ceci:
        $text =~ s/\n{5}/\n/g;
        $text =~ s/\n{4}/ /g;
    }
     
    my @pdf_files = glob ("$repertoire[0]/*.pdf"); # répertoire facture
    for my $in_file (@Files) {
    	my $out_file = $in_file;
    	$out_file =~ s/\.pdf/.txt/;   # construit le nom de fichier en sortie à partir du nom en entrée
            convert_pdf_to_text($in_file, $out_file);
    }

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut
    ça ne me renvoi aucun message d'erreur c'est bon signe

  18. #18
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut
    Par contre rien ne se passe

  19. #19
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par solerian Voir le message
    Par contre rien ne se passe
    Bah, au moins, il ne fait rien de mal.

    Plus sérieusement, il n'y a pas 36 solutions, il faut mettre des impressions à différents endroits importants dans le programme pour déterminer par où il passe et ce qu'il fait et éventuellement ne fait pas, et quelle est la valeur des différentes variables importantes aux différents moments importants.

    Sinon, un peu de lecture très utile pour ce genre de problème: FAQ débogage sous Perl

    Enfin, je ne pas t'aider plus si tu ne montres pas le code du programme que tu as testé.

  20. #20
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut
    Voici le code que j'ai testé :
    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
    84
    85
    86
    87
    88
     
    use strict;
    use warnings;
    use CAM::PDF;
    use CAM::PDF::PageText;
    use Config::IniFiles;
     
    my @repertoire;
    #my @fichier_facture; ## tous les fichiers facture au format PDF ##
    #my @fichier_facture1;## tous les fichiers facture au format TXT ##
    my @fichier_paie;## tous les fichiers paie au format PDF ##
    #my @fichier_paie1;## tous les fichiers paie au format TXT ##
    my @filelist;
     
    my $cfg = Config::IniFiles->new( -file => $ARGV[0] );
    foreach ('REP_FACTURE','REP_BULLETIN','REP_FACTURE_TXT','REP_BULLETIN_TXT') {
    	  push @repertoire, $cfg->val('repertoire', $_) if $cfg->val('repertoire', $_);
    	  }
     
     
     
    sub GetFilesList 
    {
            my $Path = $_[0];
            my $FileFound;
            my @FilesList=();
     
            ## Lecture de la liste des fichiers
            opendir (my $FhRep, $Path)
                    or die "Impossible d'ouvrir le repertoire $Path\n";
            my @Contenu = grep { !/^\.\.?$/ } readdir($FhRep);
            closedir ($FhRep);
     
            foreach my $FileFound (@Contenu) {
                    ## Traitement des fichiers
                    if (-f "$Path/$FileFound") {
                            push (@FilesList, "$Path/$FileFound" );
                    }
                    ## Traitement des repertoires
                    elsif ( -d "$Path/$FileFound") {
                            ## Boucle pour lancer la recherche en mode recursif
                            push (@FilesList, GetFilesList("$Path/$FileFound") );
                    }
            }
            return @FilesList;
    }
    my @Files = GetFilesList ($repertoire[0]);
    foreach my $File  (@Files) { 
    	next unless $File =~ /\.pdf$/i;
    	print "$File \n";
    }
     
    @Files = GetFilesList  ($repertoire[1]);
    foreach my $File  (@Files) { 
    	next unless $File =~ /\.pdf$/i;
    	print "$File \n";
    } 
     
    @Files = GetFilesList  ($repertoire[0]);
    foreach my $File  (@Files) { 
    	next unless $File =~ /\.txt$/i;
    	print "$File \n";
    } 
     
    @Files = GetFilesList  ($repertoire[3]);
    foreach my $File  (@Files) { 
    	next unless $File =~ /\.txt$/i;
    	print "$File \n";
    } 
    sub convert_pdf_to_text  {
       my $pdf  = CAM::PDF->new(shift);
       my $fic_txt_out = shift;
       my $tmp = $pdf->getPageContentTree(1);
       my $text = CAM::PDF::PageText->render($tmp);
       # ajustements à effectuer par rapport à la sortie,
       # sur un exemple simple, il me fallait ceci:
       $text =~ s/\n{5}/\n/g;
       $text =~ s/\n{4}/ /g;
     
    }
     
    my @pdf_files = glob ("$repertoire[0]/*.pdf"); # répertoire facture
      for my $in_file (@Files) {
    	my $out_file = $in_file;
    	$out_file =~ s/\.pdf/.txt/;   # construit le nom de fichier en sortie à partir du nom en entrée
     
       convert_pdf_to_text($in_file, $out_file);
       }
    avec ma fonction getfileslist je dois voir les fichiers .txt apparaître, sauf que je ne sais pas ou sont redirigés les fichiers que je convertis

Discussions similaires

  1. convertir un fichier Pdf en fichier txt
    Par aviateur22 dans le forum C#
    Réponses: 4
    Dernier message: 23/03/2016, 16h42
  2. Convertir fichier PDF en fichier txt
    Par solerian dans le forum Langage
    Réponses: 7
    Dernier message: 15/03/2016, 12h53
  3. Convertir un fichier HTML en fichier PDF en ligne de commande
    Par koKoTis dans le forum Autres Logiciels
    Réponses: 6
    Dernier message: 16/06/2009, 00h06
  4. [PDF] comment convertir un PDF en fichier images
    Par magnus2005 dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 23/05/2006, 20h04

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