Рендер docx: наш движок против эталона
98 документов корпуса, 295 страниц. Эталон — LibreOffice 26.8 (PDF → растр 72 dpi). Каждая страница сравнивается по SSIM; страница считается совпавшей при SSIM ≥ 0.95. Цель вехи M0.4 — 60 % совпавших страниц.
Распределение SSIM по страницам
Документы
Показано: 98. По возрастанию среднего SSIM — сверху то, что чинить в первую очередь.
Покрытие docx
| Возможность | Состояние |
|---|---|
| Стили абзацев и знаков (docDefaults → basedOn → прямое) | есть |
| Шрифты: метрически совместимые замены | есть |
| Разрыв строк как в Word | есть |
| Интервалы: множитель, точно, минимум; внешний интерлиньяж | есть |
| Выравнивание, отступы, висячие строки | есть |
| Переносы слов | есть |
| Списки numbering.xml | есть |
| Табуляции и заполнители | есть |
| Рамки и заливка абзаца | частично |
| Таблицы | частично |
| Разделы и колонки | частично |
| Колонтитулы, поля PAGE / NUMPAGES | есть |
| Картинки PNG / JPEG: встроенные и плавающие | частично |
| Надписи и фигуры (wps, VML) | нет |
| Сноски и концевые сноски | нет |
| Диаграммы, SmartArt, формулы | нет |
| Поля TOC, PAGEREF и прочие | частично |
| Экспорт PDF/A-2b | есть |
Скорость конвейера
98 документов, 784 страниц, всего 3.3 с; release-сборка, macos aarch64, потоков / threads: 18; один поток на документ / single-threaded. Растр — 96 dpi.
| Этап | Медиана на страницу, мс | 95-й перцентиль, мс | Всего, с |
|---|---|---|---|
| Чтение docx | 0.32 | 0.96 | 0.14 |
| Вёрстка | 0.11 | 0.43 | 0.23 |
| Растр (tiny-skia) | 1.57 | 9.48 | 2.43 |
| PDF/A-2b (krilla) | 0.44 | 1.58 | 0.54 |
Самые долгие документы
| Документ | Страниц | Вёрстка, мс | Растр, мс |
|---|---|---|---|
| docx/govdocs1/313486.docx | 214 | 30.6 | 773.3 |
| docx/govdocs1/448024.docx | 106 | 19.6 | 444.3 |
| docx/tika/testWORD_endnote_table.docx | 21 | 5.9 | 201.4 |
| docx/poi/stress010.docx | 177 | 124.9 | 39.1 |
| docx/govdocs1/223624.docx | 25 | 6.3 | 120.7 |
| docx/govdocs1/372437.docx | 28 | 5.0 | 118.4 |
| docx/govdocs1/380433.docx | 18 | 3.7 | 74.0 |
| docx/govdocs1/635928.docx | 4 | 0.4 | 23.4 |
Методика
Документы — первые 100 docx корпуса по детерминированному выбору (GovDocs1 — общественное достояние; тестовые файлы Apache POI и Tika — Apache-2.0). Эталон строит LibreOffice 26.8 без интерфейса: docx → PDF → растр 72 dpi (pdftoppm). Наш рендер — тот же конвейер ядра, что в оболочке: чтение docx → вёрстка в целых EMU → растр tiny-skia. До 12 страниц на документ.
SSIM считается на сером изображении после размытия 1 px (окна 8×8, шаг 4): так сдвиг глифа на субпиксель не наказывается, а сдвиг строки — наказывается. Строгий SSIM «по чернилам» берёт только окна с текстом и линиями. «Разница» — карта расхождений: чем темнее, тем сильнее отличие.
Известное систематическое отличие: при интервале «множитель» LibreOffice кладёт добавку под строку, Word — над строкой; ядро следует Word, поэтому к эталону LibreOffice остаётся сдвиг 1–3 px. Для цели M0.4 нужны эталоны из Word.