En attendant le développement d'un plugin pour le CMS Joomla, sûrement à venir dans les semaines voires jours qui viennent, peut-être même aujourd'hui, et ce pour un besoin purement professionnel, j'ai cherché à comprendre comment dans un fichier PDF, était stockées les métadonnées. 
Sans vouloir offenser mes lecteurs, qui eux savent ce qu'est une métadonnées, je reviens rapidement sur la définition de ce terme. En informatique de manière générale mais aussi dans d'autres domaines, une métadonnée va regrouper un ensemble de données relatives non pas au contenu du document, mais à des données liées à son état, sa création, ses auteurs....
 D'après Wikipédia, une métadonnée est une donnée qui sert à définir ou à décrire une autre donnée, quel qu'en soit le support. Un exemple : associer à un fichier une date d'enregistrement ou une date de création, cette donnée n'est pas propre ou contenu du fichier, mais à l'objet fichier lui-même. C'est donc une métadonnée.
 
Dans le cas précis que j'ai à traiter, un fichier PDF permet la possibilité de sauvegarder quelques métadonnées. Parmi elles, on va retrouver :
  • la version du format PDF utilisé au cœur du fichier,
  • la date et l'heure de création du fichier,
  • l'auteur du fichier, 
  • le logiciel ayant généré le fichier PDF,
  • le sujet du fichier PDF,
  • la date et l'heure de dernière modification du fichier
  • un ensemble de termes associés au fichiers, que l'on pourrait associer à des vedettes matières
  • un titre du fichier, ( à ne pas confondre avec le nom du fichier !)
  • le producteur du fichier (noter que le producteur n'est pas l'auteur du fichier mais bien le logiciel ayant généré le fichier PDF)
  • le nombre de pages que le fichier contient
  • le nombre d'images que le fichier contient
  • et enfin le fait de savoir si le fichier est crypté ou non par un mot de passe.*
Noter toutefois, que le nombre d'images contenues dans le fichier n'est pas totalement une métadonnée au sens PDF du terme, mais une information que l'on retrouve tout à la fin du fichier PDF.
 
Je reviens sur ma dernière phrase, lorsque je parle de tout à la fin, il est bien entendu que je n'ai pas ouvert mon fichier PDF avec un lecteur de fichier PDF, mais bien avec un simple éditeur de texte, qui me permet de trouver ces informations. Si vous ouvrez un fichier PDF avec un simple éditeur de texte comme Notepad++ sous Windows ou texte Edit sur Mac, vous vous rendrez compte que des informations sont écrites en clair dans le fichier, et d'autres sont cryptées.
 
9oKTTQZH8v
 
En fait elles ne sont pas traitées en tant que telles, comme c'est un fichier au format binaire, de ce fait, un simple éditeur de texte ne peut pas les interpréter. Il faut un lecteur PDF. Cependant, comme des métadonnées doivent pouvoir être accessibles de l'extérieur du fichier, pour par exemple, être intégré dans un moteur de recherche, il faut bien que ces données soient lisibles. C'est la raison pour laquelle, toutes ces informations apparaissent en clair. Vous pourrez le remarquer en ouvrant un fichier PDF avec un simple éditeur de text (attention avec le bloc note, il y a une limite de taille de mémoire, pour faire cette opération. Préférez Notepad++)
La deuxième étape de mon travail a été de regarder dans ces données en clair, comment ces données sont structurées. Il s'avère que le format PDF est vraiment très bien fichu. Je vous encourage vraiment d'éditer un fichier PDF dans un éditeur de texte pour comprendre comment cela fonctionne. Et à toute première ligne du fichier PDF commençant par le symbole pour cent, permet de spécifier la version du format PDF utilisé.
En continuant et analyse ou plutôt la lecture d'un PDF dans un éditeur de texte, on se rend compte que il y a des caractères "cryptés". Juste avant et juste après ces grandes chaînes de caractère, nous avons la mention stream et endtream. Cette mention permet donc de dire à votre réacteur PDF attention à partir de là il faut interpréter le contenu comme un fichier binaire. Pour le moment j'ignore comment le lecteur PDF reconnaît le format et comment il l'interète (Un format JPG ne s'interpreter pas de la meme façon qu'un PNG). Je subodore qu'au moment de l'enregistrement de votre fichier binaire, comme une image, dans votre fichier PDF, l'utilitaire génère cette information dans un format spécifique imposé par la norme PDF pour pouvoir être lu par tous les lecteurs PDF. A moins que chacun des lecteurs PDF intègrent un "interpréteur" JPG, PNG...
 
J'ai continué visuellement le parcours de mon fichier PDF dans mon éditeur de texte, afin de trouver l'ensemble des chaînes de caractères qui pourrait m'intéresser. Dans ce cadre là, j'ai trouvé une dizaine de chaînes intéressantes. Je vous les détails dans mon code à la fin de cet article.
 
Ensuite, continuons de dérouler mon fichier PDF dans mon éditeur de texte, je suis arrivé sur des informations qui m'intéressent beaucoup plus. Nous trouvons par exemple le format d'encodage des caractères dans le fichier. Une information forte intéressante. 
 
pdf encoding
 
On parcourant le fichier, j'ai trouvé une dizaine de chaînes fortes intéressantes, qui sont pour l'ensemble d'entres elles,  des chaînes liées aux métadonnées, et pour d'autres des caractéristiques spécifiques liés au contenu du fichier PDF. Nous allons par exemple retrouver si le fichier PDF est un fichier crypté, avec une chaîne de caractère de protection, combien le fichier contient d'images, combien le fichier contient de pages, etc...
 
J'ai essayé d'extraire tous ces informations qui peuvent m'intéresser, mais peut-être qu'au cours de mon analyse de mon fichier PDF dans mon éditeur de texte, j'en ai oublier certaines. N'hésitez pas à me le dire !
 
Sans plus attendre, je vous conseille d'aller jeter un œil dans le code, afin de comprendre comment à l'aide d'expressions rationnelles (je suis en plein apprentissage, ca tombait à point), j'ai réussi à extraire les informations qui m'intéressent. Vous noterez que chacune des métadonnées sont formatés de la manière suivante : /tag meta (valeurs). En comme je ne maitrise encore pas les expressions rationnelles, je me suis aidé d'un superbe outil en ligne : regex101.  Attention toutefois, ne collez pas tout le PDF dans Regex101, cela ralentit de manière considérable les traitement. N'utilisez que la partie de code du PDF sur laquelle vous travaillez.
 
D'une manière générale, chacun des tag commence par une barre suivi du nom du tag que nous recherchons, suivi entre parenthèses de la valeur de son contenu. Il apparaît donc logique et super simple d'en extraire les informations à l'aide d'expressions rationnelles de la forme (je bosse en php)  $re = '/Author \((.*)\)/m'; .
 Je ne fais pas de cours ici sur les expressions régulières aussi appelé expressions rationnelles, mais je vous donne quand même le format d'une expression rationnelle que je vais applique à chacun des types de balises que je souhaite extraire :
 Preg_match_all($ma_chaîne, $pdf,$matches,PREG_OFFSET_CAPTURE);
 
L'ensemble des informations extraites à l'aide de cette expression régulière sont stockées dans un tableau, comme vous le voyez, prénommé $matches.
Et voilà, l'extraction des métadonnées et autres données intéressantes d'un fichier PDF se fait simplement à l'aide de ce genre d'expression rationnelle.
En récapitulant (en php, commentaire dans les phylactères):
  1. $nomFichier = 'PDF.pdf';
  2. $pdf = file_get_contents($nomFichier);
  3. $Tpdf = file($nomFichier);
  4. $re = '/Author \((.*)\)/m';
  5. preg_match_all($re, $pdf, $matches, PREG_SET_ORDER, 0);
  6. var_dump($matches);
 Voila, à partir de là, il reste quand même un peu de travail car les données récupérées par le var_dump sont à exploiter comme bon vous semble
Je pense que dans les prochains jours, un petit plugin va venir compléter cette information, ce plugin sera destiné à l'extraction de métadonner de fichier PDF à intégrer au CMS joomia