Сравнить / проверить PDF имя файла и содержание
В настоящее время у нас есть приложение, которое генерирует PDF-документ и автоматически называет его на основе {UniqueID-DocCode-StartDate-StartTime}
Все эти данные поступают из БД через наше приложение. Мы получаем одну большую проблему.
- Содержание PDF и имя файла перепутаны. например
Имя файла: 123456-Doc001-28042017-1415.pdf
Содержание: 987654-Doc002-28042017-1312
Моя проблема заключается в выявлении PDF-файлов, которые не удалось (содержание!= Имя файла) и повторно их запуска.
Имя файла соответствовало бы содержанию с точки зрения присутствия, но содержимое структурировано как буква, поэтому прямое сравнение не сработало бы, а также сильно различалось по длине в зависимости от сложности содержимого.
Итак, мой список пожеланий будет:
- Идеально проверять каждый параметр из имени файла. Однако просто возможность проверить
UniqueID
было бы достаточно. - Способ перемещения ошибочных файлов, их переименования или создания отчета о неудачных файлах в списке.
- Запускать как запланированное задание или постоянно из каталога.
Дайте мне знать, если вам нужна какая-то конкретная информация, и я смогу донести ее до вас.
1 ответ
Используя скрипт powershell ниже, он преобразовал PDF в текст, который хранится в temp.txt
файл, который затем используется для сравнения с именем файла. Имя файла разделяется с помощью разделителя, а затем указывается, какой из разделений использовать для сравнения. Это работает для каждого файла в каталоге, где файл заканчивается.pdf. Было бы предоставить список в error.log
файлов, которые не совпадают.
Нам пришлось использовать сторонний.exe для преобразования PDF в текст.
$path = "C:\brokenPDFs\"
$output = $path + "\output.log"
$errorpath = $path + "\error.log"
"Start:" | Out-File $output
"Start:" | Out-File $errorpath
Clear-Content $output
Clear-Content $errorpath
$exe = $path + "pdftotext.exe"
$errorcount = 0
$files = Get-ChildItem $path *.pdf
Foreach ($currentfile In $files)
{
$filename=$currentfile.Name
$splitname = $filename.split("^")
$currentUR = $splitname[0]
#write-host $currentfile.Name
&$exe $currentfile.FullName $path\temp.txt
$result = select-string -Path $path\temp.txt -Pattern $currentUR -Quiet
If ($result -eq $true)
{
$match = $currentfile.FullName
"Match on string : $currentUR in file : $match" | Out-File $output -Append
}
If ($result -eq $false)
{
$match = $currentfile.FullName
"String not found: $currentUR missing from file : $match" | Out-File $errorpath -Append
write-host "ERROR: $currentfile missing $currentUR"
$errorcount++
}
$result = $null
}
write-host "Total Errors: $errorcount"