Enhance PDF viewer with annotations and WebAssembly
Added support for advanced annotation tools, including signature and stamp management, along with accessibility improvements. Introduced WebAssembly binaries (`qcms_bg.wasm`, `quickjs-eval.wasm`, `openjpeg.wasm`, `jbig2.wasm`) for enhanced performance in color management, JavaScript execution, and image decoding. Implemented a JavaScript fallback (`openjpeg_nowasm_fallback.js`) for environments without WebAssembly support. Updated `Details.cshtml` to include a PDF viewer popup and added a new Razor Page (`ViewPdf.cshtml`) for secure PDF file access. Registered `.mjs` MIME type in `Program.cs` for PDF.js compatibility. Enhanced localization with translations for multiple languages in `viewer.ftl` and added new icons, dialogs, and accessibility features. Updated `DXApp.sln` to include a new project for template management. These changes improve functionality, modularity, and user experience.
This commit is contained in:
@@ -7,6 +7,14 @@
|
||||
<h2>📄 Rechnungsdetails</h2>
|
||||
<a href="/Invoices" class="btn btn-secondary mb-3">← Zurück zur Liste</a>
|
||||
|
||||
@if (!string.IsNullOrEmpty(Model.Invoice?.ResultFilePath))
|
||||
{
|
||||
<button class="btn btn-primary mb-3 ms-2"
|
||||
onclick="openPdfViewer(@Model.Invoice.Id)">
|
||||
📄 PDF anzeigen
|
||||
</button>
|
||||
}
|
||||
|
||||
@if (Model.Invoice is null)
|
||||
{
|
||||
<div class="alert alert-danger">Rechnung nicht gefunden.</div>
|
||||
@@ -41,4 +49,37 @@ else
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
}
|
||||
|
||||
@(Html.DevExtreme().Popup()
|
||||
.ID("pdf-viewer-popup")
|
||||
.Title("PDF Viewer")
|
||||
.Width("90%")
|
||||
.Height("90%")
|
||||
.ShowCloseButton(true)
|
||||
.OnHiding("onPdfPopupHiding")
|
||||
.ContentTemplate(new JS(@"function() {
|
||||
return '<iframe id=""pdf-iframe"" style=""width:100%;height:100%;border:none;""></iframe>';
|
||||
}"))
|
||||
)
|
||||
}
|
||||
|
||||
<script>
|
||||
function openPdfViewer(invoiceId) {
|
||||
var pdfUrl = window.location.origin + '/Invoices/ViewPdf?id=' + invoiceId;
|
||||
var viewerUrl = '/js/pdfjs/web/viewer.html?file=' + encodeURIComponent(pdfUrl);
|
||||
|
||||
var popup = $('#pdf-viewer-popup').dxPopup('instance');
|
||||
|
||||
// onShown sicherstellen dass iframe im DOM ist
|
||||
popup.option('onShown', function () {
|
||||
$('#pdf-iframe').attr('src', viewerUrl);
|
||||
});
|
||||
|
||||
popup.show();
|
||||
}
|
||||
|
||||
function onPdfPopupHiding() {
|
||||
// iframe src leeren beim Schließen → verhindert dass PDF im Hintergrund weiter läuft
|
||||
$('#pdf-iframe').attr('src', '');
|
||||
}
|
||||
</script>
|
||||
2
DXApp.TemplateKitProject/Pages/Invoices/ViewPdf.cshtml
Normal file
2
DXApp.TemplateKitProject/Pages/Invoices/ViewPdf.cshtml
Normal file
@@ -0,0 +1,2 @@
|
||||
@page
|
||||
@model DXApp.TemplateKitProject.Pages.Invoices.ViewPdfModel
|
||||
24
DXApp.TemplateKitProject/Pages/Invoices/ViewPdf.cshtml.cs
Normal file
24
DXApp.TemplateKitProject/Pages/Invoices/ViewPdf.cshtml.cs
Normal file
@@ -0,0 +1,24 @@
|
||||
using DXApp.TemplateKitProject.Data;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Mvc.RazorPages;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace DXApp.TemplateKitProject.Pages.Invoices;
|
||||
|
||||
public class ViewPdfModel(AppDbContext db) : PageModel
|
||||
{
|
||||
public async Task<IActionResult> OnGetAsync(int id)
|
||||
{
|
||||
var invoice = await db.ZugferdInvoices
|
||||
.FirstOrDefaultAsync(i => i.Id == id);
|
||||
|
||||
if (invoice is null || string.IsNullOrEmpty(invoice.ResultFilePath))
|
||||
return NotFound();
|
||||
|
||||
if (!System.IO.File.Exists(invoice.ResultFilePath))
|
||||
return NotFound();
|
||||
|
||||
var bytes = await System.IO.File.ReadAllBytesAsync(invoice.ResultFilePath);
|
||||
return File(bytes, "application/pdf");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user