лаборатория рендера ядра · фаза 0

Рендер docx: наш движок против эталона

98 документов корпуса, 300 страниц. Эталон — LibreOffice 26.8 (PDF → растр 72 dpi). Каждая страница сравнивается по SSIM; страница считается совпавшей при SSIM ≥ 0.95. Цель вехи M0.4 — 60 % совпавших страниц.

Страниц с SSIM ≥ 0.95
20.7 %
62 из 300 · цель M0.4 — 60 %
Средний SSIM страницы
0.708
размытие 1 px, окна 8×8
Строгий SSIM «по чернилам»
0.181
только пиксели текста и линий
Совпало число страниц
85 / 98
документов

Распределение SSIM по страницам

400–0.5
400.5–0.6
530.6–0.7
580.7–0.8
290.8–0.9
180.9–0.95
62≥ 0.95

Документы

Показано: 98. По возрастанию среднего SSIM — сверху то, что чинить в первую очередь.

ДокументСтраниц: наш / эталонСредний SSIM≥ 0.95
docx/poi/stress017.docx1 / 20.3080 из 2
docx/poi/MultipleBodyBug.docx1 / 30.3311 из 3
docx/govdocs1/533917.docx3 / 40.3420 из 4
docx/poi/stress016.docx5 / 50.4250 из 5
docx/govdocs1/404064.docx2 / 20.4390 из 2
docx/govdocs1/426080.docx5 / 70.4490 из 7
docx/poi/stress006.docx5 / 80.4860 из 8
docx/poi/stress015.docx6 / 70.4870 из 7
docx/poi/60329.docx4 / 30.5030 из 4
docx/poi/stress012.docx5 / 40.5260 из 5
docx/govdocs1/216689.docx4 / 30.5320 из 4
docx/govdocs1/265532.docx2 / 20.5540 из 2
docx/govdocs1/313486.docx12 / 120.5552 из 12
docx/govdocs1/795716.docx6 / 50.5680 из 6
docx/govdocs1/280856.docx7 / 60.5810 из 7
docx/poi/stress005.docx4 / 40.5850 из 4
docx/govdocs1/635928.docx4 / 40.6000 из 4
docx/govdocs1/223624.docx12 / 120.6160 из 12
docx/govdocs1/014760.docx7 / 70.6250 из 7
docx/govdocs1/216688.docx5 / 50.6250 из 5
docx/govdocs1/224940.docx4 / 40.6491 из 4
docx/govdocs1/732705.docx1 / 10.6540 из 1
docx/poi/chartex.docx4 / 30.6620 из 4
docx/govdocs1/436784.docx6 / 60.6640 из 6
docx/tika/NullHeader.docx2 / 20.6670 из 2
docx/govdocs1/295148.docx3 / 30.6880 из 3
docx/poi/sample.docx1 / 10.6950 из 1
docx/govdocs1/343986.docx2 / 20.6960 из 2
docx/govdocs1/616486.docx1 / 10.7070 из 1
docx/poi/OPCCompliance_CoreProperties_OnlyOneCorePropertiesPartFAIL.docx1 / 10.7080 из 1
docx/poi/stress010.docx12 / 120.7150 из 12
docx/govdocs1/372437.docx12 / 120.7170 из 12
docx/govdocs1/598938.docx1 / 10.7170 из 1
docx/govdocs1/632014.docx5 / 50.7210 из 5
docx/govdocs1/380433.docx12 / 120.7291 из 12
docx/govdocs1/956803.docx6 / 60.7320 из 6
docx/govdocs1/224363.docx12 / 110.7502 из 12
docx/govdocs1/448024.docx12 / 120.7541 из 12
docx/poi/issue_51265_3.docx1 / 10.7600 из 1
docx/govdocs1/623902.docx1 / 10.7620 из 1
docx/govdocs1/510523.docx1 / 10.7650 из 1
docx/govdocs1/021526.docx1 / 10.7740 из 1
docx/poi/table-alignment.docx1 / 10.7790 из 1
docx/tika/testWORD_endnote_table.docx12 / 120.7900 из 12
docx/govdocs1/619629.docx1 / 10.8010 из 1
docx/govdocs1/595353.docx2 / 20.8081 из 2
docx/poi/60316.docx1 / 10.8250 из 1
docx/govdocs1/435413.docx4 / 40.8291 из 4
docx/govdocs1/420596.docx7 / 70.8382 из 7
docx/poi/WordWithAttachments.docx2 / 20.8440 из 2
docx/poi/bug-paragraph-alignment.docx1 / 10.8740 из 1
docx/poi/stress001.docx1 / 10.8810 из 1
docx/poi/Bug54849.docx1 / 10.8860 из 1
docx/poi/shapes-with-text.docx1 / 10.9020 из 1
docx/govdocs1/651924.docx1 / 10.9210 из 1
docx/poi/PageSpecificHeadFoot.docx2 / 20.9380 из 2
docx/poi/FancyFoot.docx2 / 20.9451 из 2
docx/poi/HeaderFooterUnicode.docx2 / 20.9461 из 2
docx/poi/52449.docx1 / 10.9501 из 1
docx/poi/issue_51265_1.docx1 / 10.9501 из 1
docx/poi/TestOpenPackageINPUT.docx1 / 10.9551 из 1
docx/poi/ThreeColHead.docx2 / 20.9642 из 2
docx/poi/ThreeColFoot.docx2 / 20.9662 из 2
docx/govdocs1/630008.docx1 / 10.9681 из 1
docx/poi/table_footnotes.docx1 / 10.9691 из 1
docx/poi/Bug54771b.docx1 / 10.9721 из 1
docx/poi/55966.docx1 / 10.9741 из 1
docx/govdocs1/601015.docx1 / 10.9781 из 1
docx/tika/testWPSAttachment.docx1 / 10.9781 из 1
docx/poi/Bug54771a.docx1 / 10.9791 из 1
docx/poi/Bug60337.docx1 / 10.9801 из 1
docx/poi/TestDocument.docx1 / 10.9811 из 1
docx/tika/testWORD_EMFAndAttachments.docx1 / 10.9861 из 1
docx/tika/testExternalRefs.docx1 / 10.9861 из 1
docx/tika/testWORD_override_list_numbering.docx2 / 20.9862 из 2
docx/poi/EmbeddedDocument.docx1 / 10.9881 из 1
docx/poi/Styles.docx1 / 10.9891 из 1
docx/poi/58618.docx1 / 10.9911 из 1
docx/govdocs1/605378.docx2 / 20.9912 из 2
docx/tika/testWORD_boldHyperlink.docx1 / 10.9921 из 1
docx/poi/capitalized.docx1 / 10.9941 из 1
docx/poi/documentProtection_forms_no_password.docx1 / 10.9951 из 1
docx/poi/57312.docx1 / 10.9951 из 1
docx/poi/tika-3388.docx1 / 10.9961 из 1
docx/govdocs1/605377.docx1 / 10.9961 из 1
docx/tika/testComment.docx1 / 10.9971 из 1
docx/tika/testSubdocument.docx1 / 10.9971 из 1
docx/poi/saut_page.docx3 / 30.9973 из 3
docx/poi/FldSimple.docx1 / 10.9981 из 1
docx/poi/hello-world-office-2010-technical-preview-unsigned.docx1 / 10.9981 из 1
docx/poi/hello-world-unsigned.docx1 / 10.9981 из 1
docx/tika/testWORD_1img.docx1 / 10.9981 из 1
docx/tika/testOptionalHyphen.docx1 / 10.9981 из 1
docx/poi/EmptyDocumentWithHeaderFooter.docx1 / 10.9981 из 1
docx/poi/NumberingWithOutOfOrderId.docx1 / 10.9981 из 1
docx/poi/Headers.docx3 / 30.9993 из 3
docx/poi/WithTabs.docx1 / 10.9991 из 1
docx/poi/59378.docx1 / 11.0001 из 1

Формулы (Sheets): свой движок против Excel

Свой движок meridian-calc пересчитывает книги xlsx корпуса заново; результат сравнивается со значениями, которые сохранил Excel. Волатильные формулы (СЛЧИС, ТДАТА…) и ссылки на другие книги берутся из файла.

Совпало с Excel
99.94 %
27492 из 27508 формул
Книг xlsx
151
взято из файла: 1853 формул
Функций в движке
497
свой код, без форка IronCalc
КнигаЯчейкаФормулаНашExcel
clone_sheet.xlsxArkusz1!M6=L6-(-4,3)#VALUE!0.2
clone_sheet.xlsxArkusz1!M7=L7-(-4,3)#VALUE!0.8
clone_sheet.xlsxArkusz1!M8=L8-(-4,3)#VALUE!1.6
clone_sheet.xlsxArkusz1!M9=L9-(-4,3)#VALUE!2.8
clone_sheet.xlsxArkusz1!M10=L10-(-4,3)#VALUE!4.3
clone_sheet.xlsxArkusz1!M11=L11-(-4,3)#VALUE!6.6
clone_sheet.xlsxArkusz1!M12=L12-(-4,3)#VALUE!10.4
clone_sheet.xlsxArkusz1!M13=L13-(-4,3)#VALUE!15.3
clone_sheet.xlsxArkusz1!M14=L14-(-4,3)#VALUE!10.8
clone_sheet.xlsxArkusz1!M15=L15-(-4,3)#VALUE!7.3
clone_sheet.xlsxArkusz1!M16=L16-(-4,3)#VALUE!4.8
clone_sheet.xlsxArkusz1!M17=L17-(-4,3)#VALUE!2.3
clone_sheet.xlsxArkusz1!M18=L18-(-4,3)#VALUE!1.3
clone_sheet.xlsxArkusz1!M19=L19-(-4,3)#VALUE!0.8
clone_sheet.xlsxArkusz1!M20=L20-(-4,3)#VALUE!0.3
clone_sheet.xlsxArkusz1!M21=L21-(-4,3)#VALUE!0.3

Покрытие docx

ВозможностьСостояниеПримечание
Стили абзацев и знаков (docDefaults → basedOn → прямое)естьOOXML §17.7.2, toggle-свойства
Шрифты: метрически совместимые заменыестьLiberation, Carlito; Cambria/Georgia — нет в комплекте
Разрыв строк как в Wordестьтолько после пробела и дефиса; UAX #14 — для CJK и тайского
Интервалы: множитель, точно, минимум; внешний интерлиньяжестьформула vcl, TNR 12 pt = 13,8 pt
Выравнивание, отступы, висячие строкиестьkeepNext / keepLines — нет
Переносы словесть46 языков (форк hypher)
Списки numbering.xmlестьдесятичные, буквы, римские, русские, маркеры, %N, isLgl
Табуляции и заполнителиестьвлево, центр, вправо, по разделителю; за правым отступом
Рамки и заливка абзацачастичнобез линии between между абзацами
Таблицычастичносетка, объединения, рамки, заливка, поля, отступ, перенос строк; без автоподбора ширины
Разделы и колонкичастичновсе типы начала раздела, равные колонки; без балансировки и неравных колонок
Колонтитулы, поля PAGE / NUMPAGESестьпервая / чётная / по умолчанию, наследование
Картинки PNG / JPEG: встроенные и плавающиечастичнобез обтекания текстом; EMF/WMF — нет
Надписи и фигуры (wps, VML)нетследующий шаг — главная причина расхождений на титулах
Сноски и концевые сноскинет
Диаграммы, SmartArt, формулынет
Поля TOC, PAGEREF и прочиечастичнопоказывается сохранённый результат поля
Экспорт PDF/A-2bестьсвой писатель: подмножества шрифтов, слой текста; проверено veraPDF

Методика

Документы — первые 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.