v0.0.54: В2 фикс кракозябр имён zip (utf-8+валидация→cp866), В1 фильтр таблиц (безопасен, эффект≈0)
Deploy drhider / validate (push) Canceled after 0s
Deploy drhider / validate (push) Canceled after 0s
This commit is contained in:
+33
-5
@@ -123,7 +123,15 @@ def pdf_to_markdown(content: bytes) -> str:
|
||||
lines.append("")
|
||||
|
||||
# ── Таблицы ──
|
||||
tables = page.extract_tables()
|
||||
# Быстрый фильтр: если на странице нет линий/кривых/прямоугольников,
|
||||
# таблиц нет (pdfplumber ищет таблицы только по векторным линиям).
|
||||
# Включая page.rects — таблицы на цветном фоне (заливка).
|
||||
# Пропускаем extract_tables() на «чистых» страницах (скан/текст) — это
|
||||
# основная стоимость на сканах, где линий нет.
|
||||
if page.lines or page.curves or page.rects:
|
||||
tables = page.extract_tables()
|
||||
else:
|
||||
tables = []
|
||||
for table in tables:
|
||||
if not table:
|
||||
continue
|
||||
@@ -260,13 +268,33 @@ def expand_zips(files: List[Tuple[str, bytes, str]]) -> List[Tuple[str, bytes, s
|
||||
"""Декодировать имя из ZIP.
|
||||
|
||||
Если флаг UTF-8 (bit 11) выставлен — имя уже корректное (берём как есть).
|
||||
Иначе zipfile декодировал имя как CP437. Для кириллицы из 1С (CP866)
|
||||
перекодируем CP437→CP866; при неудаче оставляем как есть.
|
||||
Иначе zipfile декодировал имя как CP437. Пытаемся восстановить исходные
|
||||
байты (encode cp437) и декодировать:
|
||||
1) как UTF-8 — если результат в кириллице/ASCII (Info-ZIP/Linux-зипы
|
||||
пишут UTF-8 без флага; случайная коллизия CP866→UTF-8 отсекается
|
||||
проверкой диапазона);
|
||||
2) как CP866 — реальные 1С-выгрузки.
|
||||
"""
|
||||
def _cyr_ok(s: str) -> bool:
|
||||
# Все символы — ASCII или кириллица (U+0400–U+04FF)
|
||||
return all(ord(c) < 128 or 0x0400 <= ord(c) <= 0x04FF for c in s)
|
||||
|
||||
if not (info.flag_bits & 0x800) and any(ord(c) > 127 for c in name):
|
||||
try:
|
||||
return name.encode("cp437").decode("cp866")
|
||||
except (UnicodeDecodeError, UnicodeEncodeError):
|
||||
raw = name.encode("cp437")
|
||||
except UnicodeEncodeError:
|
||||
return name
|
||||
# 1) UTF-8 (Info-ZIP/Linux без флага)
|
||||
try:
|
||||
dec = raw.decode("utf-8")
|
||||
if _cyr_ok(dec):
|
||||
return dec
|
||||
except UnicodeDecodeError:
|
||||
pass
|
||||
# 2) CP866 (1С)
|
||||
try:
|
||||
return raw.decode("cp866")
|
||||
except UnicodeDecodeError:
|
||||
pass
|
||||
return name
|
||||
|
||||
|
||||
Reference in New Issue
Block a user