Files
DXApp/DXApp.TemplateKitProject/Pages/Invoices/Upload.cshtml
OlgunR 4c90d2e5f1 Add PDF/A compliance checks and warnings
Added `PdfALevel` and `PdfAWarning` properties to the `PdfExtractionResult` class to store the PDF/A compliance level and indicate if a warning should be displayed for non-compliance.

Updated `Upload.cshtml` to display the PDF/A compliance level and conditionally show a warning message if the document is not PDF/A compliant.

Enhanced `PdfAttachmentExtractorService` to determine the PDF/A compliance level using `PdfDocumentProcessor`, map it to a string representation, and log the compliance level. Added logic to set `PdfAWarning` for non-compliant documents.
2026-05-26 11:16:28 +02:00

94 lines
3.8 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
@page
@model DXApp.TemplateKitProject.Pages.Invoices.UploadModel
@{
ViewData["Title"] = "PDF/A Upload";
}
<h2>PDF/A Rechnung hochladen</h2>
<form method="post" enctype="multipart/form-data">
<div class="mb-3">
<label asp-for="PdfFile" class="form-label">PDF/A-Datei auswählen</label>
<input asp-for="PdfFile" type="file" class="form-control" accept=".pdf" />
<span asp-validation-for="PdfFile" class="text-danger"></span>
</div>
<button type="submit" class="btn btn-primary">Hochladen &amp; Analysieren</button>
</form>
@if (Model.ExtractionDone)
{
<hr />
<h4>Ergebnis</h4>
@if (!string.IsNullOrEmpty(Model.ErrorMessage))
{
<div class="alert alert-danger">@Model.ErrorMessage</div>
}
else if (Model.Result == null || !Model.Result.HasAttachments)
{
<div class="alert alert-warning">Keine Anhänge in der PDF gefunden.</div>
}
else
{
<div class="alert @(Model.Result.HasZugferdXml ? "alert-success" : "alert-warning")">
@if (Model.Result.HasZugferdXml)
{
<strong>✔ ZUGFeRD/Factur-X XML gefunden:</strong>
<span>@Model.Result.ZugferdXmlAttachment!.OriginalFileName</span>
}
else
{
<strong>⚠ Kein ZUGFeRD-XML gefunden.</strong>
}
</div>
@* PDF/A-Konformitätsstufe anzeigen *@
<div class="alert @(Model.Result.PdfAWarning ? "alert-warning" : "alert-info") mt-2">
<strong>PDF/A-Konformität:</strong> @Model.Result.PdfALevel
@if (Model.Result.PdfAWarning)
{
<span> ⚠️ ZUGFeRD-Rechnungen müssen PDF/A-3b sein.</span>
}
</div>
<table class="table table-sm table-bordered">
<thead class="table-light">
<tr>
<th>Dateiname</th>
<th>Größe</th>
<th>ZUGFeRD?</th>
<th>Gespeichert unter</th>
</tr>
</thead>
<tbody>
@foreach (var a in Model.Result.Attachments)
{
<tr class="@(a.IsZugferdXml ? "table-success" : "")">
<td>@a.OriginalFileName</td>
<td>@($"{a.FileSizeBytes:N0}") Bytes</td>
<td>@(a.IsZugferdXml ? "✔ Ja" : "Nein")</td>
<td><small class="text-muted">@a.SavedFilePath</small></td>
</tr>
}
</tbody>
</table>
}
@if (Model.ImportedInvoice is not null)
{
<hr />
<h4>📄 Geparste Rechnungsdaten</h4>
<table class="table table-sm table-bordered w-auto">
<tr><th>Rechnungsnummer</th><td>@Model.ImportedInvoice.InvoiceNumber</td></tr>
<tr><th>Rechnungsdatum</th><td>@Model.ImportedInvoice.InvoiceDate.ToString("dd.MM.yyyy")</td></tr>
<tr><th>Verkäufer</th><td>@Model.ImportedInvoice.SellerName</td></tr>
<tr><th>USt-ID Verkäufer</th><td>@Model.ImportedInvoice.SellerTaxId</td></tr>
<tr><th>Käufer</th><td>@Model.ImportedInvoice.BuyerName</td></tr>
<tr><th>Währung</th><td>@Model.ImportedInvoice.CurrencyCode</td></tr>
<tr><th>Steuerbetrag</th><td>@Model.ImportedInvoice.TaxAmount.ToString("N2")</td></tr>
<tr><th>Gesamtbetrag</th><td><strong>@Model.ImportedInvoice.TotalAmount.ToString("N2")</strong></td></tr>
<tr><th>IBAN</th><td>@Model.ImportedInvoice.Iban</td></tr>
<tr><th>Importiert am</th><td>@Model.ImportedInvoice.ImportedAt.ToString("dd.MM.yyyy HH:mm")</td></tr>
</table>
<div class="alert alert-success mt-2">✔ Rechnung wurde in der Datenbank gespeichert (ID: @Model.ImportedInvoice.Id)</div>
}
}