Convertir fichier PDF en fichier txt

Convertir fichier PDF en fichier txt - Perl - Programmation

Marsh Posté le 11-03-2016 à 14:18:37    

Bonjour à tous,
 
Je souhaite convertir certains fichiers PDf au format txt.
Je pense à utiliser le module PDF::API2
mais je ne vois pas comment rédiger mon programme  
je possède une boucle GetFilesList pour me lister tous les PDF et je vais en faire une seconde pour lister tout les fichiers txt.
Je pense m'appuyer sur un fichier d'initialisation qui contiendra les arborescences des différents fichiers PDF étant donné que je ne souhaite pas que l'on voit l'arborescence dans le programme.
 
Le contenu du fichier d'initialisation sera de la forme :
[fichier_pdf]
FACTURE_PDF=C:\facture_pdf\
BULLETIN_PAIE_PDF=C:\bulletin_paie_pdf\
ORDONNANCE_PDF=C:\ordonnance_pdf\
 
Dans le répertoire facture_pdf il y aura :
facture.pdf
facture1.pdf
facture2.pdf
etc...
 
Dans le répertoire bulletin_paie_pdf il y aura :
paie.pdf
paie1.pdf
paie2.pdf
etc ...
 
Dans le répertoire ordonnance_pdf il y aura :
ordonnance.pdf
ordonnance1.pdf
ordonnance2.pdf  
etc ...
 
Le résultat que je souhaite obtenir est le suivant :
Dans le répertoire facture_pdf il y aura :
facture.pdf
facture1.pdf
facture2.pdf
et
facture.txt
facture1.txt
facture2.txt
 
Dans le répertoire bulletin_paie_pdf il y aura :
paie.pdf
paie1.pdf
paie2.pdf
et
paie.txt
paie1.txt
paie2.txt
 
Dans le répertoire ordonnance_pdf il y aura :
ordonnance.pdf
ordonnance1.pdf
ordonnance2.pdf  
et
ordonnance.txt
ordonnance1.txt
ordonnance2.txt
 
Est-ce compréhensible ?  
 
Je vous remercie d'avance pour votre aide.
 
Cordialement


Message édité par solerian le 11-03-2016 à 16:20:41
Reply

Marsh Posté le 11-03-2016 à 14:18:37   

Reply

Marsh Posté le 11-03-2016 à 15:59:10    

Ordonnance prend 2 "n" :o


---------------
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 11-03-2016 à 16:21:03    

Cela te convient mieux ?

Reply

Marsh Posté le 11-03-2016 à 16:32:40    

A vrai dire je suis un peu étonné ou disons perdu. Hier (ou presque) tu demandais comment convertir au format pdf depuis un fichier texte, maintenant tu veux faire l'inverse? :??: Si c'est pour éditer des pdfs il doit y avoir plus propre/simple je pense (à confirmer).

Reply

Marsh Posté le 11-03-2016 à 16:35:50    

C'est parce que je souhaite modifier des PDF sans utiliser de logiciel et pour l'autre discussion je souhaite convertir des fichier lst  pour ne plus pouvoir les modifier sans utiliser un logiciel tels que PDF Creator.

Reply

Marsh Posté le 11-03-2016 à 16:44:00    

Pour modifier des PDF il y a des outils qui permettent de le faire directement, en passant par des fichiers .txt tu risques de perdre des infos (mise en page notamment). http://search.cpan.org/~cdolan/CAM [...] CAM/PDF.pm http://search.cpan.org/~ssimms/PDF [...] DF/API2.pm D'ailleurs le deuxième tu en parlais déjà dans l'autre sujet.

Reply

Marsh Posté le 11-03-2016 à 16:50:24    

solerian a écrit :

Cela te convient mieux ?


Oui  :jap:


---------------
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 11-03-2016 à 18:10:15    

solerian a écrit :

C'est parce que je souhaite modifier des PDF sans utiliser de logiciel et pour l'autre discussion je souhaite convertir des fichier lst  pour ne plus pouvoir les modifier sans utiliser un logiciel tels que PDF Creator.

Si c'est juste pour ajouter ou retirer des pages à un document existant, c'est assez facile. Si c'est pour modifier le contenu d'une page déjà existante en PDF, ben je te souhaite bien du plaisir.
 
A+,


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

Marsh Posté le 14-03-2016 à 09:56:31    

C'est juste pour ajouter ou retirer des pages

Reply

Marsh Posté le 14-03-2016 à 11:55:43    

Pour retirer des pages:

Code :
  1. #!/usr/bin/perl -w
  2.  
  3. use strict;
  4. use warnings;
  5. use CAM::PDF;
  6.  
  7. my $infile = "input.pdf";
  8. my $outfile = "output.pdf";
  9. my $pagenums = ""; # par exemple "2, 8-10, 25, 26-"
  10.  
  11. # ouverture du fichier en entrée ou échec
  12. my $doc = CAM::PDF->new($infile) || die "$CAM::PDF::errstr\n";
  13.  
  14. # On supprime les pages listées ou échec
  15. die "Failed to delete a page\n" unless($doc->deletePages($pagenums));
  16.  
  17. # peut être inutile, à tester
  18. $doc->preserveOrder();
  19.  
  20. # échec si document pas modifiable
  21. die "This PDF forbids modification\n" unless ($doc->canModify());
  22.  
  23. # Et on sauvegarde le résultat
  24. $doc->cleanoutput($outfile);


 
Pour ajouter un fichier à la suite d'un autre:

Code :
  1. #!/usr/bin/perl -w
  2.  
  3. use strict;
  4. use warnings;
  5. use CAM::PDF;
  6.  
  7. my $infile1 = "input1.pdf";
  8. my $infile2 = "input2.pdf";
  9. my $outfile = "output.pdf";
  10.  
  11. # ouverture du premier fichier en entrée
  12. my $doc = CAM::PDF->new($infile1) || die "$CAM::PDF::errstr\n";
  13.  
  14. # ajout du second à la fin
  15. $doc->appendPDF($infile2);
  16.  
  17. # peut être inutile, à tester
  18. $doc->clearAnnotations();
  19. $doc->preserveOrder();
  20.  
  21. # échec si document pas modifiable
  22. die "This PDF forbids modification\n" unless ($doc->canModify());
  23.  
  24. # Et on sauvegarde le résultat
  25. $doc->cleanoutput($outfile);


 
A toi d'adapter selon tes besoins. Ou d'aller voir la doc de CAM::PDF pour une utilisation plus fine.
 
A+,


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

Marsh Posté le 14-03-2016 à 11:55:43   

Reply

Marsh Posté le 14-03-2016 à 17:10:41    

J'utilise toujours un fichier d'initialisation que voici :
[repertoire]
REP_FACTURE=C:\Users\baranowp\Documents\2016_01_07_08\facture\
REP_BULLETIN=C:\Users\baranowp\Documents\2016_02_04_05\bulletin_paie\
 
[fichier_facture]
FIC_1=C:\Users\baranowp\Documents\2016_01_07_08\facture\facture1.pdf
FIC_2=C:\Users\baranowp\Documents\2016_01_07_08\facture\facture2.pdf
FIC_3=C:\Users\baranowp\Documents\2016_01_07_08\facture\facture3.pdf
 
[fichier_paie]
FIC_4=C:\Users\baranowp\Documents\2016_02_04_05\bulletin_paie\paie1.pdf
FIC_5=C:\Users\baranowp\Documents\2016_02_04_05\bulletin_paie\paie2.pdf
 
 
 

Code :
  1. use strict;
  2. use warnings;
  3. use CAM::PDF;
  4. use Config::IniFiles;
  5. my $pdf = CAM::PDF->new();
  6. my @repertoire;
  7. my @fichier_facture;
  8. my @fichier_paie;
  9. my $cfg = Config::IniFiles->new( -file => $ARGV[0] );
  10. foreach ('REP_PROD') {
  11.   push @repertoire, $cfg->val('repertoire', $_);
  12.   }
  13. foreach ('FIC_1','FIC_2') {
  14.    push @fichier_facture, $cfg->val('fichier_facture', $_) if $cfg->val('fichier_facture', $_);
  15.   }
  16. foreach ('FIC_4','FIC_5') {
  17.    push @fichier_paie, $cfg->val('fichier_paie', $_) if $cfg->val('fichier_paie', $_);
  18.   }
  19. my $infile = $fichier_facture[0];
  20. my $outfile = $fichier_facture[1];
  21. my $pagenums = "";
  22. my $doc = CAM::PDF->new($infile) || die "$CAM::PDF::errstr\n";
  23. $doc->appendPDF($infile);
  24. # peut être inutile, à tester
  25. $doc->clearAnnotations();
  26. $doc->preserveOrder();
  27. # échec si document pas modifiable
  28. die "This PDF forbids modification\n" unless ($doc->canModify());
  29. # Et on sauvegarde le résultat
  30. $doc->cleanoutput($outfile);
  31. sub GetFilesList
  32. {
  33.        my $Path = $_[0];
  34.         my $FileFound;
  35.         my @FilesList=();
  36.         ## Lecture de la liste des fichiers
  37.         opendir (my $FhRep, $Path)
  38.                 or die "Impossible d'ouvrir le repertoire $Path\n";
  39.         my @Contenu = grep { !/^\.\.?$/ } readdir($FhRep);
  40.         closedir ($FhRep);
  41.         foreach my $FileFound (@Contenu) {
  42.                 ## Traitement des fichiers
  43.                 if ( -f "$Path/$FileFound" ) {
  44.                         push ( @FilesList, "$Path/$FileFound" );
  45.                 }
  46.                 ## Traitement des repertoires
  47.                 elsif ( -d "$Path/$FileFound" ) {
  48.                         ## Boucle pour lancer la recherche en mode recursif
  49.                         push (@FilesList, GetFilesList("$Path/$FileFound" ) );
  50.                 }
  51.         }
  52.         return @FilesList;
  53. }
  54. my @Files = GetFilesList ($repertoire[0]);
  55. foreach my $File  (@Files) {
  56. next unless $File =~ /\.lst$/i;
  57. print "$File \n";
  58. }
  59. my %dirs = ( facture_pdf => "facture", bulletin_paie => "paie", ordonnance => "ordonnance" ); # à remplacer éventuellement pas fichier de config
  60. for my $dir (keys %dirs) {
  61.     my $file_names = "$dirs{$dir}*.pdf";
  62.     my @files = glob ("$dir/$file_names" );
  63.     for my $file (@files) {
  64.         convert ($dir, $file);
  65.     }
  66. }
  67. sub convert {
  68.     my ($dir, $file_in) = @_;
  69.     my $file_out = $file_in;
  70.     $file_out =~ s/pdf$/txt/;
  71. }


 
J'ai installé le module CAM::PDF
Et voici mon message d'erreur :
Use of uninitialized value $content in pattern match (m//) at C:/Strawberry/perl/site/lib/CAM/PDF.pm line 301.
Use of uninitialized value $content in numeric gt (> ) at C:/Strawberry/perl/site/lib/CAM/PDF.pm line 311.
Use of uninitialized value $file in string eq at C:/Strawberry/perl/site/lib/CAM/PDF.pm line 314.
Use of uninitialized value $file in open at C:/Strawberry/perl/site/lib/CAM/PDF.pm line 327.
Use of uninitialized value $file in concatenation (.) or string at C:/Strawberry/perl/site/lib/CAM/PDF.pm line 342.
Can't locate object method "getRootDict" via package "C:\Users\baranowp\Documents\2016_01_07_08\facture\facture1.pdf" (p
erhaps you forgot to load "C:\Users\baranowp\Documents\2016_01_07_08\facture\facture1.pdf"?) at C:/Strawberry/perl/site/
lib/CAM/PDF.pm line 3786.

Reply

Marsh Posté le 14-03-2016 à 20:07:48    

Bien évidemment, puisque vous faites ceci en 6e ligne: my $pdf = CAM::PDF->new(); et que le new doit se faire sur du contenu comme je fais ligne 25.
Les modules perls ont une doc sur les paramètres que prennent leurs fonctions, encore faudrait il la lire.
 
A+,


Message édité par gilou le 14-03-2016 à 20:09:22

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

Marsh Posté le 15-03-2016 à 12:03:17    

Lorsque je réalise ce programme je n'ai plus de message d'erreur :

Code :
  1. use strict;
  2. use warnings;
  3. use PDF::API2;
  4. use Config::IniFiles;
  5. my $pdf = PDF::API2->new();
  6. my @repertoire;
  7. my @fichier_facture;
  8. my @fichier_paie;
  9. my @filelist;
  10. my $cfg = Config::IniFiles->new( -file => $ARGV[0] );
  11. foreach ('REP_FACTURE','REP_BULLETIN') {
  12.   push @repertoire, $cfg->val('repertoire', $_) if $cfg->val('repertoire', $_);
  13.   }
  14. foreach ('FIC_1','FIC_2','FIC_3') {
  15.   push @fichier_facture, $cfg->val('fichier_facture', $_) if $cfg->val('fichier_facture', $_) ;
  16.   }
  17. foreach ('FIC_4','FIC_5') {
  18.   push @fichier_paie, $cfg->val('param_paie', $_) if $cfg->val('param_paie', $_);
  19.   }
  20. sub GetFilesList
  21. {
  22.         my $Path = $_[0];
  23.         my $FileFound;
  24.         my @FilesList=();
  25.         ## Lecture de la liste des fichiers
  26.         opendir (my $FhRep, $Path)
  27.                 or die "Impossible d'ouvrir le repertoire $Path\n";
  28.         my @Contenu = grep { !/^\.\.?$/ } readdir($FhRep);
  29.         closedir ($FhRep);
  30.         foreach my $FileFound (@Contenu) {
  31.                 ## Traitement des fichiers
  32.                 if ( -f "$Path/$FileFound" ) {
  33.                         push ( @FilesList, "$Path/$FileFound" );
  34.                 }
  35.                 ## Traitement des repertoires
  36.                 elsif ( -d "$Path/$FileFound" ) {
  37.                         ## Boucle pour lancer la recherche en mode recursif
  38.                         push (@FilesList, GetFilesList("$Path/$FileFound" ) );
  39.                 }
  40.         }
  41.         return @FilesList;
  42. }
  43. my @Files = GetFilesList ($repertoire[0]);
  44. foreach my $File  (@Files) {
  45. next unless $File =~ /\.pdf$/i;
  46. print "$File \n";
  47. }
  48. @Files = GetFilesList  ($repertoire[1]);
  49. foreach my $File  (@Files) {
  50. next unless $File =~ /\.pdf$/i;
  51. print "$File \n";
  52. }
  53. my %dirs = ( facture_pdf => "facture", bulletin_paie => "paie", ordonnance => "ordonnance" ); # à remplacer éventuellement pas fichier de config
  54. for my $dir (keys %dirs) {
  55.     my $file_names = "$dirs{$dir}*.pdf";
  56.     my @files = glob ("$dir/$file_names" );
  57.     for my $file (@files) {
  58.         convert ($dir, $file);
  59.     }
  60. }
  61. sub convert {
  62.     my ($dir, $file_in) = @_;
  63.     my $file_out = $file_in;
  64.     $file_out =~ s/pdf$/txt/;
  65.    
  66. }


lorsque j'exécute le programme il me renvoi tous les fichiers pdf se trouvant dans les repertoires factures et bulletin de paie maintenant il ne me plus qu'à comprendre comment fonctionne la fonction convert pour avoir mes fichiers PDF au format txt
 
Cordialement

Reply

Marsh Posté le 16-03-2016 à 09:05:59    

J'ai réussi à installer le module CAM::PDF. Je souhaite juste convertir les fichiers PDF en format txt pour extraire des données

Reply

Marsh Posté le 16-03-2016 à 12:01:51    

Code :
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5. use autodie;
  6. use CAM::PDF;
  7. use CAM::PDF::PageText;
  8.  
  9. sub convert_pdf_to_text ($$) {
  10.    my $pdf  = CAM::PDF->new(shift);
  11.    my $tmp = $pdf->getPageContentTree(1);
  12.    my $text = CAM::PDF::PageText->render($tmp);
  13.    # ajustements à effectuer par rapport à la sortie,
  14.    # sur un exemple simple, il me fallait ceci:
  15.    $text =~ s/\n{5}/\n/g;
  16.    $text =~ s/\n{4}/ /g;
  17.    
  18.    open my $fout, '>', shift;
  19.    print $fout $text;
  20.    close $fout;
  21. }
  22.  
  23. my $pdf_filename = '....pdf';
  24. my $txt_filename = '....txt';
  25.  
  26. convert_pdf_to_text($pdf_filename, $txt_filename);


Comme la conversion pdf->txt n'est pas une science exacte, la conversion n'est jamais assurée d'être parfaite si le document est complexe.
 
A+,


Message édité par gilou le 16-03-2016 à 12:03:08

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

Marsh Posté le 16-03-2016 à 14:31:29    

Si mon fichier pdf contient plusieurs tableau il faut que je modifie ceci :  
 

Code :
  1. $text =~ s/\n{5}/\n/g;
  2.         $text =~ s/\n{4}/ /g;

Reply

Marsh Posté le 16-03-2016 à 14:48:30    

Si vous avez des tableaux, vous êtes mal barré, la structure d'un fichier pdf étant très différente de celle d'un fichier texte, vous n'êtes même pas sur que les fragments de texte vont être dans l'ordre voulu.
Il n'y a pas de solution miracle, le pdf est un format final, qui est pas conçu pour être exporté vers un autre format (surtout si la version du pdf est ancienne, et qu'il n'y a pas de structure hiérarchique dedans). En général, quand on veut récupérer le contenu d'un fichier pdf avec des tableaux, on fait appel à un OCR de bonne qualité, et on relit attentivement le résultat :D
 
Mon avis: récupérer le programme pdftohtml, appeler ce programme pour convertir vos documents pdf en xml, et travailler sur les documents xml générés en espérant que pdftohtml a fait du bon boulot.
 
A+,


Message édité par gilou le 16-03-2016 à 15:03:54

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

Sujets relatifs:

Leave a Replay

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