[Prestaties][P1] Documentexport (PDF/DOCX/ODT/EPUB) draait op de UI-isolate en bevriest de app #2629

Closed
opened 2026-10-28 16:31:43 +00:00 by brenno · 0 comments
Owner

Symptoom

Een groot document exporteren naar PDF, DOCX, ODT of EPUB laat de app bevriezen tot de export klaar is: geen voortgang, geen annuleren, en het venster reageert niet (Windows toont dan "reageert niet").

Oorzaak

De presentatie-exports zijn al uit de UI-isolate gehaald (ExportService._offload → Isolate.run, lib/services/export_service.dart:356, met de toelichting "JPEG-hercompressie en PDF-assemblage zijn CPU-zwaar"). De document-exports niet:

  • PDF: pw.MultiPage-opmaak en document.save() op de UI-isolate (lib/services/pdf/document_pdf_renderer.dart:218-258). Voor een document van honderd pagina's met tabellen is dat het zwaarste deel.
  • DOCX/ODT/EPUB: ZipEncoder().encodeBytes(archive) op de UI-isolate (lib/services/docx/document_docx_export.dart:163, lib/services/odt/document_odt_export.dart:119, lib/services/epub/document_epub_export.dart:107) — Dart-deflate over alle XML en afbeeldingen.

Daarbij, voor presentaties: Isolate.run(body) kopieert de vastgelegde List<Uint8List> met alle gerasterde dia's naar de nieuwe isolate. Bij 150 dia's met foto's is dat honderden MB extra piekgeheugen bovenop de renders zelf (die tijdens de export onder een tijdelijke imagecache van 1 GB vallen, slide_rasterizer.dart:195).

Voorgestelde oplossing

  1. Document-PDF: alles wat de UI-isolate nodig heeft (afbeeldingen inlezen, Mermaid/MathJax via de WebView, lettertypen) vooraf oplossen tot bytes/SVG-strings, en daarna de opmaak + save() in Isolate.run. De callbacks (embedImage, renderMermaid) worden dan een vooraf gevulde map.
  2. DOCX/ODT/EPUB: het Archive bouwen mag blijven waar het is; encodeBytes in Isolate.run.
  3. Presentatie-export: de PNG's als TransferableTypedData overdragen in plaats van kopiëren.
  4. Voortgang en annuleren in de documentexportdialoog, zoals bij presentaties.

Wat overeind moet blijven

Identieke uitvoer (byte-gelijk waar dat nu zo is), de waarschuwingscallbacks (#1789, #2467) en de web-route (daar geen isolates: _offload doet daar Future.sync).

Toets

Integratietest: export van een document van 150 pagina's; tijdens de export blijft de langste framepauze < 100 ms en reageert Annuleren.

Onderdeel van de prestatie- en stabiliteitsinspectie van 28-10-2026 (EPIC #2637).

## Symptoom Een groot document exporteren naar PDF, DOCX, ODT of EPUB laat de app bevriezen tot de export klaar is: geen voortgang, geen annuleren, en het venster reageert niet (Windows toont dan "reageert niet"). ## Oorzaak De presentatie-exports zijn al uit de UI-isolate gehaald (`ExportService._offload` → `Isolate.run`, `lib/services/export_service.dart:356`, met de toelichting "JPEG-hercompressie en PDF-assemblage zijn CPU-zwaar"). De **document**-exports niet: - PDF: `pw.MultiPage`-opmaak en `document.save()` op de UI-isolate (`lib/services/pdf/document_pdf_renderer.dart:218-258`). Voor een document van honderd pagina's met tabellen is dat het zwaarste deel. - DOCX/ODT/EPUB: `ZipEncoder().encodeBytes(archive)` op de UI-isolate (`lib/services/docx/document_docx_export.dart:163`, `lib/services/odt/document_odt_export.dart:119`, `lib/services/epub/document_epub_export.dart:107`) — Dart-deflate over alle XML en afbeeldingen. Daarbij, voor presentaties: `Isolate.run(body)` **kopieert** de vastgelegde `List<Uint8List>` met alle gerasterde dia's naar de nieuwe isolate. Bij 150 dia's met foto's is dat honderden MB extra piekgeheugen bovenop de renders zelf (die tijdens de export onder een tijdelijke imagecache van 1 GB vallen, `slide_rasterizer.dart:195`). ## Voorgestelde oplossing 1. Document-PDF: alles wat de UI-isolate nodig heeft (afbeeldingen inlezen, Mermaid/MathJax via de WebView, lettertypen) vooraf oplossen tot bytes/SVG-strings, en daarna de opmaak + `save()` in `Isolate.run`. De callbacks (`embedImage`, `renderMermaid`) worden dan een vooraf gevulde map. 2. DOCX/ODT/EPUB: het `Archive` bouwen mag blijven waar het is; `encodeBytes` in `Isolate.run`. 3. Presentatie-export: de PNG's als `TransferableTypedData` overdragen in plaats van kopiëren. 4. Voortgang en annuleren in de documentexportdialoog, zoals bij presentaties. ## Wat overeind moet blijven Identieke uitvoer (byte-gelijk waar dat nu zo is), de waarschuwingscallbacks (#1789, #2467) en de web-route (daar geen isolates: `_offload` doet daar `Future.sync`). ## Toets Integratietest: export van een document van 150 pagina's; tijdens de export blijft de langste framepauze < 100 ms en reageert Annuleren. Onderdeel van de prestatie- en stabiliteitsinspectie van 28-10-2026 (EPIC #2637).
brenno 2026-10-29 12:19:56 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#2629
No description provided.