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

Convertir fichier PDF en txt à partir d'un fichier d'initialisation - Perl - Programmation

Marsh Posté le 18-05-2016 à 15:36:34    

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

Reply

Marsh Posté le 18-05-2016 à 15:36:34   

Reply

Marsh Posté le 18-05-2016 à 17:23:08    

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
Reply

Marsh Posté le 18-05-2016 à 20:02:28    

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. -> :??:

Reply

Marsh Posté le 20-05-2016 à 09:04:41    

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

Reply

Marsh Posté le 20-05-2016 à 11:25:58    

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é!  --
Reply

Marsh Posté le 20-05-2016 à 11:29:33    

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

Reply

Marsh Posté le 20-05-2016 à 11:39:40    

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é!  --
Reply

Marsh Posté le 25-05-2016 à 15:03:39    

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
Reply

Marsh Posté le 25-05-2016 à 21:25:23    

A priori, non.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 26-05-2016 à 08:26:15    

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

Reply

Marsh Posté le 26-05-2016 à 08:26:15   

Reply

Marsh Posté le 26-05-2016 à 09:31:25    

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

Reply

Marsh Posté le 26-05-2016 à 10:07:21    

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é!  --
Reply

Marsh Posté le 26-05-2016 à 10:39:11    

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.

Reply

Marsh Posté le 26-05-2016 à 10:47:31    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed