tanshiro | 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... , 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 :
- ### Script de renommages des fichiers PDF en sortie du serveur Autocom ###
- ### Integré par XXXXX ###
- ############### Chargement de la DDL ITextSHarp.dll (sourceforge), des modules Powershell et des variables ################
- ### Chemin de la DLL ITextSHarp ###
- $path_DLL="C:\aaa\script"
- ### Chargement du module PowerShell ###
- [System.Reflection.Assembly]::LoadFrom("$path_DLL\itextsharp.dll" )
- ### Chemin des fichiers PDF ###
- $files="C:\aaa\in"
- ############### Fonction PDFDocumentInformation permettant la lecture des Metadonnees d'un PDF ##############
- function New-PDFDocumentInformation{
- #Lit les propriétés et metadonnées d'un fichier PDF
- #
- # Un fichier pdf contient une table des références (xref),
- # celle-ci est toujours stockée en fin de fichier.
- # Le chargement partiel du document peut donc prendre un certain temps...
- #Dépendance : itextsharp.dll ( v5.0.4)
- # http://sourceforge.net/projects/itextsharp/
- param(
- [ValidateNotNullOrEmpty()]
- [Parameter(Position=0,Mandatory=$true,ValueFromPipeline = $true,ValueFromPipelineByPropertyName= $true)]
- [Alias("PSPath" )]
- #Référence un chemin d'un système de fichiers ou une url : file://, http://, https://
- [String] $Path
- )
- begin {$isForceToReadAll=$False}
- process {
- try
- {
- # Vérifie le type du chemin
- #pour "h:/", "h:\" -> false
- #pour "htoto:/", "http://" -> true
- #pour "htoto:\", "http:\\"-> false
- if (-not [Uri]::IsWellFormedUriString($Path,[UriKind]::Absolute))
- {
- #Transforme le path qui peut être relatif ou
- # contenir une référence à un provider.
- $Path=$ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($Path)
- }
- #Le constructeur gére l'inexistence du fichier.
- $AccessFile = New-object iTextSharp.text.pdf.RandomAccessFileOrArray($Path)
- Write-debug "`tWait load Pdf : $path"
- #Charge partiellement en mémoire un document PDF
- $reader = New-object iTextSharp.text.pdf.PdfReader($AccessFile, $isForceToReadAll)
- Write-debug "Next pdf file"
- # Construit un objet à partir des propriétés du pdf.
- $PDFDocument=New-Object PSObject -Property @{
- FileName=$_.FullName
- NumberOfPages=$reader.NumberOfPages;
- #Pas de méthode Clone sur un dictionnaire générique.
- Info=$(
- $hCopy=@{}
- $reader.Info.GetEnumerator()|
- Foreach {$hCopy.Add($_.Key,$_.Value) }
- $hCopy
- )
- #Le fichier est altéré ?
- Tampered=$reader.Tampered;
- #Only the last version char is returned
- PdfVersion=$reader.PdfVersion;
- #encryption permissions
- Permissions=$reader.Permissions;
- #le fichier peut être complété ?
- Appendable=$reader.Appendable;
- #Metadonnées XMP.
- #conversion [Byte[]] to String
- MetaData=New-Object String(,$Reader.Metadata);
- #Informations sur la page
- PageSize=$reader.GetPageSize(1)
- }
- #Défini le type de l'objet personnalisé
- $PDFDocument.PsObject.TypeNames[0] = "PDFDocumentInfo"
- $PDFDocument
- } catch {
- $PSCmdlet.WriteError(
- (New-Object System.Management.Automation.ErrorRecord(
- $_.Exception,
- "PDFDocumentInfoUriOrPath",
- "InvalidOperation",
- ("{0} : {1}" -f $MyInvocation.Mycommand.Name,$_.Exception.Message))
- )
- )
- }
- finally {
- if ($reader -ne $null)
- { $reader.Close() }
- if ($AccessFile -ne $null)
- { $AccessFile.Close() }
- } #finally
- } #process
- } #New-PDFDocumentInformation
- #New-Alias New-PdfInfo New-PDFDocumentInformation -description "Construit un objet contenant les metadonnées d'un fichier PDF."
- ###### MAin #########
- $PDFInfos=gci $files *.pdf -recurse | New-PDFDocumentInformation
- $Nom_fic=$PDFInfos|Select @{n="Title";e={$_.info.Title}}|Out-GridView
- # Trop bien, ici j'arrive a récupérer les titres contenu dans les metadonnées .... mais comment faire pour renommer mes fichiers ?!
- # Alors là, c'est ici que commence la merde ... et surtout, ça fait pas du tout ce que je veux...
- #foreach ($Fichier in gci $files) {
- # Get-ChildItem -path $files -Filter *.pdf | rename-item -newname { $Nom_fic[$i] }
- # $i=$i+1
- # echo $i
- #}
|
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
|