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

제가 만들고 싶은 개선 사항은 두 가지입니다.

  1. 각 PDF 파일은 실제로 양식이며 해당 양식의 맨 아래에는 해당 양식이 어디로 가야 하는지 식별하는 일련의 숫자가 있습니다. PDF 파일을 구문 분석하려면 itextsharp.dll을 사용해야 한다는 것을 알고 있습니다. "파일 이름" 뒤에 헤더 "대상"을 출력 파일에 포함하고 PDF 양식의 해당 문자열을 포함하고 싶습니다.

  2. 초기 VB 입력 창에서는 스크립트가 검색해야 하는 일 수를 묻습니다. 제목에 대한 검색 매개변수를 요청하는 두 번째 입력을 추가하고 싶습니다. 따라서 사용자가 "receipt"라고 입력하면 스크립트는 제목이 다음과 같은 모든 파일을 찾습니다.영수증.pdf(와일드카드가 양쪽에 있으므로 laptop-receipt-2015-11-17.pdf를 찾을 수 있음).

도움을 주시면 감사하겠습니다!

답변1

나는 당신의 계획을 실현하는 데 많은 노력을 기울이지 않습니다.

  • Get-ChildItem은 속성을 제공하지 않으므로 Destination계산된 속성을 사용하여 직접 추가해야 합니다.
  • gci 결과를 변수에 저장하고 반복하여 실행합니다.당신의모든 파일의 대상을 가져오는 코드입니다.
  • 필요에 맞게 $headers 해시 테이블을 수정합니다(Label/Expression은 축약될 수 있음).

중요한 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

관련 정보