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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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
    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
    Membre confirmé
    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
    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
    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
    Membre confirmé
    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
    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
    Billets dans le blog
    1
    Par défaut
    OK, et ça marche, ce que j'ai proposé?

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