Cherche une chaîne ds un fichier .PDF

Cherche une chaîne ds un fichier .PDF - Delphi/Pascal - Programmation

Marsh Posté le 04-10-2004 à 15:28:17    

Soit un fichier Acrobat, donc à textension .PDF . Je le charge en mémoire, et je lance AnsiPos() à la recherche d'une chaine - de type string, pas un tableau de caractères : j'aurais peut-être dû.
 
UltaEdit me trouve, et encore pas toujours, cette chaîne.  
 
Je cherche :heink: C'est peut-être pas AnsiPos() :??: Dois-je passer par un tableau de caractères ?  
 
Merci ;)

Reply

Marsh Posté le 04-10-2004 à 15:28:17   

Reply

Marsh Posté le 04-10-2004 à 15:35:07    

ou bien "Pos" tout court, mais le PDF c'est du binaire, il faut voir comment tu le mets dans la chaîne...


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 04-10-2004 à 15:41:56    

antp a écrit :

ou bien "Pos" tout court, mais le PDF c'est du binaire, il faut voir comment tu le mets dans la chaîne...


Ds mon test, j'écris la chaîne entre '' . Oui, PDF, c'est du binaire. Mais  il doit bien y avoir un moyen de trouver une chaîne de caractères... CTRL +F, à l'intérieur du fichier ouvert avec Acrobat (donc : SOUS Acrobat) trouve effectivement la chaîne. A ts les coups.

Reply

Marsh Posté le 04-10-2004 à 15:46:11    

Ouais mais comme c'est du binaire, il peut contenir des "0", qui pour certaines fonctions indiquent une fin de chaîne (les fonctions qui travaillent avec des pchar).
Donc montre comment tu mets le contenu du fichier dans la chaîne :p
Et qu'est-ce que tu entends par la chaîne entre ' ' ? Si tu rajoutes des guillements ça ne marchera pas...


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 04-10-2004 à 16:34:16    

antp a écrit :

Ouais mais comme c'est du binaire, il peut contenir des "0", qui pour certaines fonctions indiquent une fin de chaîne (les fonctions qui travaillent avec des pchar).
Donc montre comment tu mets le contenu du fichier dans la chaîne :p
Et qu'est-ce que tu entends par la chaîne entre ' ' ? Si tu rajoutes des guillements ça ne marchera pas...


Je charge le contenu du fichier :
        Handle_F := FileOPen(Nom_F, fmOpenRead);
        Nb_Octets_Lus := FileRead(Handle_F, Ptr_Bloc^, Surface_Bloc);
        FileClose(Handle_F);
Surface_Bloc est la taille du buffer, largement suffisante.
 
Recherche de la chaîne :  
        Pos_Ds_F := AnsiPos('Toute personne', Ptr_Bloc);
 
Pos_Ds_F : longint
Ptr_Bloc : PChar pointe sur le buffer
 
Ca vient peut-être dun pointeur. Je me gourre pas mal sur la syntaxe des pointeurs en Pascal :sarcastic:

Reply

Marsh Posté le 04-10-2004 à 16:36:39    

Ça m'a l'air bien compliqué ton truc...
 
var
  s: string;
  p Integer,
  f: TFileStream;
begin
  f := TFileStream.Create(nom_f, fmOpenRead);
  try
    SetLength(s, f.Size);
    f.Read(s[1], f.Size);
  finally
    f.Free;
  end;
  p := Pos('test', s);
  // ...
end.
 
[:spamafote]
 
Et comme je l'ai dit,
 

Citation :


[...] il peut contenir des "0", qui pour certaines fonctions indiquent une fin de chaîne (les fonctions qui travaillent avec des pchar).  


Message édité par antp le 04-10-2004 à 16:38:34

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 04-10-2004 à 16:41:18    

antp a écrit :

Ça m'a l'air bien compliqué ton truc...
 
var
  s: string;
  p Integer,
  f: TFileStream;
begin
  f := TFileStream.Create(nom_f, fmOpenRead);
  try
    SetLength(s, f.Size);
    f.Read(s[1], f.Size);
  finally
    f.Free;
  end;
  p := Pos('test', s);
  // ...
end.
 
[:spamafote]
 
Et comme je l'ai dit,
 

Citation :


[...] il peut contenir des "0", qui pour certaines fonctions indiquent une fin de chaîne (les fonctions qui travaillent avec des pchar).  




Je vais tester ça.  
 
Etrange qu'on ne puisse pas travailler au corps des fichiers PDF (binaires, en règle générale) avec autre chose que TFileStream :??:

Reply

Marsh Posté le 04-10-2004 à 16:53:59    

On peut.
Mais je trouve ça plus pratique avec les TFileStream, pas toi ?
Le problème de ton code c'est que tu utilises des PChar, ça ne passera jamais avec du binaire vu qu'au premier octet à 0 rencontré il s'arrête, croyant que c'est le fin de la chaîne.
Puis les pointeurs et espaces mémoire de "taille suffisante", il faut s'en méfier :D (note que le code posté ci-dessus plantera si le fichier fait plus de 2 GB, ce n'est pas encore parfait, mais de toute façon la RAM de la machine sera remplie avant... il faudrait chercher par blocs plutôt que de tout charger en RAM)


Message édité par antp le 04-10-2004 à 16:54:28

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 04-10-2004 à 16:58:26    

antp a écrit :

On peut.
Mais je trouve ça plus pratique avec les TFileStream, pas toi ?
Le problème de ton code c'est que tu utilises des PChar, ça ne passera jamais avec du binaire vu qu'au premier octet à 0 rencontré il s'arrête, croyant que c'est le fin de la chaîne.
Puis les pointeurs et espaces mémoire de "taille suffisante", il faut s'en méfier :D (note que le code posté ci-dessus plantera si le fichier fait plus de 2 GB, ce n'est pas encore parfait, mais de toute façon la RAM de la machine sera remplie avant... il faudrait chercher par blocs plutôt que de tout charger en RAM)


1/ "Mais je trouve ça plus pratique avec les TFileStream, pas toi ?" : moi, j'aime bien les handle :)
 
2/ Que oui ! J'y pensais pas... PChar() : il cherche travaille en chaîne à \0 terminal. Je vais plaquer un "masque" qui pourrait être un pointeur de type tableau de caractères. Et le ballader sur la longueur du buffer.

Reply

Marsh Posté le 04-10-2004 à 17:00:02    

THandleStream [:ddr555]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 04-10-2004 à 17:00:02   

Reply

Marsh Posté le 04-10-2004 à 17:17:26    

Il me semble que PDF c'est du texte, mais en base64 (portabilité...). Le texte peut et est souvent compressé dedans.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 04-10-2004 à 17:29:44    

HelloWorld a écrit :

Il me semble que PDF c'est du texte, mais en base64 (portabilité...). Le texte peut et est souvent compressé dedans.


Voili, voilou  :p Ca va me faciliter le travail :D

Reply

Marsh Posté le 04-10-2004 à 17:47:08    

Reply

Marsh Posté le 05-10-2004 à 07:35:45    


J'ai vu le soft : soit, avec lui, je "dézippe" un PDF. Mais de là à ce MON prog lise dedans... Or, précisément, c'est le but du jeu.

Reply

Marsh Posté le 05-10-2004 à 11:44:39    

Un PDF est constitué de divers flux, certains d'entre eux stockent le texte et ce texte est généralement zippé. J'ai pas lu en détaisl, mais ce soft, je pense, recherche les flux texte compressés et les décompresse, et ainsi extrait le texte du PDF.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 06-10-2004 à 11:20:43    

HelloWorld a écrit :

Un PDF est constitué de divers flux, certains d'entre eux stockent le texte et ce texte est généralement zippé. J'ai pas lu en détaisl, mais ce soft, je pense, recherche les flux texte compressés et les décompresse, et ainsi extrait le texte du PDF.


Donc, plutôt que stocker des PDF, j'en extraierais le contenu ds un fichier Word ou RTF (aïe ! s'il y a des images !).
 
Pas mal :heink:

Reply

Marsh Posté le 06-10-2004 à 11:39:39    

Attend attend... Tu lis jusqu'au bout ce que j'écris ? Ca fait 2 fois là.
Oubre un PDF avec worpad, tu vas voir plein de blocs obj...endobj Chaque bloc est d'un certain type et comprend une certaine donnée. Certains bloc contiennent en plus stream...endstream, c'est les blocs de texte d'après le doc.

Citation :

10 0 obj
<< /Length 148 /Filter /FlateDecode >>  
stream
H‰TŽ±
A Dû|ŔZ˜Kr»·»­¢~€ùƒCÁÆ-ü}ãy™™½ÓpÊPø´q3HÌzMÆ)¡ha+m„?i8ôŒ¹¯ úLÃù¢¸wÚ K.ŸIàoÚ
ØúƒŽN
]Ym#§
Y
&•ó„ðΆוn$‹kpk‘*\!l)V|-ȯÐWJuú?  
zÖ)M
endstream
endobj


Le texte est zippé.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Sujets relatifs:

Leave a Replay

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