Рендер docx: наш движок против эталона
98 документов корпуса, 300 страниц. Эталон — LibreOffice 26.8 (PDF → растр 72 dpi). Каждая страница сравнивается по SSIM; страница считается совпавшей при SSIM ≥ 0.95. Цель вехи M0.4 — 60 % совпавших страниц.
Распределение SSIM по страницам
Документы
Показано: 98. По возрастанию среднего SSIM — сверху то, что чинить в первую очередь.
Формулы (Sheets): свой движок против Excel
Свой движок meridian-calc пересчитывает книги xlsx корпуса заново; результат сравнивается со значениями, которые сохранил Excel. Волатильные формулы (СЛЧИС, ТДАТА…) и ссылки на другие книги берутся из файла.
| Книга | Ячейка | Формула | Наш | Excel |
|---|---|---|---|---|
| clone_sheet.xlsx | Arkusz1!M6 | =L6-(-4,3) | #VALUE! | 0.2 |
| clone_sheet.xlsx | Arkusz1!M7 | =L7-(-4,3) | #VALUE! | 0.8 |
| clone_sheet.xlsx | Arkusz1!M8 | =L8-(-4,3) | #VALUE! | 1.6 |
| clone_sheet.xlsx | Arkusz1!M9 | =L9-(-4,3) | #VALUE! | 2.8 |
| clone_sheet.xlsx | Arkusz1!M10 | =L10-(-4,3) | #VALUE! | 4.3 |
| clone_sheet.xlsx | Arkusz1!M11 | =L11-(-4,3) | #VALUE! | 6.6 |
| clone_sheet.xlsx | Arkusz1!M12 | =L12-(-4,3) | #VALUE! | 10.4 |
| clone_sheet.xlsx | Arkusz1!M13 | =L13-(-4,3) | #VALUE! | 15.3 |
| clone_sheet.xlsx | Arkusz1!M14 | =L14-(-4,3) | #VALUE! | 10.8 |
| clone_sheet.xlsx | Arkusz1!M15 | =L15-(-4,3) | #VALUE! | 7.3 |
| clone_sheet.xlsx | Arkusz1!M16 | =L16-(-4,3) | #VALUE! | 4.8 |
| clone_sheet.xlsx | Arkusz1!M17 | =L17-(-4,3) | #VALUE! | 2.3 |
| clone_sheet.xlsx | Arkusz1!M18 | =L18-(-4,3) | #VALUE! | 1.3 |
| clone_sheet.xlsx | Arkusz1!M19 | =L19-(-4,3) | #VALUE! | 0.8 |
| clone_sheet.xlsx | Arkusz1!M20 | =L20-(-4,3) | #VALUE! | 0.3 |
| clone_sheet.xlsx | Arkusz1!M21 | =L21-(-4,3) | #VALUE! | 0.3 |
Покрытие docx
| Возможность | Состояние |
|---|---|
| Стили абзацев и знаков (docDefaults → basedOn → прямое) | есть |
| Шрифты: метрически совместимые замены | есть |
| Разрыв строк как в Word | есть |
| Интервалы: множитель, точно, минимум; внешний интерлиньяж | есть |
| Выравнивание, отступы, висячие строки | есть |
| Переносы слов | есть |
| Списки numbering.xml | есть |
| Табуляции и заполнители | есть |
| Рамки и заливка абзаца | частично |
| Таблицы | частично |
| Разделы и колонки | частично |
| Колонтитулы, поля PAGE / NUMPAGES | есть |
| Картинки PNG / JPEG: встроенные и плавающие | частично |
| Надписи и фигуры (wps, VML) | нет |
| Сноски и концевые сноски | нет |
| Диаграммы, SmartArt, формулы | нет |
| Поля TOC, PAGEREF и прочие | частично |
| Экспорт PDF/A-2b | есть |
Методика
Документы — первые 100 docx корпуса по детерминированному выбору (GovDocs1 — общественное достояние; тестовые файлы Apache POI и Tika — Apache-2.0). Эталон строит LibreOffice 26.8 без интерфейса: docx → PDF → растр 72 dpi (pdftoppm). Наш рендер — тот же конвейер ядра, что в оболочке: чтение docx → вёрстка в целых EMU → свой растр. До 12 страниц на документ.
SSIM считается на сером изображении после размытия 1 px (окна 8×8, шаг 4): так сдвиг глифа на субпиксель не наказывается, а сдвиг строки — наказывается. Строгий SSIM «по чернилам» берёт только окна с текстом и линиями. «Разница» — карта расхождений: чем темнее, тем сильнее отличие.
Известное систематическое отличие: при интервале «множитель» LibreOffice кладёт добавку под строку, Word — над строкой; ядро следует Word, поэтому к эталону LibreOffice остаётся сдвиг 1–3 px. Для цели M0.4 нужны эталоны из Word.