DocumentViewer

Zweispaltig mit Sachdaten

In ERP-Systemen das häufigste Muster: links die Sachdaten, rechts der Beleg. Der Viewer ist ein gewöhnliches Element im Bootstrap-Raster und braucht keine Sonderbehandlung.

@* Zweispaltiges Layout, wie es in ERP-Systemen üblich ist: links die Sachdaten, rechts die
   Vorschau des Belegs. Der Viewer ist ein gewöhnliches Element im Raster – er braucht keinen
   eigenen Rahmen und keine feste Breite. *@
<div class="row g-4">
    <div class="col-12 col-xl-5">
        <h2 class="h5">Beleg 2026-0042</h2>
        <dl class="row mb-0">
            <dt class="col-5">Einreichung</dt>
            <dd class="col-7">14.03.2026</dd>

            <dt class="col-5">Antragsteller</dt>
            <dd class="col-7">Hans Muster</dd>

            <dt class="col-5">Fachgebiet</dt>
            <dd class="col-7">Allgemeine Innere Medizin</dd>

            <dt class="col-5">Status</dt>
            <dd class="col-7"><span class="badge text-bg-warning">In Prüfung</span></dd>

            <dt class="col-5">Betrag</dt>
            <dd class="col-7">CHF 1'250.00</dd>
        </dl>
    </div>
    <div class="col-12 col-xl-7">
        @Html.Fmh(Fmh.DokumentViewer()
            .Document("/documents/PdfDokument.pdf", "PdfDokument.pdf", DocumentType.Pdf))
    </div>
</div>

Darstellung

Beleg 2026-0042

Einreichung
14.03.2026
Antragsteller
Hans Muster
Fachgebiet
Allgemeine Innere Medizin
Status
In Prüfung
Betrag
CHF 1'250.00
/
Dokument.pdf

Der DocumentViewerBuilder wird über Fmh.DokumentViewer() erzeugt und mit @Html.Fmh(...) gerendert:

@Html.Fmh(Fmh.DokumentViewer()
    .Document("/documents/PdfDokument.pdf", "PdfDokument.pdf", DocumentType.Pdf))

Ohne .Document(...) entsteht nur das Skelett; das Dokument kommt dann zur Laufzeit über initDocumentViewer(...).

Konfiguration

Methode Erklärung
.Document(url, name, type) Adresse des Dokuments, angezeigter Name in der Werkzeugleiste und Format. type ist DocumentType.Pdf, .Image oder .None. Ohne Aufruf bleibt der Viewer leer.

Unterstützte Formate

Wert Darstellung
DocumentType.Pdf Über pdf.js im Canvas. Werkzeugleiste mit Seitennavigation, Zoom, Drehung, Download.
DocumentType.Image Direkt im Canvas, ohne pdf.js. Werkzeugleiste ohne Seitennavigation. Unterstützt sind .jpg, .jpeg, .png.
DocumentType.None Keine Vorschau, stattdessen Hinweistext und Download-Link.

Den Typ nicht selbst bestimmen

DocumentSupport leitet das Format aus dem Dateinamen ab — das ist verlässlicher, als den Typ an jeder Aufrufstelle zu tippen:

Methode Rückgabe
DocumentSupport.GibTypFuerViewer(dateiname) DocumentType — für den Aufruf von .Document(...).
DocumentSupport.GibTypAlsStringFuerViewer(dateiname) Derselbe Wert kleingeschrieben als Zeichenkette — für Attribute und für initDocumentViewer(...).
DocumentSupport.GibDokumentAttributFuerViewerDialog(dateiname) Das fertige Attribut data-siwf-documentviewer-type="…" — für Links, die den Dialog öffnen sollen.

Alles, was nicht .pdf, .jpg, .jpeg oder .png ist, ergibt None.

Clientseitiger Aufruf

Das Modul stellt drei Funktionen global bereit:

Funktion Zweck
initDocumentViewer(url, name, typ) Lädt ein Dokument in den bereits gerenderten Viewer. typ ist der Enum-Wert kleingeschrieben: 'pdf', 'image', 'none'.
initDocumentViewerEvents() Hängt die Werkzeugleiste an. Der Viewer ruft das beim Laden der Seite selbst auf.
attachDocumentViewerForAttributedLinks() Schliesst Links mit data-siwf-documentviewer-type an den Dialog an.

Ein Viewer je Seite

Das Skelett arbeitet mit festen Ids (siwf-pdf-viewer, page_num, first, prev, zoominbutton …). Zwei Viewer auf derselben Seite steuern sich gegenseitig — auch der Dialog bringt dasselbe Skelett mit. Pro Seite ist deshalb entweder ein eigenständiger Viewer oder der Dialog vorgesehen, nicht beides. Aus demselben Grund hat in dieser Demo jedes Beispiel eine eigene Seite.

Voraussetzung

Das Skript wird nicht von Hand eingebunden. documentviewer.js ist als natives ES-Modul im Modulkatalog des Pakets eingetragen (PdfViewerModuleSetup, Platzierung Head) und wird geladen, sobald die Anwendung das Paket referenziert und AddBundledAssets() aufruft. Die Anleitung dazu steht unter Bundles → Native ES-Module einbinden.