@page "/reportviewer/" @using System.Drawing @using DevExpress.Drawing @using DevExpress.Utils @using DevExpress.XtraPrinting @using DevExpress.XtraPrinting.Drawing @using DevExpress.XtraReports.UI; @using EnvelopeGenerator.ReceiverUI.Services; @inject IJSRuntime JSRuntime @inject InMemoryReportStorageWebExtension ReportStorage
Unterschrift

@if(SignatureApplied) { Die Unterschrift wurde dem Bericht hinzugefuegt. Sie koennen die Unterschrift erneuern oder das signierte PDF exportieren. } else { Bitte fuegen Sie vor dem PDF-Export Ihre Unterschrift hinzu. }

@if(!string.IsNullOrWhiteSpace(SignatureValidationMessage)) {
@SignatureValidationMessage
}

Bitte unterschreiben Sie im folgenden Feld.

@if(!string.IsNullOrWhiteSpace(PopupValidationMessage)) {
@PopupValidationMessage
}
@if(Report is not null) { } @code { DxReportViewer reportViewer; XtraReport? Report; bool SignatureApplied; bool SignaturePopupVisible; string? SignatureValidationMessage; string? PopupValidationMessage; int ViewerKey; protected override async Task OnInitializedAsync() { Report = CreateReportInstance(); await Task.CompletedTask; } async Task OpenSignaturePopupAsync() { SignaturePopupVisible = true; SignatureValidationMessage = null; PopupValidationMessage = null; await InvokeAsync(StateHasChanged); await Task.Delay(50); await JSRuntime.InvokeVoidAsync("receiverSignature.initialize", "receiver-signature-pad"); } async Task RenewSignatureAsync() { PopupValidationMessage = null; await JSRuntime.InvokeVoidAsync("receiverSignature.clear", "receiver-signature-pad"); } void CloseSignaturePopup() { PopupValidationMessage = null; SignaturePopupVisible = false; } async Task ApplySignatureAsync() { var signatureDataUrl = await JSRuntime.InvokeAsync("receiverSignature.getDataUrl", "receiver-signature-pad"); if(string.IsNullOrWhiteSpace(signatureDataUrl)) { PopupValidationMessage = "Die Unterschrift ist fuer den PDF-Export erforderlich."; return; } PopupValidationMessage = null; SignatureValidationMessage = null; Report = CreateSignedReportInstance(signatureDataUrl); SignatureApplied = true; SignaturePopupVisible = false; ViewerKey++; } async Task ExportSignedPdfAsync() { if(!SignatureApplied || Report is null) { SignatureValidationMessage = "Bitte fuegen Sie die Unterschrift zuerst zum Bericht hinzu."; return; } await reportViewer.ExportToAsync(ExportFormat.Pdf); } XtraReport CreateReportInstance() { return ReportStorage.TryGetReport("LargeDatasetReport", out var savedReport) ? savedReport : PredefinedReports.ReportsFactory.GetReport("LargeDatasetReport"); } XtraReport CreateSignedReportInstance(string signatureDataUrl) { var report = CreateReportInstance(); AddSignature(report, signatureDataUrl); return report; } static void AddSignature(XtraReport report, string signatureDataUrl) { var imageBytes = Convert.FromBase64String(signatureDataUrl[(signatureDataUrl.IndexOf(',') + 1)..]); using var imageStream = new MemoryStream(imageBytes); var imageSource = new ImageSource(DXImage.FromStream(imageStream)); var bottomMargin = report.Bands.OfType().FirstOrDefault(); if(bottomMargin is null) { bottomMargin = new BottomMarginBand(); report.Bands.Add(bottomMargin); } bottomMargin.HeightF = Math.Max(bottomMargin.HeightF, 120F); RemoveExistingSignature(bottomMargin); var signatureLabel = new XRLabel { Name = "receiverSignatureLabel", Text = $"Empfaengerunterschrift - {DateTime.Now:g}", BoundsF = new RectangleF(390F, 6F, 230F, 18F), Font = new DXFont("Open Sans", 8F, DXFontStyle.Bold), ForeColor = System.Drawing.Color.FromArgb(73, 80, 87), TextAlignment = TextAlignment.MiddleLeft }; var signature = new XRPictureBox { Name = "receiverSignatureImage", ImageSource = imageSource, BoundsF = new RectangleF(390F, 28F, 230F, 70F), Sizing = ImageSizeMode.ZoomImage, Borders = BorderSide.Bottom, BorderColor = System.Drawing.Color.FromArgb(73, 80, 87) }; bottomMargin.Controls.AddRange(new XRControl[] { signatureLabel, signature }); } static void RemoveExistingSignature(BottomMarginBand bottomMargin) { var controls = bottomMargin.Controls .Cast() .Where(control => control.Name is "receiverSignatureLabel" or "receiverSignatureImage") .ToArray(); foreach(var control in controls) bottomMargin.Controls.Remove(control); } }