Implement CLI commands for batch extraction and PDF generation

- Added command-line interface using Click for `batch_extractor.py` to handle extraction from ZIP and PDF files.
- Enhanced `save_to_excel` function to create parent directories for output files.
- Updated `build_pdf.py` to include a CLI for generating PDF labels from Excel data.
- Improved README.md with detailed usage instructions for the new CLI commands.
- Added `click` to requirements.txt for command-line functionality.
This commit is contained in:
2026-02-21 13:20:08 +03:00
parent 3f8e6935a8
commit 6850f3672e
5 changed files with 170 additions and 55 deletions

View File

@@ -3,6 +3,7 @@ import zipfile
import tempfile
import pandas as pd
from read_image import read_datamatrix_zxing, extract_barcodes_from_pdf
from pathlib import Path
import click
import render_eps
@@ -59,6 +60,14 @@ def save_to_excel(data: list, output_path: str):
if not data:
print("Нет данных для сохранения в Excel.")
return
# Преобразуем путь в объект Path для удобной работы с файловой системой
path_obj = Path(output_path)
# Создаем родительскую директорию (вместе со всеми промежуточными), если ее нет
# Метод parent возвращает путь к папке, в которой должен лежать файл
# exist_ok=True гарантирует отсутствие ошибки, если папка уже существует
path_obj.parent.mkdir(parents=True, exist_ok=True)
# Формируем DataFrame из списка кортежей
df = pd.DataFrame(data, columns=["Текст", "Base64"])
@@ -68,11 +77,52 @@ def save_to_excel(data: list, output_path: str):
print(f"Данные успешно сохранены в {output_path}")
if __name__ == "__main__":
# Тестовый пример оркестрации:
base_dir = os.path.dirname(os.path.abspath(__file__))
zip_path = "data/0109 черный xxl 720 шт. d46349f7-148a-4301-b6b5-f9a3c70fdf19_begin_offset_2000_number_of_codes_720.zip"
#zip_data = extract_eps_from_zip(zip_path)
@click.group(help="Утилита для массового извлечения DataMatrix кодов и сохранения их в Excel.")
def cli():
"""Основная группа команд для CLI."""
pass
pdf_path = 'data/0109, цвет синий, р.L 10шт_b3ba8577-7874-4dfa-a091-e6953fbe0ca7_gtin_04639970975214_quantity_10.pdf'
pdf_data = extract_dm_from_pdf(pdf_path)
@cli.command(help="Извлекает коды из EPS-файлов внутри ZIP-архива.")
@click.argument('input_zip', type=click.Path(exists=True, dir_okay=False, path_type=Path))
@click.argument('output_xlsx', type=click.Path(dir_okay=False, writable=True, path_type=Path))
def from_zip(input_zip: Path, output_xlsx: Path):
"""
Пакетная обработка ZIP-архива.
INPUT_ZIP: Путь к исходному .zip файлу с EPS-этикетками.
OUTPUT_XLSX: Путь для сохранения результата (например, result.xlsx).
"""
click.echo(f"Начинаю обработку архива: {input_zip.name}")
try:
data = extract_eps_from_zip(str(input_zip))
if data:
save_to_excel(data, str(output_xlsx))
click.secho(f"Успех! Найдено кодов: {len(data)}. Файл сохранен: {output_xlsx.name}", fg="green")
else:
click.secho("Внимание: в архиве не найдено читаемых кодов.", fg="yellow")
except Exception as e:
click.secho(f"Ошибка при обработке ZIP: {e}", fg="red")
@cli.command(help="Извлекает коды со всех страниц PDF-документа.")
@click.argument('input_pdf', type=click.Path(exists=True, dir_okay=False, path_type=Path))
@click.argument('output_xlsx', type=click.Path(dir_okay=False, writable=True, path_type=Path))
def from_pdf(input_pdf: Path, output_xlsx: Path):
"""
Пакетная обработка PDF-документа.
INPUT_PDF: Путь к исходному многостраничному .pdf файлу.
OUTPUT_XLSX: Путь для сохранения результата (например, result.xlsx).
"""
click.echo(f"Начинаю обработку PDF-документа: {input_pdf.name}")
try:
data = extract_dm_from_pdf(str(input_pdf))
if data:
save_to_excel(data, str(output_xlsx))
click.secho(f"Успех! Найдено кодов: {len(data)}. Файл сохранен: {output_xlsx.name}", fg="green")
else:
click.secho("Внимание: в PDF-файле не найдено читаемых кодов.", fg="yellow")
except Exception as e:
click.secho(f"Ошибка при обработке PDF: {e}", fg="red")
if __name__ == "__main__":
cli()