Aujourd'hui je vais vous présenter un besoin que j'ai eu dans un cadre professionnel. Je dois récupérer des métadonnées de fichiers, tous au format PDF, afin de les afficher sur la page web sur laquelle ce propre fichier PDF est téléchargeable. Voyons comment je me suis pris pour réaliser cette prouesse.

Dans un premier temps, j'ai créé un fichier PDF avec un outil de type générateur de PDF. La suite LibreOffice permet notamment de le faire, mais d'autres outils  professionnels comme Adobe PDF  (!) permettent aussi de le faire.
Partons du principe que vous possédez un fichier PDF dont l'intégralité des métadonnées sont remplies.
La première question que je me suis posée et très simple : peut-on rajouter ses propres champs personnalisés dans les métadonnées d'un PDF ?
Pour l'instant, la seule réponse que j'ai trouvée est malheureusement négative. Cependant, j'avoue n'avoir pas trop chercher car mon objectif peut-être largement atteint avec l'ensemble des champs étant déjà à ma disposition dans le format PDF par défaut.

PDF propriete

 
Pour récupérer l'intégralité des métadonnées d'un fichier PDF, j'ai dans un premier temps, ouvert un fichier PDF dont je savais qu'il contenait des métadonnées. J'ai ouvert ce fichier avec un lecteur PDF classique pour vérifier que ces metadatas était bien présents, puis j'ai réouvert ce même fichier dans un simple éditeur de texte.
PDF sous kate
 
Ainsi, voilà comment je m'y suis pris, dans mon code, pour en extraire les métadonnées : j'ai chargé l'intégralité du fichier PDF, grâce à la fonction file en PHP, qui permet de stocker dans une variable globale, au format texte bien entendu.
Dans un deuxième temps, je parcours l'ensemble du fichier stocké dans mon tableau, (car la fonction file stocke le résultat de la lecture du fichier dans un tableau ! ) afin de détecter une chaîne de caractères "xmpmeta". Vous n'aurez donc désormais compris, le format PDF intègre des données au format XMP. Sans vouloir faire un cours exhaustif sur ce type de format, vous retrouverez une documentation sur Wikipédia, ce format intègre ou format XML, des métadonnées propres au fichier PDF. Le format été créé par Adobe en 2001 et intégré à partir de la version 5 d'Acrobat. Or, comme ce format est basé sur XML, forcément en ouvrant un fichier PDF, les données apparaissent "en clair" afin, notamment, de pouvoir être exportées.
Ainsi, en revenant à mon code, je parcour l'ensemble du tableau chargé à partir du texte brut formant mon fichier PDF, à la recherche de la chaîne de caractère XMP méta, ligne à ligne. Si une ligne comporte à la fois la chaîne de caractère XMP méta, ainsi que la chaîne je recherche, commençant toujours par XMP et se terminant de la même manière, il suffit au moyen d'une petite fonction d'extraction, fonction que je vous mets dans le code ci-dessous, extraire le contenu chargé entre les deux balises.
Il ne nous vous reste plus qu'à afficher d'une manière relativement propre, et de la manière que vous souhaitez, les informations que vous venez d'extraire. Dans mon cas elles sont dans des DIV, afin de pouvoir leur appliquer un style CSS, décrit en début de fichier.

<?PHP
$lines = file('Sans titre_1.pdf');

function everythingintags($string, $tagname)
{
$pattern = "#<\s?$tagname\b[^>]>(.?)</$tagname\b[^>]>#s";
preg_match($pattern, $string, $matches);
return $matches[1];
}

foreach ($lines as $line_num => $line) {

if (strpos($line, "xmpmeta") !== false )
{
$a=$line;
}

}

function extractString($string, $start, $end) {
$string = " ".$string;
$ini = strpos($string, $start);
if ($ini == 0) return "";
$ini += strlen($start);
$len = strpos($string, $end, $ini) - $ini;
return substr($string, $ini, $len);
}

$string = filegetcontents('Sans titre_1.pdf');
echo '<div style="width:900px;height:180px;border:2px solid black;box-shadow: 20px 20px 20px lightgreen;font-size:70%;">';
echo '<div style="background-color:yellow;font-weight:bold;width:100%;text-align:center;">Propriétés du fichier</div>';
echo '<div style="width:25%;background-color:#ffe8e9;float:left;">Date de modification : </div><div style="background-color:#ffe8e9;width:100%;">'.date("d M Y, H:m:s",strtotime(extractString($string, '<xmp:ModifyDate>', '</xmp:ModifyDate>')))."</div>";
echo '<div style="width:25%;background-color: #e7f9dd;float:left;">Date de création : </div><div style="background-color: #e7f9dd;width:100%;">'.date("d M Y, H:m:s",strtotime(extractString($string, '<xmp:CreateDate>', '</xmp:CreateDate>')))."</div>";
echo '<div style="width:25%;background-color:#ffe8e9;float:left;">Générateur du PDF : </div><div style="background-color:#ffe8e9;width:100%;">'.extractString($string, '<xmp:CreatorTool>', '</xmp:CreatorTool>')."</div>";
echo '<div style="width:25%;background-color: #e7f9dd;float:left;">Identifiant du PDF : </div><div style="background-color: #e7f9dd;width:100%;">'.extractString($string, '<xmpMM:DocumentID>', '</xmpMM:DocumentID>')."</div>";
echo '<div style="width:25%;background-color:#ffe8e9;float:left;">ID de l\'instance du PDF : </div><div style="background-color:#ffe8e9;width:100%;">'.extractString($string, '<xmpMM:InstanceID>', '</xmpMM:InstanceID>')."</div>";
echo '<div style="width:25%;background-color: #e7f9dd;float:left;">ID de l\'auteur du PDF : </div><div style="background-color: #e7f9dd;width:100%;">'.extractString($string, '<rdf:li>', '</rdf:li>')."</div>";
echo '<div style="width:25%;background-color:#ffe8e9;float:left;">Titre du PDF :</div><div style="background-color:#ffe8e9;width:100%;">'.extractString($string, '<rdf:li xml:lang="x-default">', '</rdf:li>')."</div>";
echo '<div style="width:25%;background-color: #e7f9dd;float:left;">Sujet du PDF : </div><div style="background-color: #e7f9dd;width:100%;">'.extractString($string, '<rdf:Alt><rdf:li xml:lang="x-default">', '</rdf:li></rdf:Alt>')."</div>";
echo '<div style="width:25%;background-color:#ffe8e9;float:left;">Mots cles du PDF : </div><div style="width:100%;background-color:#ffe8e9;">'.extractString($string, '<rdf:Bag><rdf:li>', '</rdf:li></rdf:Bag>')."</div>";

echo '<div style="width:25%;background-color: #e7f9dd;float:left;">Producteur du PDF : </div><div style="background-color: #e7f9dd;width:100%;">'.extractString($string, '<pdf:Producer>', '</pdf:Producer>')."</div>";

echo '<div style="width:25%;background-color:#ffe8e9;float:left;">Date d\'écriture des métadata du PDF : </div><div style="width:100%;background-color:#ffe8e9;">'.date("d M Y, H:m:s",strtotime(extractString($string, '<xmp:MetadataDate>', '</xmp:MetadataDate>')))."</div>";
echo "</div>";
?>

 

Mon Github

slhuilli1's GitHub repositories