DocumentViewer
Clientseitiger Aufruf
Ohne .Document(...) rendert der Builder nur das Skelett. Welches Dokument erscheint, entscheidet die Anwendung zur Laufzeit über initDocumentViewer(url, name, typ) – etwa nach der Auswahl in einer Liste.
@* Ohne .Document(...) rendert der Builder nur das Skelett – geladen wird erst, wenn die Anwendung
initDocumentViewer(url, name, typ) aufruft. Der Typ ist der Enum-Wert in Kleinschreibung. *@
<div class="mb-3 d-flex gap-2 flex-wrap">
<button type="button" class="btn btn-primary btn-sm"
data-dokument-url="/documents/PdfDokument.pdf"
data-dokument-name="PdfDokument.pdf"
data-dokument-typ="pdf">
PDF laden
</button>
<button type="button" class="btn btn-primary btn-sm"
data-dokument-url="/documents/beleg.jpg"
data-dokument-name="beleg.jpg"
data-dokument-typ="image">
Bild laden
</button>
</div>
@Html.Fmh(Fmh.DokumentViewer())
<script src="~/js/demos/documentviewer-clientaufruf.js" asp-append-version="true"></script>
// Clientseitiger Aufruf des DocumentViewers.
//
// Der Builder rendert ohne .Document(...) nur das Skelett. Geladen wird ein Dokument erst über
// initDocumentViewer(url, name, typ). Die Funktion stellt das Modul documentviewer.js global
// bereit, sie steht also ohne eigenen Import zur Verfügung.
//
// Der dritte Parameter ist der Enum-Wert DocumentType in Kleinschreibung: "pdf", "image", "none".
// Delegation an document: Damit ist es gleichgültig, wann die Schaltflächen in die Seite kommen.
document.addEventListener("click", (event) => {
const schalter = event.target.closest("[data-dokument-url]");
if (!schalter) {
return;
}
initDocumentViewer(
schalter.dataset.dokumentUrl,
schalter.dataset.dokumentName,
schalter.dataset.dokumentTyp);
});
// jQuery-Fassung von documentviewer-clientaufruf.js.
//
// Diese Datei wird NICHT geladen – sie zeigt nur dieselbe Umsetzung mit jQuery. Würde sie
// zusätzlich eingebunden, liefen beide Varianten und das Dokument würde zweimal geladen.
// $(document).on(...) mit Selektor ist die jQuery-Entsprechung der Delegation an document.
$(document).on("click", "[data-dokument-url]", function () {
// Achtung: .data() wandelt data-dokument-url in camelCase (dokumentUrl) – wie dataset im
// JavaScript-Pendant. .attr("data-dokument-url") läse dagegen den Rohwert.
var schalter = $(this);
initDocumentViewer(
schalter.data("dokumentUrl"),
schalter.data("dokumentName"),
schalter.data("dokumentTyp"));
});
Darstellung
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.