116 lines
3.8 KiB
PowerShell
116 lines
3.8 KiB
PowerShell
param(
|
|
[string]$Output = "extractions_pdf_indexed_global",
|
|
[switch]$Fresh,
|
|
[switch]$IncludeRootPdfs,
|
|
[int]$Limit = 0,
|
|
[string]$PdfToText = "$env:LOCALAPPDATA\Microsoft\WinGet\Packages\oschwartz10612.Poppler_Microsoft.Winget.Source_8wekyb3d8bbwe\poppler-25.07.0\Library\bin\pdftotext.exe",
|
|
[string]$PdfInfo = "$env:LOCALAPPDATA\Microsoft\WinGet\Packages\oschwartz10612.Poppler_Microsoft.Winget.Source_8wekyb3d8bbwe\poppler-25.07.0\Library\bin\pdfinfo.exe"
|
|
)
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
|
|
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
|
|
$programmeDir = Resolve-Path (Join-Path $scriptDir "..")
|
|
$outputDir = Join-Path $programmeDir $Output
|
|
|
|
if ($Fresh -and (Test-Path $outputDir)) {
|
|
$resolvedOutput = Resolve-Path $outputDir
|
|
if (-not ($resolvedOutput.Path.StartsWith($programmeDir.Path))) {
|
|
throw "Refus de supprimer hors Programme: $resolvedOutput"
|
|
}
|
|
Remove-Item -LiteralPath $resolvedOutput.Path -Recurse -Force
|
|
}
|
|
|
|
New-Item -ItemType Directory -Force -Path $outputDir | Out-Null
|
|
|
|
$pdfs = @()
|
|
$pdfs += Get-ChildItem -LiteralPath (Join-Path $programmeDir "Cycle 3") -Recurse -Filter "*.pdf" -File -ErrorAction SilentlyContinue
|
|
$pdfs += Get-ChildItem -LiteralPath (Join-Path $programmeDir "Cycle 4") -Recurse -Filter "*.pdf" -File -ErrorAction SilentlyContinue
|
|
if ($IncludeRootPdfs) {
|
|
$pdfs += Get-ChildItem -LiteralPath $programmeDir -Filter "*.pdf" -File -ErrorAction SilentlyContinue
|
|
}
|
|
|
|
$pdfs = $pdfs | Sort-Object FullName
|
|
if ($Limit -gt 0) {
|
|
$pdfs = $pdfs | Select-Object -First $Limit
|
|
}
|
|
|
|
$count = @($pdfs).Count
|
|
$width = [Math]::Max(3, "$count".Length)
|
|
$rows = New-Object System.Collections.Generic.List[object]
|
|
|
|
function Invoke-ExternalToFile {
|
|
param(
|
|
[string]$Exe,
|
|
[string[]]$Arguments,
|
|
[string]$OutputFile
|
|
)
|
|
|
|
$quotedExe = '"' + $Exe + '"'
|
|
$quotedArgs = ($Arguments | ForEach-Object { '"' + ($_ -replace '"', '\"') + '"' }) -join " "
|
|
$quotedOutput = '"' + $OutputFile + '"'
|
|
$command = "$quotedExe $quotedArgs > $quotedOutput 2>&1"
|
|
& cmd.exe /d /c $command
|
|
return $LASTEXITCODE
|
|
}
|
|
|
|
for ($i = 0; $i -lt $count; $i++) {
|
|
$pdf = $pdfs[$i]
|
|
$id = ($i + 1).ToString().PadLeft($width, "0")
|
|
$relativePath = $pdf.FullName.Substring($programmeDir.Path.Length + 1)
|
|
$textFile = "$id.txt"
|
|
$infoFile = "$id.pdfinfo.txt"
|
|
$textPath = Join-Path $outputDir $textFile
|
|
$infoPath = Join-Path $outputDir $infoFile
|
|
|
|
Write-Host "[$id/$count] $relativePath"
|
|
|
|
$status = "ok"
|
|
$notes = New-Object System.Collections.Generic.List[string]
|
|
|
|
try {
|
|
$exitCode = Invoke-ExternalToFile -Exe $PdfInfo -Arguments @($pdf.FullName) -OutputFile $infoPath
|
|
if ($exitCode -ne 0) {
|
|
$status = "error"
|
|
$notes.Add("pdfinfo exit code $exitCode")
|
|
}
|
|
} catch {
|
|
$status = "error"
|
|
$notes.Add("pdfinfo: $($_.Exception.Message)")
|
|
}
|
|
|
|
try {
|
|
$exitCode = Invoke-ExternalToFile -Exe $PdfToText -Arguments @("-layout", $pdf.FullName, "-") -OutputFile $textPath
|
|
if ($exitCode -ne 0) {
|
|
$status = "error"
|
|
$notes.Add("pdftotext exit code $exitCode")
|
|
}
|
|
} catch {
|
|
$status = "error"
|
|
$notes.Add("pdftotext: $($_.Exception.Message)")
|
|
}
|
|
|
|
$rows.Add([pscustomobject]@{
|
|
Id = $id
|
|
RelativePath = $relativePath
|
|
TextFile = $textFile
|
|
InfoFile = $infoFile
|
|
SHA256 = (Get-FileHash -Algorithm SHA256 -LiteralPath $pdf.FullName).Hash
|
|
SizeBytes = $pdf.Length
|
|
Status = $status
|
|
Notes = ($notes -join " | ")
|
|
})
|
|
}
|
|
|
|
$manifestPath = Join-Path $outputDir "manifest.csv"
|
|
$rows | Export-Csv -Path $manifestPath -NoTypeInformation -Encoding UTF8
|
|
|
|
$errors = @($rows | Where-Object { $_.Status -ne "ok" }).Count
|
|
Write-Host "PDF indexés: $count"
|
|
Write-Host "Erreurs: $errors"
|
|
Write-Host "Dossier: $outputDir"
|
|
|
|
if ($errors -gt 0) {
|
|
exit 1
|
|
}
|