Pesquisa de conteúdo em pdf com o powershell e saída de uma lista de arquivos

1

Veja o que estou tentando fazer:

Eu tenho uma enorme confusão de arquivos (cerca de dez mil) de vários formatos. Cada arquivo pode ser definido como um determinado tipo (ex: folha de produto, plano de negócios, oferta, apresentação, etc). Os arquivos não estão em ordem particular e podem ser vistos como uma única lista. Estou interessado em criar um catálogo por tipo.

A ideia é que, para um determinado formato e um certo tipo, eu saiba quais palavras-chave procurar no conteúdo do arquivo. Eu gostaria de ter um script powershell que basicamente executa uma série de scripts procurando por todos os arquivos de um determinado formato contendo palavras-chave específicas e enviando cada lista para um csv separado. O ponto crucial aqui é que a palavra-chave estará no conteúdo (corpo de um pdf, célula de um excel etc.) e não no nome do arquivo. A partir de agora eu tentei o seguinte:

get-childitem -Recurse | where {!$_.PSIsContainer} |
select-object FullName, LastWriteTime, Length, Extension | export-csv -notypeinformation -delimiter '|' -path C:\Users\Uzer\Documents\file.csv  -encoding default

Isso é legal e me fornece a lista completa de arquivos, incluindo seu tamanho e extensão. Estou procurando algo semelhante, mas filtrando por conteúdo. Alguma idéia?

Editar: com base na solução abaixo dela, o novo código:

$searchstring = "foo"
$directory = Get-ChildItem -include ('*.pdf') -Path "C:\Users\Uzer\Searchfolder" -Recurse

foreach ($obj in $directory)
{Get-Content $obj.fullname | Where-Object {$_.Contains($searchstring)}| select-object FullName, LastWriteTime, Length, Extension | export-csv -notypeinformation -delimiter '|' -path C:\Users\Uzer\Documents\file2.csv  -encoding default}

No entanto, recebo muitos desses erros:

 An object at the specified path C:[blabla]\filename.pdf does not exist, or has been filtered by the -Include or -Exclude parameter.
    
por S. L. 19.12.2017 / 15:58

3 respostas

2

Powershell usando o itextsharp.dll . O abaixo avalia o texto em cada página de cada pdf para palavras-chave e, em seguida, exporta quaisquer correspondências para um csv. Você pode rodar com isso para renomear arquivos se encontrar correspondências, movê-las para pastas categorizadas e semelhantes.

Add-Type -Path "C:\path_to_dll\itextsharp.dll"
$pdfs = gci "C:\path_to_pdfs" *.pdf
$export = "C:\path_to_export\export.csv"
$results = @()
$keywords = @('Keyword1','Keyword2','Keyword3')

foreach($pdf in $pdfs) {

    Write-Host "processing -" $pdf.FullName

    # prepare the pdf
    $reader = New-Object iTextSharp.text.pdf.pdfreader -ArgumentList $pdf.FullName

    # for each page
    for($page = 1; $page -le $reader.NumberOfPages; $page++) {

        # set the page text
        $pageText = [iTextSharp.text.pdf.parser.PdfTextExtractor]::GetTextFromPage($reader,$page).Split([char]0x000A)

        # if the page text contains any of the keywords we're evaluating
        foreach($keyword in $keywords) {
            if($pageText -match $keyword) {
                $response = @{
                    keyword = $keyword
                    file = $pdf.FullName
                    page = $page
                }
                $results += New-Object PSObject -Property $response
            }
        }
    }
    $reader.Close()
}

Write-Host ""
Write-Host "done"

$results | epcsv $export -NoTypeInformation

A saída do console:

processing - C:\path_to_pdfs.pdf
processing - C:\path_to_pdfs.pdf
processing - C:\path_to_pdfs.pdf
processing - C:\path_to_pdfs.pdf
processing - C:\path_to_pdfs.pdf

done
PS C:\>

A saída csv:

keyword    page    file
Keyword2   14      C:\path_to_pdfs.pdf
Keyword3   22      C:\path_to_pdfs.pdf
Keyword1   6       C:\path_to_pdfs.pdf
    
por 19.12.2017 / 18:04
1

Se o conteúdo do arquivo PDF estiver indexado na Pesquisa do Windows, você poderá consultar o índice do sistema de arquivos do sistema. Você pode precisar instalar um iFilter para garantir que o Windows PDFs de índice. Mas este método irá trabalhar com pdf, arquivos de texto, arquivos xlsx, etc.

$searchString = "foo"
$searchPath = "C:\Users\Uzer\Searchfolder"
$sql = "SELECT System.ItemPathDisplay, System.DateModified, " +
       "System.Size, System.FileExtension FROM SYSTEMINDEX " +
       "WHERE SCOPE = '$searchPath' AND FREETEXT('$searchstring')"
$provider = "provider=search.collatordso;extended properties=’application=windows’;" 
$connector = new-object system.data.oledb.oledbdataadapter -argument $sql, $provider 
$dataset = new-object system.data.dataset 
if ($connector.fill($dataset)) { $dataset.tables[0] }
    
por 19.12.2017 / 18:25
-1

Você pode usar Get-Content para procurar determinado conteúdo em arquivos.

Exemplo:

$searchstring = "foo"
$directory = Get-ChildItem -Path C:\temp\ -Recurse

foreach ($obj in $directory)
{Get-Content $obj.fullname | Where-Object {$_.Contains($searchstring)} | # do something...}

Use a variável $searchstring para fornecer uma palavra à pesquisa nos arquivos. a variável $directory é o diretório que contém os arquivos que serão pesquisados com a string de pesquisa.

Mais informações sobre o cmdlet Get-Content podem ser encontradas aqui

    
por 19.12.2017 / 16:18