Accès aux "Propriétés fichiers" sous windows

Eléphanteau du PHP | 14 Messages

26 déc. 2011, 11:58

Bonjour,

Je souhaite mettre en place un mini moteur de recherche de fichiers sur plusieurs ordinateurs.

Je voulais simplement faire un petit programme qui me permette de naviguer dans les propriétés windows des fichiers (mots-clés, commentaires, titres...).
Malheureusement les fonctions que j'ai trouvé et testé stat(), stream_get_meta_data()...) ne me donnent pas accès à ces infos ni en lecture ni en écriture.

Quelqu'un a-t-il une solution ?

Merci d'avance.

Mammouth du PHP | 2278 Messages

26 déc. 2011, 20:34

Je regarderais pour les images au moins du côté de exif
http://php.net/manual/fr/book.exif.php
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 14 Messages

07 janv. 2012, 00:18

Les fichiers images et notamment la partie exif ne répondent pas à ma question.
En effet les propriétés (auteur, titre, catégorie, mot clef, commentaire...) que je souhaite modifier sont celles attachées au fichier de type bureautique (xls, doc, txt, pdf, odt, ods ...).
Pour se faire j'ai trouvé une dll dsofile.dll qui marche très bien lorsque utilisée sous excel et macro VBA.
Néanmoins même si Excel me permet de répondre à une partie de mes besoins, je dois absolument intégrer cette dll à du code php.
J'ai trouvé des exemples sur Internet (Cf ci-dessous EXEMPLE) mais lorsque je fais tourner mon code, je tombe toujours sur une erreur (Cf ci-dessous ERREUR 1) que je n'arrive pas à corriger.
J'ai l'impression que je n'arrive pas à faire reconnaître ma dll par php.
Voila ce que j'ai déjà fait ou tenté :
* récupération du dsofile.dll + installation
* mise en place de cette dll dans windows/system32
* mise en place de cette dll dans xampp/php/ext + déclaration dans php.ini => (Cf ci-dessous ERREUR 2)
* mise en place dans php_ini de com.allow_dcom=true, com.autoregister_typelib = true, com.autoregister_casesensitive = false, com.autoregister_verbose = true
J'ai essayé aussi de faire via dcomcnfg la configuration du composant service "DSO OLE Document Properties Reader 2.1" mais je ne l'ai pas trouvé ni lui ni la clef.

Je commence à ne plus avoir trop d'idée et le fait que certains codes datent de 2003 et que je ne trouve pas de solution sur le Net m'inquiète un peu.
Alors si vous avez des idées, je suis preneur.


EXEMPLE
=======

Code : Tout sélectionner

<?php // the file you wish to access $fn = '/docs/MFA.xls'; $oFilePropReader = new COM('DSOleFile.PropertyReader'); $props = $oFilePropReader->GetDocumentProperties($fn); // one syntax $au = com_get($props, 'Author'); print "au: $au \n"; //another syntax $str = 'LastEditedBy'; $lsb = $props->$str; var_dump($lsb); // set a property if you wish if (!$props->IsReadOnly()) { $props->Subject = 'tlc'; } ?>
ERREUR 1
========

Code : Tout sélectionner

Fatal error: Uncaught exception 'com_exception' with message 'Failed to create COM object `DSOleFile.PropertyReader': Syntaxe incorrecte ' in D:\DEV\XtraDoc\rechercheDocBD.php:14 Stack trace: #0 D:\DEV\XtraDoc\rechercheDocBD.php(14): com->com('DSOleFile.Prope...') #1 {main} thrown in D:\DEV\XtraDoc\rechercheDocBD.php on line 14

ERREUR 2
========

Code : Tout sélectionner

PHP Warning: PHP Startup: Invalid library (maybe not a PHP library) 'dsofile.dll' in Unknown on line 0

Mammouth du PHP | 2278 Messages

07 janv. 2012, 12:38

Je voulais simplement faire un petit programme qui me permette de naviguer dans les propriétés windows des fichiers (mots-clés, commentaires, titres...).
Si la question avait été moins vague, la réponse aurait été plus précise:
Avec les documents Office, c'est enfantin:
renommage du fichier en .zip, extraction dudit et lecture de meta.xml qui est plus ou moins riche suivant que les propriétés du fichier ont été renseignées ou pas.
minimum automatique:
<?xml version="1.0" encoding="UTF-8"?>
....
<office:meta>
<meta:initial-creator>Billard</meta:initial-creator>
<meta:creation-date>2009-10-18T20:11:51</meta:creation-date>
<meta:document-statistic 
meta:table-count="0" 
meta:image-count="0" 
meta:object-count="0" 
meta:page-count="2" 
meta:paragraph-count="24" 
meta:word-count="1193" 
meta:character-count="7118"/>
<dc:date>2009-10-19T11:05:02</dc:date>
<dc:creator>Billard</dc:creator>
<meta:editing-duration>PT14H53M15S</meta:editing-duration>
<meta:editing-cycles>1</meta:editing-cycles>
<meta:generator>OpenOffice.org/3.0$Unix OpenOffice.org_project/300m15$Build-9379</meta:generator>
</office:meta>
Après travail des propriétés:
<office:meta>
<dc:title>Lettre au proviseur</dc:title>
<dc:subject>un proviseur se couvre</dc:subject>
<meta:keyword>éducation</meta:keyword>
<meta:keyword>sanctions</meta:keyword>
<meta:keyword>etc</meta:keyword>
<dc:description>Le parapluie ouvert</dc:description>
<meta:initial-creator>Billard</meta:initial-creator>
<meta:creation-date>2009-10-18T20:11:51</meta:creation-date>
<dc:creator>Michel Billard</dc:creator>
<dc:date>2012-01-07T11:23:04</dc:date>
<meta:editing-cycles>2</meta:editing-cycles>
<meta:editing-duration>PT14H55M37S</meta:editing-duration><meta:document-statistic meta:table-count="0" meta:image-count="0" meta:object-count="0" meta:page-count="2" meta:paragraph-count="24" meta:word-count="1193" meta:character-count="7119"/>
<meta:generator>OpenOffice.org/3.3$Unix OpenOffice.org_project/330m20$Build-9567</meta:generator>
<meta:user-defined meta:name="Catégorie">sottise</meta:user-defined>
</office:meta>
</office:document-meta>
Il me semble avoir compris que les formats plus récents de Micromou Office peuvent être traités de façon analogue. Mais, refusant l'inféodation, je ne dispose pas des moyens de tester...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 14 Messages

07 janv. 2012, 16:37

Disons que mon projet s'est précisé, notamment au vu des solutions logicielles que je peux découvrir au fur et à mesure.
Aujourd'hui ma solution passe par le fait d'attacher des propriétés (titre, auteur, commentaire, mot clef...) aux fichiers de ma base documentaire en passant par une macro VBA d'Excel. C'est hyper simple et rapide... En 2 secondes on modifie les catégories de centaines de fichiers présents partout sur le disque.

Sur la partie recherche j'utilise le service d'indexation de Windowds qui donne des résultats hyper rapide.

Donc solution simple qui ne nécessite pas de base de données et qui est rapide.
Néanmoins, j'aimerai pouvoir modifier mes propriétés fichiers à partir de php pour pouvoir permettre à l'utilisateur sans Excel sur son poste de faire des modifs de propriétés à la volée.

Voilà j'espère que c'est un peu plus clair.
Malgré tout mon appel COM ne marche toujours pas.

Néanmoins j'ai au moins appris un truc : les doc Office (comme les doc OpenOffice d'ailleurs) sont en fait des zip.

Mammouth du PHP | 2278 Messages

07 janv. 2012, 21:49

L'inconvénient majeur, et à mon sens rédhibitoire, est qu'une telle solution utilise des utilitaires propriétaires, exclusivement Windows, ce qui rend la solution totalementnon portable.
Je suppose qu'en éditant le fichier mata.xml, on peut faire absolument ce qu'on veut, et sans base de données, sans outils propriétaires...

Mais, "Spiritus ubi vult spirat..."
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 14 Messages

09 janv. 2012, 04:00

Certes l'application est windows compatible only.
Certes je suis plutôt Mac ou Linux mais dans mon boulot c'est Windows. Alors le portage ... attendra.

Néanmoins j"ai trouvé une autre solution opérationnelle.
Ne trouvant rien de satisfaisant, j'ai pris mon courage à 2 mains et je viens d'écrire un petit programme exécutable (18Ko)en Visual Basic qui me permet en ligne de commande, donc via PHP de faire mes modifs de propriétés.

NB : J'attends toujours de trouver une solution pour faire marcher mon appel à new COM.

Grenadine
Invité n'ayant pas de compte PHPfrance

20 janv. 2012, 17:50

Bonjour,
j'ai eu le même souci d'appel de l'objet COM,
j'ai trouvé cette solution qui fonctionne :

Code : Tout sélectionner

fn = 'D:/Toto.doc'; try{ $oFilePropReader = new COM('DSOFile.OleDocumentProperties'); }catch (Exception $ex) { echo $ex->getMessage(); } $file = $oFilePropReader->Open($fn); $props = $oFilePropReader->SummaryProperties; print "Author : $props->Author <BR>"; print "ApplicationName : $props->ApplicationName <BR>"; print "ByteCount : $props->ByteCount <BR>"; print "Category : $props->Category <BR>"; print "CharacterCount : $props->CharacterCount <BR>"; print "CharacterCountWithSpaces : $props->CharacterCountWithSpaces <BR>"; print "Comments : $props->Comments <BR>"; print "Company : $props->Company <BR>"; /* Les autres propriétés: ApplicationName Author ByteCount Category CharacterCount CharacterCountWithSpaces Comments Company DateCreated DateLastPrinted DateLastSaved HiddenSlideCount Keywords LastSavedBy LineCount Manager MultimediaClipCount NoteCount PageCount ParagraphCount PresentationFormat RevisionNumber SharedDocument SlideCount Subject Template Title TotalEditTime Version WordCount */