PowerShell を使用して PDF フォームから文字列を抽出し、ファイルに出力する

PowerShell を使用して PDF フォームから文字列を抽出し、ファイルに出力する

このコードの目的は、フォルダー内で 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

改善したい点が 2 つあります。

  1. これらの PDF ファイルはそれぞれ実際にはフォームであり、そのフォームの下部には、そのフォームを配置する場所を識別する数字の文字列があります。PDF ファイルを解析するには itextsharp.dll を使用する必要があることはわかっています。出力ファイルの「ファイル名」の後にヘッダー「宛先」を含め、PDF フォームからその文字列を含めたいと思います。

  2. 最初のVB入力ウィンドウでは、スクリプトが何日前に検索するかを尋ねられます。タイトルの検索パラメータを尋ねる2番目の入力を追加したいので、ユーザーが「領収書」と入力すると、スクリプトはタイトルが「領収書」であるファイルを検索します。レシート.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

関連情報