PowerShell анализирует PDF-файл и извлекает несколько строк

Я использую iTextSharp для поиска в PDF-файле ключевого слова и извлечения любых строк, содержащих это ключевое слово. Я бы хотел извлечь не только строки с ключевым словом, но и последующие строки. Строка с ключевым словом и следующая строка, Строка с ключевым словом и следующие 2 строки и т. Д.

Я некоторое время зацикливался на этом, пробовал массивы, хеш-таблицы, итераторы ... ни один из них не работает правильно. Любая помощь приветствуется. Это базовый дизайн, с которым я работал: $ reader = New-Object iTextSharp.text.pdf.pdfreader -ArgumentList anypdf.pdf

for ($page = 1; $page -le $reader.NumberOfPages; $page++) {
    $lines = [char[]]$reader.GetPageContent($page) -join "" -split "`n"

    foreach ($line in $lines) {
        if ($line -match $searchstring) {
            $line = $line -replace "^\[\(|\)\]TJ$", "" -split "\)\-?\d+\.?\d*\(" -join ""    
            $line = $line -replace "\\([\S])", $matches[1]
            Write-host $line
        }
    }
}

Я не могу поверить в логику, которая удаляет нежелательные символы из PDF, и, возможно, поэтому я еще не понял этого. Приведенный выше код дает мне любую строку, содержащую ключевое слово. Проблема, похоже, в том, что PDF-файл разделен на страницы, и эти страницы разбиты на строки (каждая из которых представляет собой массив символов). Было бы хорошо и эффективно, если бы я мог просто создать хеш-таблицу для каждой строки в PDF с самого начала.


person yodish    schedule 03.08.2013    source источник


Ответы (1)


Вот для чего был изобретен Select-String.

for ($page = 1; $page -le $reader.NumberOfPages; $page++) {
  [char[]]$reader.GetPageContent($page) -join "" -split "`n" `
    | Select-String $searchstring -Context 0,2 `
    | % {
        $_ -replace "^\[\(|\)\]TJ$", "" `
           -split "\)\-?\d+\.?\d*\(" -join "" `
           -replace "\\([\S])", $_.Matches.Value
      }
}

Я не совсем понимаю, как вы там делаете разделение, соединение и замену, поэтому вам, возможно, придется это отрегулировать.

Кроме того, приведенное выше не включает контекст after, так как я не знаю, куда вы хотите его поместить. Доступ к нему можно получить через $_.Context.PostContext.

person Ansgar Wiechers    schedule 03.08.2013
comment
спасибо за этот ответ, извините за мое незнание ... но как вы получаете вторую «строчку» в этом коде? Он работает для первого найденного совпадения, но не для второго. - person yodish; 03.08.2013
comment
Вы имеете в виду строки контекста поста? Как это: $_.Context.PostContext. Извините, я забыл включить эту информацию раньше. - person Ansgar Wiechers; 03.08.2013