Автоматизация обработки счетов с помощью PowerShell: разбор PDF, поиск и переименование счетов
В современных бизнес-процессах автоматизация рутинных задач особенно важна для отделов продаж и финансов. В статье рассмотрим пример создания скрипта на PowerShell, который позволяет обрабатывать большое PDF-документ с множеством счетов на оплату, разделять его на отдельные страницы и переименовывать каждую страницу по номеру счета.
Задача: разделение и переименование PDF счетов
В компании имеется система, которая формирует многостраничный PDF-файл, где каждая страница — это один счет на оплату (инвойс). Необходимо:
- Разбить PDF на отдельные страницы.
- Каждую страницу сохранить в отдельный файл.
- Переименовать файл по номеру счета.
Особенности номеров счетов и проблема с ZIP-кодами
В одном из предприятий компании номера счетов состоят из пяти цифр, в остальных — из шести. При этом у некоторых заводов совпадают номера счетов с почтовыми индексами (ZIP-кодами), что усложняет распознавание нужного номера с помощью регулярных выражений (regex).
Из-за этого возникает конфликт: при поиске regex сначала находит ZIP-код, а не номер счета. Такой сценарий может привести к ошибке переименования.
Текущая реализация поиска номера счета в PowerShell
Для поиска номера счета используется регулярное выражение с исключением ZIP-кодов:
powershell
$regexPattern = "((?!11111|22222|33333)\d{5,6})"
if ($documentcontent -match $regexpattern) {
$invoiceNumber = $matches[1]
}
Здесь 11111
, 22222
, 33333
— ZIP-коды заводов, а регулярное выражение ищет 5- или 6-значные цифры, исключая именно эти ZIP-коды.
Однако, если номер счета совпадёт с ZIP-кодом, скрипт будет работать некорректно.
Решение: разделение обработки по длине номера и проверка по ZIP-кодам
Для обхода проблемы автор сделал два отдельных цикла:
- Обрабатываются все счета с шестизначными номерами — здесь можно просто искать число из 6 цифр, так как на документе встречается только одно такое число.
- Для пятизначных номеров добавляется дополнительная проверка: если в документе встречается ZIP-код и номер совпадает с ним, это фиксируется с помощью поиска и подсчёта вхождений для корректного идентифицирования номера счета.
Такая логика позволяет минимизировать ошибки при переименовании.
Основной алгоритм работы скрипта
- Получить список PDF-файлов (каждый — страница с одним счетом)
- Открыть каждый документ через COM-объект Word (для извлечения текста)
- Применить регулярное выражение для поиска номера счета
- Для пятизначных номеров контролировать совпадения с ZIP-кодами, чтобы избежать ошибки
- Закрыть документ, завершить работу с Word
- Переименовать файл в формат
<номер_счета>.pdf
- Переместить файл в целевую папку
Важные моменты и рекомендации
- Рабочая область: В тексте часто встречаются другие 5- и 6-значные числа, помимо номеров счетов. Данный скрипт подходит только при отсутствии таких чисел, иначе необходимо менять логику.
- Структура документов: В документах много фигур и полей с текстом, которые не охватываются поиском, но для текущей задачи это не критично.
- Потенциал улучшений: Можно оптимизировать скрипт, объединить циклы и улучшить логику regex, чтобы получать второй матч с помощью более сложных паттернов.
- Сложность поиска: На данный момент PowerShell
-match
возвращает только первое совпадение; чтобы получить несколько, можно использовать[regex]::matches()
.
Пример полезного фрагмента из скрипта
powershell
$ZIPone = 11111
$ZIPtwo = 22222
$ZIPthree = 33333
$regexPatternFive = "((?!11111|22222|33333)\d{5})"
$regexPatternSix = "(\d{6})"
foreach ($invoice in $invoices) {
$document = $word.Documents.Open($invoice.Fullname)
$documentcontent = $document.content.text
if ($documentcontent -match $regexPatternSix) {
$invoiceNumber = $matches[1]
}
$document.Close()
Rename-Item -Path $invoice.Fullname -NewName "$invoiceNumber.pdf"
Move-Item -Path "$splitPath\$invoiceNumber.pdf" -Destination $Destination
}
Аналогично для 5-значных счетов с дополнительной проверкой ZIP-кодов
Заключение
Автоматизация обработки PDF счетов и их переименование — удобная и важная задача для отделов продаж и финансов. Скрипт на PowerShell с использованием регулярных выражений и COM-объектов Word позволяет упростить эту работу, но требует тщательной настройки паттернов поиска из-за возможных пересечений с другими числами, такими как ZIP-коды.
Для более устойчивой работы можно рассмотреть применение других библиотек, поддерживающих PDF, либо расширить функционал регулярных выражений для точного захвата нужной информации.
Если вы ищете эффективное решение для автоматизации обработки многосоставных PDF с инвойсами — данный подход на PowerShell может стать для вас отправной точкой!