Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1596 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  Convertir fichier PDF en txt à partir d'un fichier d'initialisation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Convertir fichier PDF en txt à partir d'un fichier d'initialisation

n°2281694
solerian62​3
Posté le 18-05-2016 à 15:36:34  profilanswer
 

Bonjour à tous,
 
Je souhaite convertir tous les fichiers PDF se trouvant dans un répertoire en fichier txt et que les fichiers txt soit placer dans un autre répertoire.
Pour se faire j'utilise un fichier d'initialisation afin de ne pas avoir les arborescences en dur dans mon code. Voici le contenu de mon fichier d'initialisation :
 
[repertoire]
REP_PDF=C:\PDF\
REP_TXT=C:\TXT\
 
Au préalable j'utilise la fonction GetFilesList qui me permettra de lister les différents fichiers PDF se dans c:\PDF\ mais aussi de lister les différents fichiers txt se trouvant  dans c:\TXT\ afin de voir que la conversion a bien eu lieu.
 
Pour se faire j'utilise le code suivant :
 

Code :
  1. use strict;
  2. use warnings;
  3. use CAM::PDF;
  4. use CAM::PDF::PageText;
  5. use Config::IniFiles;
  6. my @repertoire;
  7. my $cfg = Config::IniFiles->new( -file => $ARGV[0] );
  8. foreach ('REP_PDF','REP_TXT') {
  9.   push @repertoire, $cfg->val('repertoire', $_) if $cfg->val('repertoire', $_);
  10.   }
  11. sub GetFilesList
  12. {
  13.         my $Path = $_[0];
  14.         my $FileFound;
  15.         my @FilesList=();
  16.         ## Lecture de la liste des fichiers
  17.         opendir (my $FhRep, $Path)
  18.                 or die "Impossible d'ouvrir le repertoire $Path\n";
  19.         my @Contenu = grep { !/^\.\.?$/ } readdir($FhRep);
  20.         closedir ($FhRep);
  21.         foreach my $FileFound (@Contenu) {
  22.                 ## Traitement des fichiers
  23.                 if (-f "$Path/$FileFound" ) {
  24.                         push (@FilesList, "$Path/$FileFound" );
  25.                 }
  26.                 ## Traitement des repertoires
  27.                 elsif ( -d "$Path/$FileFound" ) {
  28.                         ## Boucle pour lancer la recherche en mode recursif
  29.                         push (@FilesList, GetFilesList("$Path/$FileFound" ) );
  30.                 }
  31.         }
  32.         return @FilesList;
  33. }
  34. my @Files = GetFilesList ($repertoire[0]);
  35. foreach my $File  (@Files) {
  36. next unless $File =~ /\.pdf$/i;
  37. print "$File \n";
  38. }
  39. @Files = GetFilesList  ($repertoire[1]);
  40. foreach my $File  (@Files) {
  41. next unless $File =~ /\.txt$/i;
  42. print "$File \n";
  43. }
  44. sub convert_pdf_to_text  {
  45.    my $pdf  = CAM::PDF->new(shift);
  46.    my $fic_txt_out = shift;
  47.    my $tmp = $pdf->getPageContentTree(1);
  48.    my $text = CAM::PDF::PageText->render($tmp);
  49.    # ajustements à effectuer par rapport à la sortie,
  50.    # sur un exemple simple, il me fallait ceci:
  51.    $text =~ s/\n{5}/\n/g;
  52.    $text =~ s/\n{4}/ /g;
  53. my @pdf_files = glob ("$repertoire[0]/*.pdf" ); # répertoire pdf
  54.   for my $in_file (@Files) {
  55. my $out_file = $in_file;
  56. $out_file =~ s/\.pdf/.txt/;   # construit le nom de fichier en sortie à partir du nom en entrée
  57.  
  58.    convert_pdf_to_text($in_file, $out_file);
  59.     }
  60.  
  61. }


 
J'espère que les informations que je vous transmets seront compréhensibles.
Je vous remercie d'avance pour votre aide.
 
Cordialement

mood
Publicité
Posté le 18-05-2016 à 15:36:34  profilanswer
 

n°2281707
rufo
Pas me confondre avec Lycos!
Posté le 18-05-2016 à 17:23:08  profilanswer
 

Bizarre : ça me rappel un topic du même genre qui est passé sur ce forum y'a pas longtemps.
 
Tu devrais faire une recherche ;)
 
Edit : je me demande si c'est pas ce topic : http://forum.hardware.fr/hfr/Progr [...] 4796_1.htm ou celui-là http://forum.hardware.fr/hfr/Progr [...] 4882_1.htm ?
 
Du reste, l'auteur du topic a un nom très proche du votre : multi ?

Message cité 1 fois
Message édité par rufo le 18-05-2016 à 17:27:45

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2281726
rat de com​bat
attention rongeur méchant!
Posté le 18-05-2016 à 20:02:28  profilanswer
 

rufo a écrit :

Du reste, l'auteur du topic a un nom très proche du votre : multi ?


même date de naissance...
 
Tu as donné le mauvais lien, c'est pas txt->pdf mais pdf->txt ici, soit l'autre sujet: http://forum.hardware.fr/hfr/Progr [...] 4801_1.htm . ;)  
 
D'ailleurs je ne vois pas de question, de message d'erreur,... dans ce sujet. -> :??:

n°2281786
solerian62​3
Posté le 20-05-2016 à 09:04:41  profilanswer
 

il n'y a pas de message d'erreur.
je veux juste convertir les fichiers pdf en txt en utilisant uniquement les répertoires

n°2281798
gilou
Modérateur
Modzilla
Posté le 20-05-2016 à 11:25:58  profilanswer
 

Perso, j'irais
1) récupérer xpdf ici: http://www.foolabs.com/xpdf/download.html dans la version pour son OS
2) j'en utiliserais le binaire pdftotext qui convertit un pdf en texte avec une bonne qualité et une bonne rapidité, vu qu'il est écrit en C
et j'incorporerais ça dans un script perl.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2281799
solerian62​3
Posté le 20-05-2016 à 11:29:33  profilanswer
 

Comment passé d'un code C en Perl aussi ?  
Je n'est aucune notion en C

n°2281802
gilou
Modérateur
Modzilla
Posté le 20-05-2016 à 11:39:40  profilanswer
 

Il y a pas besoin, tu peux appeler un exécutable depuis perl:
 

Code :
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. my $input = "wkhtmltopdf - Manual.pdf";
  7. my $output = "testoutput.txt";
  8.  
  9. my $cmd = "pdftotext";
  10. system($cmd, $input, $output);


 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2282260
solerian62​3
Posté le 25-05-2016 à 15:03:39  profilanswer
 

J'ai modifié le code avec ceci :
 
 open my $fout, '>', $fic_txt_out or die "Ouverture impossible de $fic_txt_out $!";
   print $fout $text;
   close $fout;
 
Et ça fonctionne pour tout le répertoire PDF1.
 
Maintenant il faut que je fasse la même chose avec le répertoire PDF2.
Lorsque je modifie le nom des variables il ne se passe rien et lorsque je conserve le même nom de variable il ne se passe rien non plus.
Voici le code complet que j'ai testé

Code :
  1. use strict;
  2. use warnings;
  3. use CAM::PDF;
  4. use CAM::PDF::PageText;
  5. use Config::IniFiles;
  6.  
  7. my @repertoire;
  8. my @filelist;
  9.  
  10. my $cfg = Config::IniFiles->new( -file => $ARGV[0] );
  11. foreach ('REP_PDF1','REP_PDF2') {
  12.       push @repertoire, $cfg->val('repertoire', $_) if $cfg->val('repertoire', $_);
  13.       }
  14.  
  15.  
  16. sub GetFilesList
  17. {
  18.        my $Path = $_[0];
  19.        my $FileFound;
  20.        my @FilesList=();
  21.     
  22.        ## Lecture de la liste des fichiers
  23.        opendir (my $FhRep, $Path)
  24.                or die "Impossible d'ouvrir le repertoire $Path\n";
  25.        my @Contenu = grep { !/^\.\.?$/ } readdir($FhRep);
  26.        closedir ($FhRep);
  27.  
  28.        foreach my $FileFound (@Contenu) {
  29.                ## Traitement des fichiers
  30.                if (-f "$Path/$FileFound" ) {
  31.                        push (@FilesList, "$Path/$FileFound" );
  32.                }
  33.                ## Traitement des repertoires
  34.                elsif ( -d "$Path/$FileFound" ) {
  35.                        ## Boucle pour lancer la recherche en mode recursif
  36.                        push (@FilesList, GetFilesList("$Path/$FileFound" ) );
  37.                }
  38.        }
  39.        return @FilesList;
  40. }
  41. my @Files = GetFilesList ($repertoire[0]);
  42. foreach my $File  (@Files) {
  43.     next unless $File =~ /\.pdf$/i;
  44.     print "$File \n";
  45. }
  46. @Files = GetFilesList  ($repertoire[0]);
  47. foreach my $File  (@Files) {
  48.     next unless $File =~ /\.txt$/i;
  49.     print "$File \n";
  50. }
  51.  
  52. @Files = GetFilesList  ($repertoire[1]);
  53. foreach my $File  (@Files) {
  54.     next unless $File =~ /\.pdf$/i;
  55.     print "$File \n";
  56. }
  57.  
  58. @Files = GetFilesList  ($repertoire[1]);
  59. foreach my $File  (@Files) {
  60.     next unless $File =~ /\.txt$/i;
  61.     print "$File \n";
  62. }
  63.  
  64. sub convert_pdf_to_text  {
  65.   my $pdf  = CAM::PDF->new(shift);
  66.   my $fic_txt_out = shift;
  67.   my $tmp = $pdf->getPageContentTree(1);
  68.   my $text = CAM::PDF::PageText->render($tmp);
  69.   # ajustements à effectuer par rapport à la sortie,
  70.   # sur un exemple simple, il me fallait ceci:
  71.   $text =~ s/\n{5}/\n/g;
  72.   $text =~ s/\n{4}/ /g;
  73.  
  74.   open my $fout, '>', $fic_txt_out or die "Ouverture impossible de $fic_txt_out $!";
  75.   print $fout $text;
  76.   close $fout;
  77. }
  78.  
  79. my @pdf_files = glob ("$repertoire[0]/*.pdf" );
  80.  for my $in_file (@Files) {
  81.     my $out_file = $in_file;
  82.     $out_file =~ s/\.pdf/.txt/;   # construit le nom de fichier en sortie à partir du nom en entrée
  83.     
  84.   convert_pdf_to_text($in_file, $out_file);
  85.   }
  86.  
  87. @pdf_files = glob ("$repertoire[1]/*.pdf" );
  88.  for my $in_file (@Files) {
  89.     my $out_file = $in_file;
  90.     $out_file =~ s/\.pdf/.txt/;   # construit le nom de fichier en sortie à partir du nom en entrée
  91.     
  92.   convert_pdf_to_text($in_file, $out_file);
  93.   }


 
faut-il que je réinitialise les variables ?


Message édité par gilou le 25-05-2016 à 21:21:03
n°2282327
gilou
Modérateur
Modzilla
Posté le 25-05-2016 à 21:25:23  profilanswer
 

A priori, non.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2282347
solerian62​3
Posté le 26-05-2016 à 08:26:15  profilanswer
 

Mais il ne me convertit que les fichiers se trouvant dans PDF et non dans PDF1

mood
Publicité
Posté le 26-05-2016 à 08:26:15  profilanswer
 

n°2282350
solerian62​3
Posté le 26-05-2016 à 09:31:25  profilanswer
 

voici mon message d'erreur :
Can't call method "getPageContentTree" on an undefined value c:\pdf_txt.pl

n°2282352
gilou
Modérateur
Modzilla
Posté le 26-05-2016 à 10:07:21  profilanswer
 

Ce qui veut dire que tu as un appel
sub convert_pdf_to_text  {
   my $pdf  = CAM::PDF->new(shift);
qui a échoué ce qui a mis $pdf a la valeur undef
d'ou l'échec à l'appel de my $tmp = $pdf->getPageContentTree(1);
Il faut que tu imprimes le nom de ton fichier en cas d'échec
sub convert_pdf_to_text  {
   my $infile = shift;
   my $pdf  = CAM::PDF->new($infile);
   print "Echec avec le fichier $infile!\n" unless defined($pdf);
 
et ensuite, il faudra que tu comprennes ce qui pose problème avec ton fichier pdf.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2282356
solerian62​3
Posté le 26-05-2016 à 10:39:11  profilanswer
 

Merci pour ton aide je viens de trouver le problème grâce à tes informations en fait j'avais 4 fichiers PDF dans le répertoire PDF1 et y en avait 1 que je ne pouvais pas ouvrir.
Et maintenant ça fonctionne.

n°2282357
solerian62​3
Posté le 26-05-2016 à 10:47:31  profilanswer
 

mais ça ne fonctionne plus pour le répertoire PDF


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  Convertir fichier PDF en txt à partir d'un fichier d'initialisation

 

Sujets relatifs
Récupérer une partie du nom de fichier en variable ?Macro générer fichier excel avec info dans l'ordre
Envoyer automatiquement un fichier entre 2 serveurs sans FTPFormulaire ACCESS: créer bouton commande d'ouverture fichier bdd
[Résolu] [SQLite] Importation impossible fichier .dump > .dbArchitecture des fichier jpeg et mp4
Créer une url complète à partir d'un javascript[MYSQL] Import fichier csv : empecher l'update de certaines colonnes
[CSHARP] comparer caractère d'un fichier texteOuverture et lecture de fichier PDF
Plus de sujets relatifs à : Convertir fichier PDF en txt à partir d'un fichier d'initialisation


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR