Когда просят «проверку тома ИОС1.1 / ЭОМ», «сверку проверок» или просит внести замечания в существующую docx-таблицу сверки (шаблон вида «ВОПРОС | МАСТЕРМАЙНД | …»). Это финальный формат результата — не заменяется markdown-отчётом.
Формат, который принимается как результат проверки тома — не markdown-отчёт, а docx-таблица сверки: «ВОПРОС | МАСТЕРМАЙНД | AI_Lab_SCRUM Co | РАСХОЖДЕНИЯ».
RGBColor(0xC0, 0, 0) в python-docx; в исходных файлах встречается FF0000).Скрипт: scripts/build_review_docx.py.
copy.deepcopy(cell._tc)
cell._tc.addnext(...)) — в шапке и в каждой строке.copy.deepcopy(t.rows[1]._tr) + t._tbl.append(...)), затем заполнять ячейки 0..3.w:gridCol в w:tblGrid под новую колонку. Без этого table.columns показывает 4, ячейки читаются, но Word рисует таблицу с ломаными ширинами — внешний дефект, который видно сразу. После — задать cell.width.len(d.paragraphs) до и после.cell.text = "" + p.add_run(text) с font.size = Pt(9); просто cell.text = ... теряет формат и даёт огромный шрифт.Требование: на итоговой ведомости — логотип и колонтитул AI_Lab_SCRUM_Co сверху и снизу. Логотип — logo AI Lab SCRUM ENGINEERING, присылается пользователем как PNG с прозрачным фоном и БЕЛЫМ текстом (проверка: РГБА + getchannel("A"), у белой части нейтральные каналы).
На белой бумаге белый текст исчезает — нейтральные (белые/серые) пиксели нужно перекрасить в тёмный, не трогая оранжевый градиент:
if a == 0: continue
if abs(r-g) < 28 and abs(g-b) < 28 and abs(r-b) < 28: # нейтральный (белый текст)
po[x,y] = (0x1F, 0x24, 0x2B, a) # тёмный, альфу сохранить
else:
po[x,y] = (r, g, b, a) # оранжевый — как есть
Затем crop(alpha.getbbox()) и ресайз до ~900 px по ширине. Результат проверять на белом фоне (Image.alpha_composite с белым) — белых ореолов быть не должно, оранжевый градиент сохраняется.
sec.header, is_linked_to_previous = False, run.add_picture(path, width=Cm(3.6)). В теле при этом картинок оставаться не должно.page_width 42 см), поэтому таб на 17 см не работает — текст встаёт по центру. Стоп считать от фактической области: Emu(sec.page_width - sec.left_margin - sec.right_margin). Проверять по PDF не по блокам, а по спанам (get_text("dict") → lines[].spans[]), блоки дают всю ширину и создают ложное впечатление смещения.paragraph_format.tab_stops.clear_all() перед добавлением своего стопа — в шаблоне.w:pBdr (bottom у хедера, top у футера), цветом E06000.doc.SaveAs(path, FileFormat=17)) и просмотр страниц; полезно проверить и первую, и последнюю страницу.Пройтись по всем строкам и собрать множество колонок, где есть красные run'ы:
red_cols = set()
for ci, cell in enumerate(row.cells):
for para in cell.paragraphs:
for r in para.runs:
if r.font.color and r.font.color.rgb and str(r.font.color.rgb) == "C00000" and r.text.strip():
red_cols.add(ci)
Ожидание: в старых строках красные — колонки 2 и/или 3; в новых — 0, 2, 3. Если в старой строке нет ни одного красного — там просто нет расхождений («—»).