Reader: PDF-Textlayer fehlt (macht PDF-Suche kaputt + blockiert PDF-Annotationen) #10

Open
opened 2026-08-04 08:15:09 +00:00 by mrwnslz · 0 comments
Owner

Befund

Beim Bau des neuen Annotationen-Features (Marker/Notizen im Reader, siehe zugehöriger Commit) ist aufgefallen: .pdf-text-layer existiert nur als CSS-Regel in static/css/app.css — im JS (static/js/app.js) wird nirgends ein Element mit dieser Klasse gebaut (kein renderTextLayer-Aufruf, keine Span-Erzeugung über den PDF-Canvas).

Konkrete Folge: doReaderSearch() sucht im PDF-Zweig über contentEl.querySelectorAll('.pdf-text-layer > span') — findet dort aber immer 0 Treffer, weil diese Spans nie erzeugt werden. Die PDF-Volltextsuche im Reader ist dadurch aktuell komplett funktionslos (unabhängig vom Annotationen-Feature, ein bereits bestehender Bug).

Warum das hier relevant ist

Das neue Highlight/Notizen-Feature (Marker per Textauswahl, freiform Notizen über die linke Margin-Sidebar, Export als Textdatei) wurde bewusst nur für EPUB umgesetzt — mit dem Nutzer abgestimmt. EPUB nutzt XPath-Anker in den Fließtext (buildEpubAnchor/resolveAnchorRange in app.js); das funktioniert, weil der komplette Buchtext als HTML im DOM steht. PDFs werden dagegen als Canvas gerendert (renderPdf() in app.js) — ohne Text-Layer gibt es keinen adressierbaren DOM-Text, an dem sich Markierungen/Notizen verankern ließen.

Vorschlag für die Folgearbeit

  1. PDF-Text-Layer nachrüsten: pdf.js bietet dafür fertige Bausteine (TextLayerBuilder/renderTextLayer) — Integration in die bestehende Custom-Canvas-Pipeline (Zoom, Spread-Modus, Pagination-Modus pdfPaginated) ist der eigentliche Aufwand.
  2. Das behebt nebenbei die kaputte PDF-Suche.
  3. Erst danach: PDF-Anker-Mechanismus analog zu buildEpubAnchor (Seite + Position im Text-Layer statt Chapter-XPath), Marker-Rendering auf den Canvas-Seiten, Margin-Sidebar-Unterstützung für PDF.

Siehe auch #8 (Podcast-Feature-Parity) als Beispiel für dieses Living-Issue-Muster — hier ähnlich: offenhalten, bis jemand das priorisiert.

## Befund Beim Bau des neuen Annotationen-Features (Marker/Notizen im Reader, siehe zugehöriger Commit) ist aufgefallen: `.pdf-text-layer` existiert nur als CSS-Regel in `static/css/app.css` — im JS (`static/js/app.js`) wird nirgends ein Element mit dieser Klasse gebaut (kein `renderTextLayer`-Aufruf, keine Span-Erzeugung über den PDF-Canvas). Konkrete Folge: `doReaderSearch()` sucht im PDF-Zweig über `contentEl.querySelectorAll('.pdf-text-layer > span')` — findet dort aber **immer 0 Treffer**, weil diese Spans nie erzeugt werden. Die PDF-Volltextsuche im Reader ist dadurch aktuell komplett funktionslos (unabhängig vom Annotationen-Feature, ein bereits bestehender Bug). ## Warum das hier relevant ist Das neue Highlight/Notizen-Feature (Marker per Textauswahl, freiform Notizen über die linke Margin-Sidebar, Export als Textdatei) wurde bewusst nur für EPUB umgesetzt — mit dem Nutzer abgestimmt. EPUB nutzt XPath-Anker in den Fließtext (`buildEpubAnchor`/`resolveAnchorRange` in `app.js`); das funktioniert, weil der komplette Buchtext als HTML im DOM steht. PDFs werden dagegen als Canvas gerendert (`renderPdf()` in `app.js`) — ohne Text-Layer gibt es keinen adressierbaren DOM-Text, an dem sich Markierungen/Notizen verankern ließen. ## Vorschlag für die Folgearbeit 1. PDF-Text-Layer nachrüsten: pdf.js bietet dafür fertige Bausteine (`TextLayerBuilder`/`renderTextLayer`) — Integration in die bestehende Custom-Canvas-Pipeline (Zoom, Spread-Modus, Pagination-Modus `pdfPaginated`) ist der eigentliche Aufwand. 2. Das behebt nebenbei die kaputte PDF-Suche. 3. Erst danach: PDF-Anker-Mechanismus analog zu `buildEpubAnchor` (Seite + Position im Text-Layer statt Chapter-XPath), Marker-Rendering auf den Canvas-Seiten, Margin-Sidebar-Unterstützung für PDF. Siehe auch #8 (Podcast-Feature-Parity) als Beispiel für dieses Living-Issue-Muster — hier ähnlich: offenhalten, bis jemand das priorisiert.
Sign in to join this conversation.
No labels
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: mrwnslz/diora-web#10
No description provided.