Сравнить / проверить PDF имя файла и содержание

В настоящее время у нас есть приложение, которое генерирует PDF-документ и автоматически называет его на основе {UniqueID-DocCode-StartDate-StartTime}Все эти данные поступают из БД через наше приложение. Мы получаем одну большую проблему.

  • Содержание PDF и имя файла перепутаны. например

Имя файла: 123456-Doc001-28042017-1415.pdf

Содержание: 987654-Doc002-28042017-1312

Моя проблема заключается в выявлении PDF-файлов, которые не удалось (содержание!= Имя файла) и повторно их запуска.

Имя файла соответствовало бы содержанию с точки зрения присутствия, но содержимое структурировано как буква, поэтому прямое сравнение не сработало бы, а также сильно различалось по длине в зависимости от сложности содержимого.

Итак, мой список пожеланий будет:

  1. Идеально проверять каждый параметр из имени файла. Однако просто возможность проверить UniqueID было бы достаточно.
  2. Способ перемещения ошибочных файлов, их переименования или создания отчета о неудачных файлах в списке.
  3. Запускать как запланированное задание или постоянно из каталога.

Дайте мне знать, если вам нужна какая-то конкретная информация, и я смогу донести ее до вас.

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"
Другие вопросы по тегам