Utilice PowerShell para extraer cadenas de un formulario PDF y enviarlas a un archivo

Utilice PowerShell para extraer cadenas de un formulario PDF y enviarlas a un archivo

Tengo este código mediante el cual el objetivo es encontrar todos los archivos PDF dentro de una carpeta que hayan sido modificados dentro de x días (según la entrada del usuario).

[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

Hay dos mejoras que me gustaría hacer.

  1. Cada uno de esos archivos PDF es en realidad un formulario, y en la parte inferior de ese formulario hay una serie de números que identifican dónde debe ir ese formulario. Sé que necesito usar itextsharp.dll para analizar el archivo PDF; Me gustaría incluir en el archivo de salida después de "Nombre de archivo" un encabezado "Destino" e incluir esa cadena del formulario PDF.

  2. En la ventana inicial de VB-Input, pregunta cuántos días antes debe buscar el script. Me gustaría agregar una segunda entrada que solicite cualquier parámetro de búsqueda para el título, de modo que si el usuario ingresa, digamos, "recibo", el script encuentra cualquier archivo tituladorecibo.pdf (comodines a ambos lados, por lo que se encontraría laptop-receipt-2015-11-17.pdf).

¡Cualquier ayuda muy apreciada!

Respuesta1

No veo mucho esfuerzo en realizar tus planes.

  • Como Get-ChildItem no proporciona una propiedad, Destinationdebe agregarla usted mismo con una propiedad calculada.
  • guarde los resultados de gci en una variable e itere para ejecutarsucódigo para obtener el destino en cada archivo.
  • modifique la tabla hash $headers para adaptarla a sus necesidades (la etiqueta/expresión puede abreviarse)

No hay tiempo para desarrollar el código crucial itextsharp.dll para usted.

## 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

información relacionada