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

  FORUM HardWare.fr
  Programmation
  Perl

  Convertir fichier PDF en fichier txt

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Convertir fichier PDF en fichier txt

n°2277473
solerian
Posté le 11-03-2016 à 14:18:37  profilanswer
 

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
mood
Publicité
Posté le 11-03-2016 à 14:18:37  profilanswer
 

n°2277481
rufo
Pas me confondre avec Lycos!
Posté le 11-03-2016 à 15:59:10  profilanswer
 

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
n°2277484
solerian
Posté le 11-03-2016 à 16:21:03  profilanswer
 

Cela te convient mieux ?

n°2277486
rat de com​bat
attention rongeur méchant!
Posté le 11-03-2016 à 16:32:40  profilanswer
 

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).

n°2277487
solerian
Posté le 11-03-2016 à 16:35:50  profilanswer
 

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.

n°2277489
rat de com​bat
attention rongeur méchant!
Posté le 11-03-2016 à 16:44:00  profilanswer
 

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.

n°2277492
rufo
Pas me confondre avec Lycos!
Posté le 11-03-2016 à 16:50:24  profilanswer
 

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
n°2277504
gilou
Modérateur
Modzilla
Posté le 11-03-2016 à 18:10:15  profilanswer
 

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é!  --
n°2277575
solerian
Posté le 14-03-2016 à 09:56:31  profilanswer
 

C'est juste pour ajouter ou retirer des pages

n°2277584
gilou
Modérateur
Modzilla
Posté le 14-03-2016 à 11:55:43  profilanswer
 

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é!  --
mood
Publicité
Posté le 14-03-2016 à 11:55:43  profilanswer
 

n°2277598
solerian
Posté le 14-03-2016 à 17:10:41  profilanswer
 

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.

n°2277602
gilou
Modérateur
Modzilla
Posté le 14-03-2016 à 20:07:48  profilanswer
 

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é!  --
n°2277658
solerian
Posté le 15-03-2016 à 12:03:17  profilanswer
 

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

n°2277750
solerian
Posté le 16-03-2016 à 09:05:59  profilanswer
 

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

n°2277767
gilou
Modérateur
Modzilla
Posté le 16-03-2016 à 12:01:51  profilanswer
 

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é!  --
n°2277774
solerian
Posté le 16-03-2016 à 14:31:29  profilanswer
 

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;

n°2277776
gilou
Modérateur
Modzilla
Posté le 16-03-2016 à 14:48:30  profilanswer
 

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

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

  Convertir fichier PDF en fichier txt

 

Sujets relatifs
[C / C#] Exécuter un fichier C sans le compilerMacro Excel - Importation fichier htm
Modification droit fichier en ligne de commande .bat[Script] Formatter un fichier plat à partir d'une clause copy
[VBA/Excel] Ouverture de Fichier User Friendly[C#] Impression PDF
Convertir une page web en fichier PDF ou DOCConvertir un fichier Excel en PDF
Convertir un fichier HTML en fichier PDF en ligne de commandeConvertir un fichier PDF en texte
Plus de sujets relatifs à : Convertir fichier PDF en fichier txt


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