[PowerShell] Renommer des fichiers PDF avec leurs métadonnées

Renommer des fichiers PDF avec leurs métadonnées [PowerShell] - Shell/Batch - Programmation

Marsh Posté le 24-06-2011 à 16:57:27    

Bonjour et merci de prendre le temps de lire ce sujet,
 
Je me retrouve à devoir créer un script PowerShell pour ma boite (sachant que je n'en ai jamais fait, ni même de l'objet... :o, je suis admin Unix normalement ) permettant de renommer des fichiers PDF à partir du titre contenu dans les metadonnées du fichier.
 
J'ai trouvé un bon exemple sur le net, se basant sur une dll proposée par sourceforge (itextsharp.dll) :
Mais en tant que bon débutant et admin Unix, je comprends rien à la programmation objet, je ne sais faire que tu procéduriel.
 
Voici la tête de mon code :
 

Code :
  1. ### Script de renommages des fichiers PDF en sortie du serveur Autocom ###
  2. ### Integré par XXXXX ###
  3. ############### Chargement de la DDL ITextSHarp.dll (sourceforge), des modules Powershell et des variables ################
  4. ### Chemin de la DLL ITextSHarp ###
  5. $path_DLL="C:\aaa\script"
  6. ### Chargement du module PowerShell ###
  7. [System.Reflection.Assembly]::LoadFrom("$path_DLL\itextsharp.dll" )
  8. ### Chemin des fichiers PDF ###
  9. $files="C:\aaa\in"
  10. ############### Fonction PDFDocumentInformation permettant la lecture des Metadonnees d'un PDF ##############
  11. function New-PDFDocumentInformation{
  12. #Lit les propriétés et metadonnées d'un fichier PDF
  13. #
  14. # Un fichier pdf contient une table des références (xref),
  15. # celle-ci est toujours stockée en fin de fichier.
  16. # Le chargement partiel du document peut donc prendre un certain temps...
  17. #Dépendance : itextsharp.dll ( v5.0.4)
  18. # http://sourceforge.net/projects/itextsharp/
  19. param(
  20.             [ValidateNotNullOrEmpty()] 
  21.             [Parameter(Position=0,Mandatory=$true,ValueFromPipeline = $true,ValueFromPipelineByPropertyName= $true)]
  22.             [Alias("PSPath" )]
  23.           #Référence un chemin d'un système de fichiers ou une url : file://, http://, https:// 
  24.          [String] $Path
  25.        )
  26. begin   {$isForceToReadAll=$False}
  27. process {
  28.    try
  29.    {
  30.      # Vérifie le type du chemin
  31.       #pour "h:/", "h:\" -> false
  32.       #pour "htoto:/", "http://" -> true
  33.       #pour "htoto:\", "http:\\"-> false
  34.     if (-not [Uri]::IsWellFormedUriString($Path,[UriKind]::Absolute))
  35.     {
  36.          #Transforme le path qui peut être relatif ou
  37.          # contenir une référence à un provider.
  38.        $Path=$ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($Path)
  39.     }
  40.     #Le constructeur gére l'inexistence du fichier.   
  41.    $AccessFile = New-object iTextSharp.text.pdf.RandomAccessFileOrArray($Path)
  42.      Write-debug "`tWait load Pdf : $path"
  43.     #Charge partiellement en mémoire un document PDF
  44.    $reader = New-object iTextSharp.text.pdf.PdfReader($AccessFile, $isForceToReadAll)
  45.      Write-debug "Next pdf file"
  46.      # Construit un objet à partir des propriétés du pdf.
  47.   $PDFDocument=New-Object PSObject -Property @{
  48.                       FileName=$_.FullName
  49.                       NumberOfPages=$reader.NumberOfPages;
  50.                        #Pas de méthode Clone sur un dictionnaire générique.
  51.                       Info=$(
  52.                               $hCopy=@{}
  53.                               $reader.Info.GetEnumerator()|
  54.                                Foreach {$hCopy.Add($_.Key,$_.Value) }
  55.                               $hCopy
  56.                             )
  57.                        #Le fichier est altéré ?
  58.                       Tampered=$reader.Tampered;
  59.                        #Only the last version char is returned
  60.                       PdfVersion=$reader.PdfVersion;
  61.                        #encryption permissions
  62.                       Permissions=$reader.Permissions;
  63.                        #le fichier peut être complété ?
  64.                       Appendable=$reader.Appendable;
  65.                        #Metadonnées XMP.
  66.                        #conversion [Byte[]] to String
  67.                       MetaData=New-Object String(,$Reader.Metadata);
  68.                        #Informations sur la page
  69.                       PageSize=$reader.GetPageSize(1)
  70.                     }
  71.    #Défini le type de l'objet personnalisé
  72.   $PDFDocument.PsObject.TypeNames[0] = "PDFDocumentInfo"
  73.   $PDFDocument 
  74.   } catch {
  75.      $PSCmdlet.WriteError(
  76.                   (New-Object System.Management.Automation.ErrorRecord(
  77.                                 $_.Exception,
  78.                        "PDFDocumentInfoUriOrPath",
  79.                        "InvalidOperation",
  80.                        ("{0} : {1}" -f $MyInvocation.Mycommand.Name,$_.Exception.Message))
  81.                      ) 
  82.                   )
  83.   }
  84.   finally {
  85.    if ($reader -ne $null)
  86.     { $reader.Close() }
  87.    if ($AccessFile -ne $null)
  88.     { $AccessFile.Close() }
  89.   } #finally
  90. } #process
  91. } #New-PDFDocumentInformation
  92. #New-Alias New-PdfInfo New-PDFDocumentInformation -description "Construit un objet contenant les metadonnées d'un fichier PDF."
  93. ###### MAin #########
  94. $PDFInfos=gci $files *.pdf -recurse | New-PDFDocumentInformation
  95. $Nom_fic=$PDFInfos|Select @{n="Title";e={$_.info.Title}}|Out-GridView
  96. # Trop bien, ici j'arrive a récupérer les titres contenu dans les metadonnées .... mais comment faire pour renommer mes fichiers ?!
  97. # Alors là, c'est ici que commence la merde ... et surtout, ça fait pas du tout ce que je veux...
  98. #foreach ($Fichier in gci $files) {
  99. #    Get-ChildItem -path $files -Filter *.pdf | rename-item -newname { $Nom_fic[$i]  }
  100. #    $i=$i+1
  101. #    echo $i
  102. #}


 
Une âme charitable peut-elle m'expliquer comment utiliser l'objet instancié, nommé PDFInfos et surtout, comment s'en servir pour renommer tous mes fichiers qui sont dans C:\aaa\in, puis les déplacer dans C:\aaa\out ?
 
 
Merci à toi qui a pris la peine d'arriver en bas de mon post.


Message édité par tanshiro le 24-06-2011 à 16:58:58
Reply

Marsh Posté le 24-06-2011 à 16:57:27   

Reply

Marsh Posté le 27-06-2011 à 11:58:21    

Petit up,
 
Personne de meilleur que moi en PowaCoquillage ?  :sweat:

Reply

Marsh Posté le 29-06-2011 à 15:43:14    

Le up du dernier espoir, avant que le topic ne sombre dans les basfond de HFR  :(

Reply

Marsh Posté le 29-06-2011 à 16:06:34    

Je peux pas répondre à ta question spécifique, mais je peux te dire qu'en Perl, ça peut se faire (lecture/écriture des tags XMP) au moyen du module Image::ExifTool (et ses nombreux sous modules)
Les tags concernés sont indiqués ici: http://search.cpan.org/~exiftool/I [...] gNames.pod
Notes que je n'ai jamais jusqu’à maintenant utilisé ce module, donc je ne peux trop te donner d'indications, mais au vu de la doc, ça passe par des appels à SetNewValue.  
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

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