Zitat-Highlighting in PDFs (gelbe Markierung im Wahlprogramm) #47
Labels
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: tobias/gwoe-antragspruefer#47
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Aus CLAUDE.md
Offene TODOs. Wenn der GWÖ-Report auf eine Wahlprogramm-Seite verlinkt (/static/referenzen/spd-mv-2021.pdf#page=20), öffnet der Browser die Seite — aber das relevante Zitat ist nicht visuell hervorgehoben. Der Leser muss selbst suchen.Vorgehen
Beim Indexieren in
embeddings.index_programmden Chunk-Text + Page-Number mit Bounding-Box aus der PDF speichern (PyMuPDF kann das viapage.search_for(text)). Beim Report-Render eine annotierte Variante des PDFs erzeugen, die nur die relevante Passage gelb unterlegt — entweder als On-the-fly-PDF-Bearbeitung oder per HTML-Overlay (PDF.js).Trade-off: PDF-Annotation ist aufwendig (~150 Wahlprogramm-PDFs × N Zitate). Alternative: HTML-Highlight-Overlay über PDF.js mit den Bounding-Boxes als JSON-Sidecar.
Akzeptanzkriterien
Resolved (2026-04-10)
Implementation in
4ec6190.Architektur
Statt beim Indexieren persistente Bounding-Boxes zu speichern (wie der ursprüngliche Issue-Vorschlag), erfolgt das Highlighting on-demand pro Klick:
embeddings._chunk_pdf_urlwird der Snippet-Text in die URL eingebettet (URL-encoded, auf 200 Zeichen abgeschnitten)GET /api/wahlprogramm-cite?pid=<programm_id>&seite=<n>&q=<text>rendert die einzelne Seite mit gelben Highlightsinsert_pdfextrahiert die angeforderte Seite in einen neuen Document → kleine Response (~800 KB statt mehrerer MB für das volle Programm)page.search_for(text)findet die Bounding-Boxes;add_highlight_annotsetzt die gelbe MarkierungVorteile gegenüber dem Indexierungs-Ansatz
embeddings.dbpersistiert werdentext-Snippets bekommen die neuen URLs sobald sie re-analysiert werden (reconstruct_zitateaus #60 emittiert die Cite-URL automatisch)Security
pidmuss ein registrierterPROGRAMME-Key sein → kein Path-Traversalseite∈ [1, 2000] → keine arbiträren Integer-Werteqwird auf 200 Zeichen begrenzt im Renderer → keine DoS via riesigem SearchCache-Control: max-age=86400für WiederholungsklicksLive-Smoke-Test
Acceptance Criteria
Tests
194/194 lokal grün, davon 9 neu:
TestChunkPdfUrl(4 Cases): cite vs static, unknown prog, 200-char-truncateTestRenderHighlightedPage(5 Cases): unknown pid, invalid seite, valid render mit Größenvergleich, empty query, query-not-foundHinweis für künftige Re-Analysen
Bestehende Assessments im Prod (vor
4ec6190) haben noch die statischen/static/referenzen/X.pdf#page=N-URLs. Sie funktionieren weiterhin, aber ohne Highlights. Sobald sie re-analysiert werden (durch UI oder admin-Befehl), nutzen sie die neue Cite-URL automatisch viareconstruct_zitate.Closing.