![使用PowerShell从PDF表单中提取字符串并输出到文件](https://linux22.com/image/1585813/%E4%BD%BF%E7%94%A8PowerShell%E4%BB%8EPDF%E8%A1%A8%E5%8D%95%E4%B8%AD%E6%8F%90%E5%8F%96%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%B9%B6%E8%BE%93%E5%87%BA%E5%88%B0%E6%96%87%E4%BB%B6.png)
我有此代码,其目的是查找文件夹内 x 天内修改过的所有 PDF 文件(由用户输入)。
[void][Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')
$title = 'PDF Last Modified'
$msg = 'Days prior:'
$text = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)
$headers = @{Expression={$_.CreationTime};Label="File Created";width=25}, `
@{Expression={$_.LastWriteTime};Label="File Edited";width=25}, `
@{Expression={"{0}" -f $_.FullName.Split("\")[-2]};Label="Folder";width=30}, `
@{Expression={$_.Name};Label="File Name";width=50}
Get-ChildItem -Path ..\ -Recurse -Filter *.pdf | Where-Object {$_.lastwritetime -gt (Get-Date).AddDays(-$text)} | sort LastWriteTime -descending | format-table $headers | out-file PDFOutput-$(get-date -f yyyy-MM-dd).txt -width 300
我想做两点改进。
每个 PDF 文件实际上都是一个表格,表格底部是一串数字,用于标识该表格需要存放到哪里。我知道我需要使用 itextsharp.dll 来解析 PDF 文件;我想在输出文件的“文件名”后面包含一个标题“目标”,并包含 PDF 表格中的该字符串。
在初始 VB 输入窗口中,它会询问脚本应搜索多少天前的内容。我想添加第二个输入,询问标题的任何搜索参数,因此如果用户输入“收据”,脚本会找到任何标题为收据.pdf(两边都有通配符,因此它会找到 laptop-receipt-2015-11-17.pdf)。
任何帮助都非常感谢!
答案1
我看不出你为实现你的计划付出了多少努力。
- 由于 Get-ChildItem 没有提供属性,因此
Destination
您必须使用计算属性自行添加它。 - 将 gci 结果保存在变量中并迭代运行你的代码来获取每个文件的目标。
- 修改 $headers 哈希表以满足您的需要(标签/表达式可以缩写)
没有时间为您开发关键的 itextsharp.dll 代码。
## Q:\Test\2019\03\23\SU_1416552.ps1
$Folder = (Get-Item ..).FullName
[void][Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')
$title = 'PDF Last Modified'
$msg = 'Days prior:'
$DaysPrior = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)
$title = 'PDF Name Part'
$msg = 'String:'
$Namepart = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)
$PdfFiles = Get-ChildItem (Join-Path $Folder ("*{0}*" -f $NamePart)) -Recurse -File -Filter *.pdf|
Where-Object LastWriteTime -gt (Get-Date).AddDays(-$DaysPrior) |
Sort-Object LastWriteTime -descending |
Select-Object -Property FullName,Name,CreationTime,LastWriteTime,
@{L='Destination';E={$Null}}
foreach ($PdfFile in $PdfFiles){
##
## Insert **your** code to get FormField Destination
##
$PdfFile.Destination = "string of numbers"
}
$headers = @{L="File Created";width=25;E={$_.CreationTime}},
@{L="File Edited" ;width=25;E={$_.LastWriteTime}},
@{L="Folder" ;width=30;E={$_.FullName.Split("\")[-2]}},
@{L="File Name" ;width=50;E={$_.Name}},
@{L="Destination" ;width=30;E={$_.Destination}}
$PdfFiles | Format-Table $headers |
Out-File PDFOutput-$(get-date -f yyyy-MM-dd).txt -width 300