我们目前有一个应用程序可以生成 pdf 文档并根据 自动命名{UniqueID-DocCode-StartDate-StartTime}
,所有这些数据都通过我们的应用程序从数据库获取。我们遇到了一个主要问题。
- pdf 内容和文件名混淆了。例如
文件名:123456-Doc001-28042017-1415.pdf
内容:987654-Doc002-28042017-1312
我的问题是识别失败的 pdf(内容!=文件名)并重新触发它们。
文件名在存在性方面与内容相匹配,但内容的结构为字母,因此直接比较不起作用,而且它们的长度会根据内容的复杂程度而有很大差异。
因此,我的愿望清单是:
- 理想情况下,检查文件名中的每个参数。但是,只要能够检查
UniqueID
就足够了。 - 移动失败文件、重命名失败文件或在列表中报告失败文件的方法。
- 作为计划作业运行或从目录持续运行。
如果您需要任何特定信息,请告诉我,我应该能够提供给您。
答案1
使用下面的 powershell 脚本,它将 pdf 转换为存储在文件中的文本,然后将其用于与文件名进行比较。文件名使用分隔符进行拆分,然后告知要使用哪个拆分进行比较。这将针对目录中以 .pdf 结尾的每个文件运行。它将提供不匹配的文件temp.txt
列表。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"