This commit is contained in:
2026-01-23 09:57:52 +01:00
commit 831badd188
136 changed files with 7705 additions and 0 deletions

View File

@ -0,0 +1,31 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<base href="/"/>
<link rel="stylesheet" href="bootstrap/bootstrap.min.css"/>
<link rel="stylesheet" href="app.css"/>
<link rel="stylesheet" href="PdfMarker.styles.css"/>
<link rel="icon" type="image/png" href="favicon.png"/>
<HeadOutlet/>
<RadzenTheme Theme="material" />
</head>
<body>
<Routes/>
<script src="_framework/blazor.web.js"></script>
<script src="_content/Radzen.Blazor/Radzen.Blazor.js?v=@(typeof(Radzen.Colors).Assembly.GetName().Version)"></script>
<script src="js/balloonCanvas.js"></script>
<script>
window.addEventListener("resize", () => {
if (window.balloonCanvas)
window.balloonCanvas.resizeToIframe();
});
</script>
</body>
</html>

View File

@ -0,0 +1,11 @@
@inherits LayoutComponentBase
<RadzenComponents @rendermode="InteractiveAuto" />
<div class="page">
@Body
</div>
<div id="blazor-error-ui">
An unhandled error has occurred.
<a href="" class="reload">Reload</a>
<a class="dismiss">🗙</a>
</div>

View File

@ -0,0 +1,96 @@
.page {
position: relative;
display: flex;
flex-direction: column;
}
main {
flex: 1;
}
.sidebar {
background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
}
.top-row {
background-color: #f7f7f7;
border-bottom: 1px solid #d6d5d5;
justify-content: flex-end;
height: 3.5rem;
display: flex;
align-items: center;
}
.top-row ::deep a, .top-row ::deep .btn-link {
white-space: nowrap;
margin-left: 1.5rem;
text-decoration: none;
}
.top-row ::deep a:hover, .top-row ::deep .btn-link:hover {
text-decoration: underline;
}
.top-row ::deep a:first-child {
overflow: hidden;
text-overflow: ellipsis;
}
@media (max-width: 640.98px) {
.top-row {
justify-content: space-between;
}
.top-row ::deep a, .top-row ::deep .btn-link {
margin-left: 0;
}
}
@media (min-width: 641px) {
.page {
flex-direction: row;
}
.sidebar {
width: 250px;
height: 100vh;
position: sticky;
top: 0;
}
.top-row {
position: sticky;
top: 0;
z-index: 1;
}
.top-row.auth ::deep a:first-child {
flex: 1;
text-align: right;
width: 0;
}
.top-row, article {
padding-left: 2rem !important;
padding-right: 1.5rem !important;
}
}
#blazor-error-ui {
background: lightyellow;
bottom: 0;
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
display: none;
left: 0;
padding: 0.6rem 1.25rem 0.7rem 1.25rem;
position: fixed;
width: 100%;
z-index: 1000;
}
#blazor-error-ui .dismiss {
cursor: pointer;
position: absolute;
right: 0.75rem;
top: 0.5rem;
}

View File

@ -0,0 +1,29 @@
<div class="top-row ps-3 navbar navbar-dark">
<div class="container-fluid">
<a class="navbar-brand" href="">PdfMarker</a>
</div>
</div>
<input type="checkbox" title="Navigation menu" class="navbar-toggler"/>
<div class="nav-scrollable" onclick="document.querySelector('.navbar-toggler').click()">
<nav class="flex-column">
<div class="nav-item px-3">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
<span class="bi bi-house-door-fill-nav-menu" aria-hidden="true"></span> Home
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="counter">
<span class="bi bi-plus-square-fill-nav-menu" aria-hidden="true"></span> Counter
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="weather">
<span class="bi bi-list-nested-nav-menu" aria-hidden="true"></span> Weather
</NavLink>
</div>
</nav>
</div>

View File

@ -0,0 +1,105 @@
.navbar-toggler {
appearance: none;
cursor: pointer;
width: 3.5rem;
height: 2.5rem;
color: white;
position: absolute;
top: 0.5rem;
right: 1rem;
border: 1px solid rgba(255, 255, 255, 0.1);
background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") no-repeat center/1.75rem rgba(255, 255, 255, 0.1);
}
.navbar-toggler:checked {
background-color: rgba(255, 255, 255, 0.5);
}
.top-row {
height: 3.5rem;
background-color: rgba(0,0,0,0.4);
}
.navbar-brand {
font-size: 1.1rem;
}
.bi {
display: inline-block;
position: relative;
width: 1.25rem;
height: 1.25rem;
margin-right: 0.75rem;
top: -1px;
background-size: cover;
}
.bi-house-door-fill-nav-menu {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E");
}
.bi-plus-square-fill-nav-menu {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E");
}
.bi-list-nested-nav-menu {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E");
}
.nav-item {
font-size: 0.9rem;
padding-bottom: 0.5rem;
}
.nav-item:first-of-type {
padding-top: 1rem;
}
.nav-item:last-of-type {
padding-bottom: 1rem;
}
.nav-item ::deep .nav-link {
color: #d7d7d7;
background: none;
border: none;
border-radius: 4px;
height: 3rem;
display: flex;
align-items: center;
line-height: 3rem;
width: 100%;
}
.nav-item ::deep a.active {
background-color: rgba(255,255,255,0.37);
color: white;
}
.nav-item ::deep .nav-link:hover {
background-color: rgba(255,255,255,0.1);
color: white;
}
.nav-scrollable {
display: none;
}
.navbar-toggler:checked ~ .nav-scrollable {
display: block;
}
@media (min-width: 641px) {
.navbar-toggler {
display: none;
}
.nav-scrollable {
/* Never collapse the sidebar for wide screens */
display: block;
/* Allow sidebar to scroll for tall menus */
height: calc(100vh - 3.5rem);
overflow-y: auto;
}
}

View File

@ -0,0 +1,208 @@
@page "/"
<PageTitle>Home</PageTitle>
@page "/ballooning"
@using System.Text.Json
@using PdfMarker.Models
@using PdfMarker.Services
@inject PdfStorageService PdfStorage
@inject HttpClient Http
@inject IJSRuntime JS
@rendermode InteractiveServer
@*<RadzenSplitter Style="height: calc(100vh - 60px)">*@
<RadzenSplitter Style="height: 100vh">
<!-- SINISTRA -->
<RadzenSplitterPane Size="35%" Min="300px">
<RadzenCard Style="height:100%; display:flex; flex-direction:column;">
<!-- CONTENUTO SCROLLABILE -->
<div style="flex:1; overflow-y:auto; padding: 1rem;">
<h3>Documento</h3>
<RadzenUpload
ChooseText="Carica PDF"
Accept=".pdf"
Auto="true"
Url="/api/upload/pdf"
Progress="@OnUploadProgress"
Complete="@OnUploadComplete"
Style="width:100%" />
@if (pdf != null)
{
<h4 class="mt-3">Pallini</h4>
<RadzenButton
Icon="add_circle"
Text="Aggiungi pallino"
Click="@AddBalloon"
Style="margin-bottom:10px" />
<RadzenDataList Data="@balloons" TItem="BalloonVm">
<Template Context="b">
<div class="d-flex justify-content-between align-items-center mb-2">
<span>Pallino @b.Number - @b.Description</span>
<RadzenButton
Icon="delete"
ButtonStyle="ButtonStyle.Danger"
Size="ButtonSize.Small"
Click="@(() => RemoveBalloon(b))" />
</div>
</Template>
</RadzenDataList>
}
</div>
</RadzenCard>
</RadzenSplitterPane>
<!-- DESTRA -->
<RadzenSplitterPane>
<RadzenCard Style="height:100%">
<h3>Preview PDF</h3>
@if (pdf == null)
{
<p>Nessun documento caricato</p>
}
else
{
@*<iframe
src="@pdf?.PreviewUrl"
style="width:100%; height:100%; border:none;">
</iframe>
<canvas id="balloonCanvas"
width="100%"
height="100%"
style="
position:absolute;
top:0;
left:0;
width:100%;
height:100%;
pointer-events:auto;
">
</canvas>*@
<div style="position:relative; height:100%; width:100%;">
<iframe
src="@pdf?.PreviewUrl"
style="width:100%; height:100%; border:none;">
</iframe>
<canvas id="balloonCanvas"
style="
position:absolute;
top:0;
left:0;
width:100%;
height:100%;
pointer-events:auto;">
</canvas>
</div>
}
</RadzenCard>
</RadzenSplitterPane>
</RadzenSplitter>
@code {
UploadedPdf? pdf;
List<BalloonVm> balloons = new();
private ElementReference pdfPreview;
protected override async Task OnAfterRenderAsync(bool firstRender)
{
await JS.InvokeVoidAsync("balloonCanvas.resizeToIframe");
await DrawBalloons();
}
void OnUploadProgress(UploadProgressArgs args)
{
// opzionale
}
async Task OnUploadComplete(UploadCompleteEventArgs args)
{
var json = JsonSerializer.Deserialize<UploadedPdf>(args.RawResponse, new JsonSerializerOptions(){PropertyNameCaseInsensitive = true});
// 1⃣ Recupero risposta upload
var uploadResult = JsonSerializer.Deserialize<UploadResult>(
args.RawResponse,
new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
pdf = new UploadedPdf
{
FileName = json.File,
PreviewUrl = $"/uploads/{json.File}?v={DateTime.UtcNow.Ticks}"
};
// 2⃣ Chiamata API di process
var response = await Http.PostAsJsonAsync(
"/api/ballooning/process",
new AutoBalloonRequest
{
FileName = json.File
});
if (!response.IsSuccessStatusCode)
{
// TODO: gestione errore (toast/log)
return;
}
var autoResult = await response.Content
.ReadFromJsonAsync<AutoBalloonResult>();
// 3⃣ Aggiorna stato UI
balloons = autoResult?.Balloons ?? new();
// 4⃣ Disegno pallini
await DrawBalloons();
StateHasChanged();
/*var json = JsonSerializer.Deserialize<UploadedPdf>(args.RawResponse, new JsonSerializerOptions(){PropertyNameCaseInsensitive = true});
pdf = new UploadedPdf
{
FileName = json.File,
PreviewUrl = $"/uploads/{json.File}"
};
StateHasChanged();*/
}
void AddBalloon()
{
balloons.Add(new BalloonVm
{
Number = balloons.Count + 1
});
}
void RemoveBalloon(BalloonVm balloon)
{
balloons.Remove(balloon);
}
async Task DrawBalloons()
{
if (balloons == null || balloons.Count == 0)
{
await JS.InvokeVoidAsync("balloonCanvas.clear");
return;
}
var payload = balloons.Select(b => new
{
number = b.Number,
x = b.X,
y = b.Y,
selected = b.Selected
});
await JS.InvokeVoidAsync("balloonCanvas.draw", payload);
}
}

View File

@ -0,0 +1,6 @@
<Router AppAssembly="typeof(Program).Assembly">
<Found Context="routeData">
<RouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)"/>
<FocusOnNavigate RouteData="routeData" Selector="h1"/>
</Found>
</Router>

View File

@ -0,0 +1,13 @@
@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using static Microsoft.AspNetCore.Components.Web.RenderMode
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.JSInterop
@using PdfMarker
@using PdfMarker.Components
@using Radzen
@using Radzen.Blazor

View File

@ -0,0 +1,33 @@
using Microsoft.AspNetCore.Mvc;
using PdfMarker.Models;
using PdfMarker.Services;
namespace PdfMarker.Controllers;
[ApiController]
[Route("api/ballooning")]
public class BallooningController : ControllerBase
{
private readonly BallooningService _ballooningService;
private readonly IWebHostEnvironment _env;
public BallooningController(BallooningService ballooningService, IWebHostEnvironment env)
{
_ballooningService = ballooningService;
_env = env;
}
[HttpPost("process")]
public async Task<ActionResult<AutoBalloonResult>> Process([FromBody] AutoBalloonRequest request)
{
if (string.IsNullOrWhiteSpace(request.FileName))
return BadRequest("FileName is required");
var uploadsPath = Path.Combine(_env.WebRootPath, "uploads");
var fName = $"{uploadsPath}/{request.FileName}";
var result = await _ballooningService.GenerateAsync(fName);
return Ok(result);
}
}

View File

@ -0,0 +1,32 @@
using Microsoft.AspNetCore.Mvc;
namespace PdfMarker.Controllers;
[ApiController]
[Route("api/upload")]
public class UploadController : ControllerBase
{
private readonly IWebHostEnvironment _env;
public UploadController(IWebHostEnvironment env)
{
_env = env;
}
[HttpPost("pdf")]
public async Task<IActionResult> UploadPdf(IFormFile file)
{
if (file == null || file.Length == 0)
return BadRequest("File mancante");
var uploadsPath = Path.Combine(_env.WebRootPath, "uploads");
Directory.CreateDirectory(uploadsPath);
var filePath = Path.Combine(uploadsPath, file.FileName);
await using var stream = new FileStream(filePath, FileMode.Create);
await file.CopyToAsync(stream);
return Ok(new { file = file.FileName });
}
}

View File

@ -0,0 +1,6 @@
namespace PdfMarker.Models;
public class AutoBalloonRequest
{
public string FileName { get; set; } = string.Empty;
}

View File

@ -0,0 +1,6 @@
namespace PdfMarker.Models;
public class AutoBalloonResult
{
public List<BalloonVm> Balloons { get; set; } = new();
}

View File

@ -0,0 +1,12 @@
namespace PdfMarker.Models;
public class BalloonVm
{
public int Number { get; set; }
// per dopo
public double? X { get; set; }
public double? Y { get; set; }
public string? Description { get; set; }
public bool Selected { get; set; }
}

View File

@ -0,0 +1,14 @@
namespace PdfMarker.Models;
public class FeatureCandidate
{
public QuotaType Type { get; set; }
public List<QuotaCandidate> Quotes { get; set; } = new();
// area aggregata (normalizzata)
public double CenterX { get; set; }
public double CenterY { get; set; }
public double Confidence { get; set; }
}

View File

@ -0,0 +1,21 @@
namespace PdfMarker.Models;
public class QuotaCandidate
{
public QuotaType Type { get; set; }
public string RawText { get; set; } = string.Empty;
// Bounding box normalizzato (01)
public double X { get; set; }
public double Y { get; set; }
public double Width { get; set; }
public double Height { get; set; }
// Orientamento stimato
public bool IsHorizontal { get; set; }
public bool IsVertical { get; set; }
// Confidenza grezza (01)
public double Confidence { get; set; }
}

View File

@ -0,0 +1,12 @@
namespace PdfMarker.Models;
public enum QuotaType
{
Linear,
Diameter,
Radius,
Angle,
Chamfer,
Depth,
Unknown
}

View File

@ -0,0 +1,8 @@
namespace PdfMarker.Models;
public class TextFeature
{
public double X { get; set; }
public double Y { get; set; }
public string Text { get; set; } = "";
}

View File

@ -0,0 +1,6 @@
namespace PdfMarker.Models;
public class UploadResult
{
public string FileName { get; set; } = string.Empty;
}

View File

@ -0,0 +1,8 @@
namespace PdfMarker.Models;
public class UploadedPdf
{
public string File { get; set; } = default!;
public string FileName { get; set; } = default!;
public string PreviewUrl { get; set; } = default!;
}

View File

@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.23" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.1" />
<PackageReference Include="OpenCvSharp4" Version="4.11.0.20250507" />
<PackageReference Include="OpenCvSharp4.runtime.win" Version="4.11.0.20250507" />
<PackageReference Include="PdfPig" Version="0.1.13" />
<PackageReference Include="Radzen.Blazor" Version="8.6.5" />
<PackageReference Include="Tesseract" Version="5.2.0" />
</ItemGroup>
</Project>

49
PdfMarker/Program.cs Normal file
View File

@ -0,0 +1,49 @@
using Microsoft.AspNetCore.Components;
using PdfMarker.Components;
using PdfMarker.Services;
using Radzen;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents()
.AddInteractiveWebAssemblyComponents();
builder.Services.AddRadzenComponents();
builder.Services.AddControllers();
builder.Services.AddScoped<PdfStorageService>();
builder.Services.AddScoped<PdfQuotaExtractor>();
builder.Services.AddScoped<QuotaClusterer>();
builder.Services.AddScoped<PdfTextExtractor>();
builder.Services.AddScoped<BallooningService>();
builder.Services.AddScoped<HttpClient>(sp =>
{
var nav = sp.GetRequiredService<NavigationManager>();
return new HttpClient
{
BaseAddress = new Uri(nav.BaseUri)
};
});
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error", createScopeForErrors: true);
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAntiforgery();
app.MapControllers();
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode()
.AddInteractiveWebAssemblyRenderMode();
app.Run();

View File

@ -0,0 +1,38 @@
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:61245",
"sslPort": 44300
}
},
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://localhost:5136",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://localhost:7047;http://localhost:5136",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

View File

@ -0,0 +1,68 @@
using PdfMarker.Models;
namespace PdfMarker.Services;
public class BallooningService
{
private readonly PdfQuotaExtractor _quotaExtractor;
private readonly QuotaClusterer _clusterer;
private readonly IWebHostEnvironment _env;
public BallooningService(
PdfQuotaExtractor quotaExtractor,
QuotaClusterer clusterer,
IWebHostEnvironment env)
{
_quotaExtractor = quotaExtractor;
_clusterer = clusterer;
_env = env;
}
public async Task<AutoBalloonResult> GenerateAsync(string fileName)
{
// 1⃣ Path fisico del PDF
var pdfPath = Path.Combine(
_env.WebRootPath,
"pdf",
fileName);
// 2⃣ Estrazione QUOTE
var quotes = _quotaExtractor.Extract(pdfPath);
// 🔴 CHECK CRITICO
// se qui quotes è vuoto → il problema NON è il clustering
if (quotes.Count == 0)
{
return new AutoBalloonResult
{
Balloons = new List<BalloonVm>()
};
}
// 3⃣ Clustering QUOTE → FEATURE
var features = _clusterer.Cluster(quotes);
// 4⃣ Feature → Pallini
var balloons = new List<BalloonVm>();
int index = 1;
foreach (var feature in features)
{
balloons.Add(new BalloonVm
{
Number = index++,
Description = string.Join(" | ",
feature.Quotes.Select(q => q.RawText)),
X = feature.CenterX,
Y = feature.CenterY,
Selected = false
});
}
// 5⃣ Output finale
return new AutoBalloonResult
{
Balloons = balloons
};
}
}

View File

@ -0,0 +1,238 @@
using System.Globalization;
using PdfMarker.Models;
using UglyToad.PdfPig;
using UglyToad.PdfPig.Content;
namespace PdfMarker.Services;
public class PdfQuotaExtractor
{
// percentuale inferiore della pagina da escludere (cartiglio)
private const double CartiglioCutoffY = 0.15; // basso
private const double CartiglioMarginX = 0.05; // bordi laterali 5%
public List<QuotaCandidate> Extract(string filePath)
{
var result = new List<QuotaCandidate>();
using var document = PdfDocument.Open(filePath);
foreach (var page in document.GetPages())
{
var pageWidth = page.Width;
var pageHeight = page.Height;
foreach (var word in page.GetWords())
{
if (!IsQuotaLikeText(word.Text))
continue;
var type = ClassifyQuota(word.Text);
if (type == QuotaType.Unknown)
continue;
var box = word.BoundingBox;
var x = box.Left / pageWidth;
var y = 1 - (box.Bottom / pageHeight);
var w = box.Width / pageWidth;
var h = box.Height / pageHeight;
// --- FILTRI CARTIGLIO ---
// parte bassa del foglio
if (y < CartiglioCutoffY)
continue;
// bordi laterali
if (x < CartiglioMarginX || x > 1 - CartiglioMarginX)
continue;
// testi troppo piccoli (tipici del cartiglio)
/*if (h < 0.003)
continue;*/
// testi troppo corti e non significativi
var t = word.Text.Trim();
if (t.Length <= 1 && !t.Contains("Ø") && !t.Contains("R") && !t.Contains("0"))
continue;
// --- AGGIUNTA QUOTA ---
result.Add(new QuotaCandidate
{
RawText = word.Text,
Type = type,
X = x,
Y = y,
Width = w,
Height = h,
IsHorizontal = box.Width >= box.Height,
IsVertical = box.Height > box.Width,
Confidence = ComputeConfidence(type, word)
});
}
}
return MergeSplitTexts(result);
}
private bool IsQuotaLikeText(string text)
{
if (string.IsNullOrWhiteSpace(text))
return false;
text = text.Replace(" ", "");
// deve contenere almeno un numero
if (!text.Any(char.IsDigit))
return false;
return
text.Contains("Ø") ||
text.StartsWith("R") ||
text.Contains("°") ||
text.Contains("x") ||
text.Contains("×") ||
IsNumeric(text);
}
private QuotaType ClassifyQuota(string text)
{
text = text.Replace(" ", "");
if (text.Contains("Ø"))
return QuotaType.Diameter;
if (text.StartsWith("R"))
return QuotaType.Radius;
if (text.Contains("°"))
return QuotaType.Angle;
if (text.Contains("x") || text.Contains("×"))
return QuotaType.Chamfer;
if (IsNumeric(text))
return QuotaType.Linear;
return QuotaType.Unknown;
}
private bool IsNumeric(string text)
{
return double.TryParse(
text.Replace(",", "."),
NumberStyles.Any,
CultureInfo.InvariantCulture,
out _);
}
private double ComputeConfidence(QuotaType type, Word word)
{
var confidence = type switch
{
QuotaType.Diameter => 0.9,
QuotaType.Radius => 0.85,
QuotaType.Angle => 0.85,
QuotaType.Chamfer => 0.8,
QuotaType.Linear => 0.6,
_ => 0.3
};
var box = word.BoundingBox;
var text = word.Text.Replace(" ", "");
// penalizza testi verticali
if (box.Height > box.Width)
confidence *= 0.7;
// penalizza numeri interi corti (1, 2, 3…)
if (IsNumeric(text) && !text.Contains(",") && !text.Contains("."))
confidence *= 0.7;
return confidence;
}
private bool IsDecimalNumber(string text)
{
// accetta 37,50 12.7 1,5
return double.TryParse(
text.Replace(",", "."),
System.Globalization.NumberStyles.Any,
System.Globalization.CultureInfo.InvariantCulture,
out _)
&& (text.Contains(",") || text.Contains("."));
}
private List<QuotaCandidate> MergeSplitTexts(List<QuotaCandidate> input)
{
var merged = new List<QuotaCandidate>();
var used = new HashSet<QuotaCandidate>();
for (int i = 0; i < input.Count; i++)
{
var current = input[i];
if (used.Contains(current))
continue;
var cluster = new List<QuotaCandidate> { current };
used.Add(current);
foreach (var other in input)
{
if (used.Contains(other))
continue;
// stesso tipo
if (other.Type != current.Type)
continue;
// molto vicini
var dx = Math.Abs(current.X - other.X);
var dy = Math.Abs(current.Y - other.Y);
if (dx < 0.02 && dy < 0.02)
{
cluster.Add(other);
used.Add(other);
}
}
if (cluster.Count == 1)
{
merged.Add(current);
continue;
}
// merge testi
var mergedText = string.Join(" ",
cluster
.Select(q => q.RawText.Trim())
.OrderBy(t => t.Length));
merged.Add(new QuotaCandidate
{
RawText = mergedText,
Type = current.Type,
X = cluster.Average(q => q.X),
Y = cluster.Average(q => q.Y),
Width = cluster.Max(q => q.Width),
Height = cluster.Max(q => q.Height),
IsHorizontal = cluster.Any(q => q.IsHorizontal),
IsVertical = cluster.Any(q => q.IsVertical),
Confidence = cluster.Average(q => q.Confidence)
});
}
return merged;
}
}

View File

@ -0,0 +1,22 @@
namespace PdfMarker.Services;
public class PdfStorageService
{
private readonly IWebHostEnvironment _env;
public PdfStorageService(IWebHostEnvironment env)
{
_env = env;
}
public async Task SaveAsync(IFormFile file)
{
var path = Path.Combine(_env.WebRootPath, "pdf");
Directory.CreateDirectory(path);
var filePath = Path.Combine(path, file.FileName);
using var stream = File.Create(filePath);
await file.CopyToAsync(stream);
}
}

View File

@ -0,0 +1,40 @@
using PdfMarker.Models;
using UglyToad.PdfPig;
namespace PdfMarker.Services;
public class PdfTextExtractor
{
public List<TextFeature> Extract(string filePath)
{
using var doc = PdfDocument.Open(filePath);
var result = new List<TextFeature>();
foreach (var page in doc.GetPages())
{
foreach (var word in page.GetWords())
{
if (IsTechnicalFeature(word.Text))
{
result.Add(new TextFeature
{
X = word.BoundingBox.Left / page.Width,
Y = 1 - (word.BoundingBox.Bottom / page.Height),
Text = word.Text
});
}
}
}
return result;
}
bool IsTechnicalFeature(string text)
{
return text.Contains("Ø")
|| text.Contains("R")
|| text.Contains("x45")
|| text.Contains("H7");
}
}

View File

@ -0,0 +1,77 @@
using PdfMarker.Models;
namespace PdfMarker.Services;
public class QuotaClusterer
{
// distanza massima tra quote per essere considerate la stessa feature
private const double MaxDistance = 0.05; // 5% pagina
public List<FeatureCandidate> Cluster(List<QuotaCandidate> quotes)
{
var features = new List<FeatureCandidate>();
var used = new HashSet<QuotaCandidate>();
foreach (var q in quotes)
{
if (used.Contains(q))
continue;
var cluster = new List<QuotaCandidate> { q };
used.Add(q);
foreach (var other in quotes)
{
if (used.Contains(other))
continue;
if (IsSameFeature(q, other))
{
cluster.Add(other);
used.Add(other);
}
}
features.Add(BuildFeature(cluster));
}
return features;
}
private bool IsSameFeature(QuotaCandidate a, QuotaCandidate b)
{
// stesso tipo → molto importante
if (a.Type != b.Type)
return false;
// orientamento compatibile
if (a.IsHorizontal != b.IsHorizontal ||
a.IsVertical != b.IsVertical)
return false;
// distanza
var dx = a.X - b.X;
var dy = a.Y - b.Y;
var distance = Math.Sqrt(dx * dx + dy * dy);
return distance < MaxDistance;
}
private FeatureCandidate BuildFeature(List<QuotaCandidate> cluster)
{
var centerX = cluster.Average(q => q.X);
var centerY = cluster.Average(q => q.Y);
var confidence = cluster.Average(q => q.Confidence);
return new FeatureCandidate
{
Type = cluster.First().Type,
Quotes = cluster,
CenterX = centerX,
CenterY = centerY,
Confidence = confidence
};
}
}

View File

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

View File

@ -0,0 +1,21 @@
{
"runtimeOptions": {
"tfm": "net8.0",
"rollForward": "Major",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "8.0.0"
},
{
"name": "Microsoft.AspNetCore.App",
"version": "8.0.0"
}
],
"configProperties": {
"System.GC.Server": true,
"System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
}
}
}

Binary file not shown.

View File

@ -0,0 +1,791 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v8.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v8.0": {
"PdfMarker/1.0.0": {
"dependencies": {
"Microsoft.AspNetCore.Components.WebAssembly.Server": "8.0.23",
"Microsoft.Extensions.Hosting": "8.0.1",
"OpenCvSharp4": "4.11.0.20250507",
"OpenCvSharp4.runtime.win": "4.11.0.20250507",
"PdfPig": "0.1.13",
"Radzen.Blazor": "8.6.5",
"Tesseract": "5.2.0"
},
"runtime": {
"PdfMarker.dll": {}
}
},
"Microsoft.AspNetCore.Authorization/8.0.0": {
"dependencies": {
"Microsoft.AspNetCore.Metadata": "8.0.0",
"Microsoft.Extensions.Logging.Abstractions": "8.0.2",
"Microsoft.Extensions.Options": "8.0.2"
}
},
"Microsoft.AspNetCore.Components/8.0.0": {
"dependencies": {
"Microsoft.AspNetCore.Authorization": "8.0.0",
"Microsoft.AspNetCore.Components.Analyzers": "8.0.0"
}
},
"Microsoft.AspNetCore.Components.Analyzers/8.0.0": {},
"Microsoft.AspNetCore.Components.Forms/8.0.0": {
"dependencies": {
"Microsoft.AspNetCore.Components": "8.0.0"
}
},
"Microsoft.AspNetCore.Components.Web/8.0.0": {
"dependencies": {
"Microsoft.AspNetCore.Components": "8.0.0",
"Microsoft.AspNetCore.Components.Forms": "8.0.0",
"Microsoft.Extensions.DependencyInjection": "8.0.1",
"Microsoft.Extensions.Primitives": "8.0.0",
"Microsoft.JSInterop": "8.0.0",
"System.IO.Pipelines": "8.0.0"
}
},
"Microsoft.AspNetCore.Components.WebAssembly.Server/8.0.23": {
"runtime": {
"lib/net8.0/Microsoft.AspNetCore.Components.WebAssembly.Server.dll": {
"assemblyVersion": "8.0.23.0",
"fileVersion": "8.0.2325.60905"
}
}
},
"Microsoft.AspNetCore.Metadata/8.0.0": {},
"Microsoft.Extensions.Configuration/8.0.0": {
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
"Microsoft.Extensions.Primitives": "8.0.0"
}
},
"Microsoft.Extensions.Configuration.Abstractions/8.0.0": {
"dependencies": {
"Microsoft.Extensions.Primitives": "8.0.0"
}
},
"Microsoft.Extensions.Configuration.Binder/8.0.2": {
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "8.0.0"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Configuration.Binder.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.724.31311"
}
}
},
"Microsoft.Extensions.Configuration.CommandLine/8.0.0": {
"dependencies": {
"Microsoft.Extensions.Configuration": "8.0.0",
"Microsoft.Extensions.Configuration.Abstractions": "8.0.0"
}
},
"Microsoft.Extensions.Configuration.EnvironmentVariables/8.0.0": {
"dependencies": {
"Microsoft.Extensions.Configuration": "8.0.0",
"Microsoft.Extensions.Configuration.Abstractions": "8.0.0"
}
},
"Microsoft.Extensions.Configuration.FileExtensions/8.0.1": {
"dependencies": {
"Microsoft.Extensions.Configuration": "8.0.0",
"Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
"Microsoft.Extensions.FileProviders.Abstractions": "8.0.0",
"Microsoft.Extensions.FileProviders.Physical": "8.0.0",
"Microsoft.Extensions.Primitives": "8.0.0"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Configuration.FileExtensions.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.724.31311"
}
}
},
"Microsoft.Extensions.Configuration.Json/8.0.1": {
"dependencies": {
"Microsoft.Extensions.Configuration": "8.0.0",
"Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
"Microsoft.Extensions.Configuration.FileExtensions": "8.0.1",
"Microsoft.Extensions.FileProviders.Abstractions": "8.0.0"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Configuration.Json.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"Microsoft.Extensions.Configuration.UserSecrets/8.0.1": {
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
"Microsoft.Extensions.Configuration.Json": "8.0.1",
"Microsoft.Extensions.FileProviders.Abstractions": "8.0.0",
"Microsoft.Extensions.FileProviders.Physical": "8.0.0"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Configuration.UserSecrets.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"Microsoft.Extensions.DependencyInjection/8.0.1": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.DependencyInjection.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions/8.0.2": {
"runtime": {
"lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"Microsoft.Extensions.Diagnostics/8.0.1": {
"dependencies": {
"Microsoft.Extensions.Configuration": "8.0.0",
"Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1",
"Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Diagnostics.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"Microsoft.Extensions.Diagnostics.Abstractions/8.0.1": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
"Microsoft.Extensions.Options": "8.0.2"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Diagnostics.Abstractions.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"Microsoft.Extensions.FileProviders.Abstractions/8.0.0": {
"dependencies": {
"Microsoft.Extensions.Primitives": "8.0.0"
}
},
"Microsoft.Extensions.FileProviders.Physical/8.0.0": {
"dependencies": {
"Microsoft.Extensions.FileProviders.Abstractions": "8.0.0",
"Microsoft.Extensions.FileSystemGlobbing": "8.0.0",
"Microsoft.Extensions.Primitives": "8.0.0"
}
},
"Microsoft.Extensions.FileSystemGlobbing/8.0.0": {},
"Microsoft.Extensions.Hosting/8.0.1": {
"dependencies": {
"Microsoft.Extensions.Configuration": "8.0.0",
"Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
"Microsoft.Extensions.Configuration.Binder": "8.0.2",
"Microsoft.Extensions.Configuration.CommandLine": "8.0.0",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "8.0.0",
"Microsoft.Extensions.Configuration.FileExtensions": "8.0.1",
"Microsoft.Extensions.Configuration.Json": "8.0.1",
"Microsoft.Extensions.Configuration.UserSecrets": "8.0.1",
"Microsoft.Extensions.DependencyInjection": "8.0.1",
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
"Microsoft.Extensions.Diagnostics": "8.0.1",
"Microsoft.Extensions.FileProviders.Abstractions": "8.0.0",
"Microsoft.Extensions.FileProviders.Physical": "8.0.0",
"Microsoft.Extensions.Hosting.Abstractions": "8.0.1",
"Microsoft.Extensions.Logging": "8.0.1",
"Microsoft.Extensions.Logging.Abstractions": "8.0.2",
"Microsoft.Extensions.Logging.Configuration": "8.0.1",
"Microsoft.Extensions.Logging.Console": "8.0.1",
"Microsoft.Extensions.Logging.Debug": "8.0.1",
"Microsoft.Extensions.Logging.EventLog": "8.0.1",
"Microsoft.Extensions.Logging.EventSource": "8.0.1",
"Microsoft.Extensions.Options": "8.0.2"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Hosting.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"Microsoft.Extensions.Hosting.Abstractions/8.0.1": {
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
"Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1",
"Microsoft.Extensions.FileProviders.Abstractions": "8.0.0",
"Microsoft.Extensions.Logging.Abstractions": "8.0.2"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Hosting.Abstractions.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"Microsoft.Extensions.Logging/8.0.1": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "8.0.1",
"Microsoft.Extensions.Logging.Abstractions": "8.0.2",
"Microsoft.Extensions.Options": "8.0.2"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Logging.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"Microsoft.Extensions.Logging.Abstractions/8.0.2": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"Microsoft.Extensions.Logging.Configuration/8.0.1": {
"dependencies": {
"Microsoft.Extensions.Configuration": "8.0.0",
"Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
"Microsoft.Extensions.Configuration.Binder": "8.0.2",
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
"Microsoft.Extensions.Logging": "8.0.1",
"Microsoft.Extensions.Logging.Abstractions": "8.0.2",
"Microsoft.Extensions.Options": "8.0.2",
"Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Logging.Configuration.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"Microsoft.Extensions.Logging.Console/8.0.1": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
"Microsoft.Extensions.Logging": "8.0.1",
"Microsoft.Extensions.Logging.Abstractions": "8.0.2",
"Microsoft.Extensions.Logging.Configuration": "8.0.1",
"Microsoft.Extensions.Options": "8.0.2"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Logging.Console.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"Microsoft.Extensions.Logging.Debug/8.0.1": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
"Microsoft.Extensions.Logging": "8.0.1",
"Microsoft.Extensions.Logging.Abstractions": "8.0.2"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Logging.Debug.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"Microsoft.Extensions.Logging.EventLog/8.0.1": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
"Microsoft.Extensions.Logging": "8.0.1",
"Microsoft.Extensions.Logging.Abstractions": "8.0.2",
"Microsoft.Extensions.Options": "8.0.2",
"System.Diagnostics.EventLog": "8.0.1"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Logging.EventLog.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"Microsoft.Extensions.Logging.EventSource/8.0.1": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
"Microsoft.Extensions.Logging": "8.0.1",
"Microsoft.Extensions.Logging.Abstractions": "8.0.2",
"Microsoft.Extensions.Options": "8.0.2",
"Microsoft.Extensions.Primitives": "8.0.0"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Logging.EventSource.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"Microsoft.Extensions.Options/8.0.2": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
"Microsoft.Extensions.Primitives": "8.0.0"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Options.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.224.6711"
}
}
},
"Microsoft.Extensions.Options.ConfigurationExtensions/8.0.0": {
"dependencies": {
"Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
"Microsoft.Extensions.Configuration.Binder": "8.0.2",
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
"Microsoft.Extensions.Options": "8.0.2",
"Microsoft.Extensions.Primitives": "8.0.0"
}
},
"Microsoft.Extensions.Primitives/8.0.0": {},
"Microsoft.JSInterop/8.0.0": {},
"OpenCvSharp4/4.11.0.20250507": {
"dependencies": {
"System.Memory": "4.6.3"
},
"runtime": {
"lib/net6.0/OpenCvSharp.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
},
"OpenCvSharp4.runtime.win/4.11.0.20250507": {
"runtimeTargets": {
"runtimes/win-x64/native/OpenCvSharpExtern.dll": {
"rid": "win-x64",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/win-x64/native/opencv_videoio_ffmpeg4110_64.dll": {
"rid": "win-x64",
"assetType": "native",
"fileVersion": "2024.12.0.0"
},
"runtimes/win-x86/native/OpenCvSharpExtern.dll": {
"rid": "win-x86",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/win-x86/native/opencv_videoio_ffmpeg4110.dll": {
"rid": "win-x86",
"assetType": "native",
"fileVersion": "2024.12.0.0"
}
}
},
"PdfPig/0.1.13": {
"runtime": {
"lib/net8.0/UglyToad.PdfPig.Core.dll": {
"assemblyVersion": "0.1.13.0",
"fileVersion": "0.1.13.0"
},
"lib/net8.0/UglyToad.PdfPig.DocumentLayoutAnalysis.dll": {
"assemblyVersion": "0.1.13.0",
"fileVersion": "0.1.13.0"
},
"lib/net8.0/UglyToad.PdfPig.Fonts.dll": {
"assemblyVersion": "0.1.13.0",
"fileVersion": "0.1.13.0"
},
"lib/net8.0/UglyToad.PdfPig.Package.dll": {
"assemblyVersion": "0.1.13.0",
"fileVersion": "0.1.13.0"
},
"lib/net8.0/UglyToad.PdfPig.Tokenization.dll": {
"assemblyVersion": "0.1.13.0",
"fileVersion": "0.1.13.0"
},
"lib/net8.0/UglyToad.PdfPig.Tokens.dll": {
"assemblyVersion": "0.1.13.0",
"fileVersion": "0.1.13.0"
},
"lib/net8.0/UglyToad.PdfPig.dll": {
"assemblyVersion": "0.1.13.0",
"fileVersion": "0.1.13.0"
}
}
},
"Radzen.Blazor/8.6.5": {
"dependencies": {
"Microsoft.AspNetCore.Components": "8.0.0",
"Microsoft.AspNetCore.Components.Web": "8.0.0"
},
"runtime": {
"lib/net8.0/Radzen.Blazor.dll": {
"assemblyVersion": "8.6.5.0",
"fileVersion": "8.6.5.0"
}
}
},
"System.Diagnostics.EventLog/8.0.1": {
"runtime": {
"lib/net8.0/System.Diagnostics.EventLog.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
},
"runtimeTargets": {
"runtimes/win/lib/net8.0/System.Diagnostics.EventLog.dll": {
"rid": "win",
"assetType": "runtime",
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"System.IO.Pipelines/8.0.0": {},
"System.Memory/4.6.3": {},
"System.Reflection.Emit/4.7.0": {},
"Tesseract/5.2.0": {
"dependencies": {
"System.Reflection.Emit": "4.7.0"
},
"runtime": {
"lib/netstandard2.0/Tesseract.dll": {
"assemblyVersion": "5.2.0.0",
"fileVersion": "5.2.0.0"
}
}
}
}
},
"libraries": {
"PdfMarker/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Microsoft.AspNetCore.Authorization/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-OGIGJMnlWvQgcweHcv1Mq/P24Zx/brUHeEdD05NzqkSXmQSnFomTvVyCuBtCXT4JPfv2m70y1RSocmd9bIbJRg==",
"path": "microsoft.aspnetcore.authorization/8.0.0",
"hashPath": "microsoft.aspnetcore.authorization.8.0.0.nupkg.sha512"
},
"Microsoft.AspNetCore.Components/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-kqspqWo3lT+rrSd39kvrV7SZYl0znYZQbQ8SJaHjDA8ffMPV6BkfVe0i6LvxRPwq/agwSWdIDq2j4x+78Frypg==",
"path": "microsoft.aspnetcore.components/8.0.0",
"hashPath": "microsoft.aspnetcore.components.8.0.0.nupkg.sha512"
},
"Microsoft.AspNetCore.Components.Analyzers/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-lJMa9kQDw3vkqcMMbuicIpyax7QH6imQFbLRzVqJzrGs5LN954IPaJVkDzRCEXFVAN24Cml6g4mEF3b0D7Oa+Q==",
"path": "microsoft.aspnetcore.components.analyzers/8.0.0",
"hashPath": "microsoft.aspnetcore.components.analyzers.8.0.0.nupkg.sha512"
},
"Microsoft.AspNetCore.Components.Forms/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-iiYB/7Sl/vTURO4EiTUCmfIXujlJOl+Gh7nknCFhvFQ+kKMFFXYcrszYwLN9aQSolpswc/A9a78KL59/UIezig==",
"path": "microsoft.aspnetcore.components.forms/8.0.0",
"hashPath": "microsoft.aspnetcore.components.forms.8.0.0.nupkg.sha512"
},
"Microsoft.AspNetCore.Components.Web/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-aokUKvFoNqxR6bf0+iKrDfQ79OLHWYn5UGYp5MU65/il1vuRK7MAF18oGj7QgiZJUu3cMAZjCFkHbsWLhQxCsA==",
"path": "microsoft.aspnetcore.components.web/8.0.0",
"hashPath": "microsoft.aspnetcore.components.web.8.0.0.nupkg.sha512"
},
"Microsoft.AspNetCore.Components.WebAssembly.Server/8.0.23": {
"type": "package",
"serviceable": true,
"sha512": "sha512-LWQ2o8KO/SIHlptADvLmek+dupkizs1mN555axEGUVpHvEGrRqGaHwScrh8JaURlcSp/fRFgTWCxdHYCTDIBMA==",
"path": "microsoft.aspnetcore.components.webassembly.server/8.0.23",
"hashPath": "microsoft.aspnetcore.components.webassembly.server.8.0.23.nupkg.sha512"
},
"Microsoft.AspNetCore.Metadata/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-OmuSztiZMitRTYlbMNDkBk3BinSsVcOApSNBAsrw+KYNJh6ALarPhWLlKdtvMgrKzpyCY06xtLAjTmQLURHSlQ==",
"path": "microsoft.aspnetcore.metadata/8.0.0",
"hashPath": "microsoft.aspnetcore.metadata.8.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Configuration/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==",
"path": "microsoft.extensions.configuration/8.0.0",
"hashPath": "microsoft.extensions.configuration.8.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Configuration.Abstractions/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==",
"path": "microsoft.extensions.configuration.abstractions/8.0.0",
"hashPath": "microsoft.extensions.configuration.abstractions.8.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Configuration.Binder/8.0.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-7IQhGK+wjyGrNsPBjJcZwWAr+Wf6D4+TwOptUt77bWtgNkiV8tDEbhFS+dDamtQFZ2X7kWG9m71iZQRj2x3zgQ==",
"path": "microsoft.extensions.configuration.binder/8.0.2",
"hashPath": "microsoft.extensions.configuration.binder.8.0.2.nupkg.sha512"
},
"Microsoft.Extensions.Configuration.CommandLine/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-NZuZMz3Q8Z780nKX3ifV1fE7lS+6pynDHK71OfU4OZ1ItgvDOhyOC7E6z+JMZrAj63zRpwbdldYFk499t3+1dQ==",
"path": "microsoft.extensions.configuration.commandline/8.0.0",
"hashPath": "microsoft.extensions.configuration.commandline.8.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Configuration.EnvironmentVariables/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-plvZ0ZIpq+97gdPNNvhwvrEZ92kNml9hd1pe3idMA7svR0PztdzVLkoWLcRFgySYXUJc3kSM3Xw3mNFMo/bxRA==",
"path": "microsoft.extensions.configuration.environmentvariables/8.0.0",
"hashPath": "microsoft.extensions.configuration.environmentvariables.8.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Configuration.FileExtensions/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-EJzSNO9oaAXnTdtdNO6npPRsIIeZCBSNmdQ091VDO7fBiOtJAAeEq6dtrVXIi3ZyjC5XRSAtVvF8SzcneRHqKQ==",
"path": "microsoft.extensions.configuration.fileextensions/8.0.1",
"hashPath": "microsoft.extensions.configuration.fileextensions.8.0.1.nupkg.sha512"
},
"Microsoft.Extensions.Configuration.Json/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-L89DLNuimOghjV3tLx0ArFDwVEJD6+uGB3BMCMX01kaLzXkaXHb2021xOMl2QOxUxbdePKUZsUY7n2UUkycjRg==",
"path": "microsoft.extensions.configuration.json/8.0.1",
"hashPath": "microsoft.extensions.configuration.json.8.0.1.nupkg.sha512"
},
"Microsoft.Extensions.Configuration.UserSecrets/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-7tYqdPPpAK+3jO9d5LTuCK2VxrEdf85Ol4trUr6ds4jclBecadWZ/RyPCbNjfbN5iGTfUnD/h65TOQuqQv2c+A==",
"path": "microsoft.extensions.configuration.usersecrets/8.0.1",
"hashPath": "microsoft.extensions.configuration.usersecrets.8.0.1.nupkg.sha512"
},
"Microsoft.Extensions.DependencyInjection/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==",
"path": "microsoft.extensions.dependencyinjection/8.0.1",
"hashPath": "microsoft.extensions.dependencyinjection.8.0.1.nupkg.sha512"
},
"Microsoft.Extensions.DependencyInjection.Abstractions/8.0.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==",
"path": "microsoft.extensions.dependencyinjection.abstractions/8.0.2",
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.8.0.2.nupkg.sha512"
},
"Microsoft.Extensions.Diagnostics/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-doVPCUUCY7c6LhBsEfiy3W1bvS7Mi6LkfQMS8nlC22jZWNxBv8VO8bdfeyvpYFst6Kxqk7HBC6lytmEoBssvSQ==",
"path": "microsoft.extensions.diagnostics/8.0.1",
"hashPath": "microsoft.extensions.diagnostics.8.0.1.nupkg.sha512"
},
"Microsoft.Extensions.Diagnostics.Abstractions/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-elH2vmwNmsXuKmUeMQ4YW9ldXiF+gSGDgg1vORksob5POnpaI6caj1Hu8zaYbEuibhqCoWg0YRWDazBY3zjBfg==",
"path": "microsoft.extensions.diagnostics.abstractions/8.0.1",
"hashPath": "microsoft.extensions.diagnostics.abstractions.8.0.1.nupkg.sha512"
},
"Microsoft.Extensions.FileProviders.Abstractions/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==",
"path": "microsoft.extensions.fileproviders.abstractions/8.0.0",
"hashPath": "microsoft.extensions.fileproviders.abstractions.8.0.0.nupkg.sha512"
},
"Microsoft.Extensions.FileProviders.Physical/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-UboiXxpPUpwulHvIAVE36Knq0VSHaAmfrFkegLyBZeaADuKezJ/AIXYAW8F5GBlGk/VaibN2k/Zn1ca8YAfVdA==",
"path": "microsoft.extensions.fileproviders.physical/8.0.0",
"hashPath": "microsoft.extensions.fileproviders.physical.8.0.0.nupkg.sha512"
},
"Microsoft.Extensions.FileSystemGlobbing/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==",
"path": "microsoft.extensions.filesystemglobbing/8.0.0",
"hashPath": "microsoft.extensions.filesystemglobbing.8.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Hosting/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-bP9EEkHBEfjgYiG8nUaXqMk/ujwJrffOkNPP7onpRMO8R+OUSESSP4xHkCAXgYZ1COP2Q9lXlU5gkMFh20gRuw==",
"path": "microsoft.extensions.hosting/8.0.1",
"hashPath": "microsoft.extensions.hosting.8.0.1.nupkg.sha512"
},
"Microsoft.Extensions.Hosting.Abstractions/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-nHwq9aPBdBPYXPti6wYEEfgXddfBrYC+CQLn+qISiwQq5tpfaqDZSKOJNxoe9rfQxGf1c+2wC/qWFe1QYJPYqw==",
"path": "microsoft.extensions.hosting.abstractions/8.0.1",
"hashPath": "microsoft.extensions.hosting.abstractions.8.0.1.nupkg.sha512"
},
"Microsoft.Extensions.Logging/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-4x+pzsQEbqxhNf1QYRr5TDkLP9UsLT3A6MdRKDDEgrW7h1ljiEPgTNhKYUhNCCAaVpQECVQ+onA91PTPnIp6Lw==",
"path": "microsoft.extensions.logging/8.0.1",
"hashPath": "microsoft.extensions.logging.8.0.1.nupkg.sha512"
},
"Microsoft.Extensions.Logging.Abstractions/8.0.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-nroMDjS7hNBPtkZqVBbSiQaQjWRDxITI8Y7XnDs97rqG3EbzVTNLZQf7bIeUJcaHOV8bca47s1Uxq94+2oGdxA==",
"path": "microsoft.extensions.logging.abstractions/8.0.2",
"hashPath": "microsoft.extensions.logging.abstractions.8.0.2.nupkg.sha512"
},
"Microsoft.Extensions.Logging.Configuration/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-QWwTrsgOnJMmn+XUslm8D2H1n3PkP/u/v52FODtyBc/k4W9r3i2vcXXeeX/upnzllJYRRbrzVzT0OclfNJtBJA==",
"path": "microsoft.extensions.logging.configuration/8.0.1",
"hashPath": "microsoft.extensions.logging.configuration.8.0.1.nupkg.sha512"
},
"Microsoft.Extensions.Logging.Console/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-uzcg/5U2eLyn5LIKlERkdSxw6VPC1yydnOSQiRRWGBGN3kphq3iL4emORzrojScDmxRhv49gp5BI8U3Dz7y4iA==",
"path": "microsoft.extensions.logging.console/8.0.1",
"hashPath": "microsoft.extensions.logging.console.8.0.1.nupkg.sha512"
},
"Microsoft.Extensions.Logging.Debug/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-B8hqNuYudC2RB+L/DI33uO4rf5by41fZVdcVL2oZj0UyoAZqnwTwYHp1KafoH4nkl1/23piNeybFFASaV2HkFg==",
"path": "microsoft.extensions.logging.debug/8.0.1",
"hashPath": "microsoft.extensions.logging.debug.8.0.1.nupkg.sha512"
},
"Microsoft.Extensions.Logging.EventLog/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ZD1m4GXoxcZeDJIq8qePKj+QAWeQNO/OG8skvrOG8RQfxLp9MAKRoliTc27xanoNUzeqvX5HhS/I7c0BvwAYUg==",
"path": "microsoft.extensions.logging.eventlog/8.0.1",
"hashPath": "microsoft.extensions.logging.eventlog.8.0.1.nupkg.sha512"
},
"Microsoft.Extensions.Logging.EventSource/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-YMXMAla6B6sEf/SnfZYTty633Ool3AH7KOw2LOaaEqwSo2piK4f7HMtzyc3CNiipDnq1fsUSuG5Oc7ZzpVy8WQ==",
"path": "microsoft.extensions.logging.eventsource/8.0.1",
"hashPath": "microsoft.extensions.logging.eventsource.8.0.1.nupkg.sha512"
},
"Microsoft.Extensions.Options/8.0.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==",
"path": "microsoft.extensions.options/8.0.2",
"hashPath": "microsoft.extensions.options.8.0.2.nupkg.sha512"
},
"Microsoft.Extensions.Options.ConfigurationExtensions/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==",
"path": "microsoft.extensions.options.configurationextensions/8.0.0",
"hashPath": "microsoft.extensions.options.configurationextensions.8.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Primitives/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==",
"path": "microsoft.extensions.primitives/8.0.0",
"hashPath": "microsoft.extensions.primitives.8.0.0.nupkg.sha512"
},
"Microsoft.JSInterop/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-qQqASbHxWIddssdEBKUQ/49j21SEstiho6VAepPQa9eISLCBCE6wq0m3YaB6cpdF5U+AWX5F3FvDfmssql3xtw==",
"path": "microsoft.jsinterop/8.0.0",
"hashPath": "microsoft.jsinterop.8.0.0.nupkg.sha512"
},
"OpenCvSharp4/4.11.0.20250507": {
"type": "package",
"serviceable": true,
"sha512": "sha512-j/R+G6xGC5IV2wGRU0/GF5qG/FrP+Uxp8dmNnXFlIdiw8Gfo4mtvKcBOBfS/bn4pP/7FNHLFX/xvMtgPJeDjAA==",
"path": "opencvsharp4/4.11.0.20250507",
"hashPath": "opencvsharp4.4.11.0.20250507.nupkg.sha512"
},
"OpenCvSharp4.runtime.win/4.11.0.20250507": {
"type": "package",
"serviceable": true,
"sha512": "sha512-3PxMXyzR+pkL9UOx2PiBjZm+/iyCIu5D6OlA1sq9MH7oWrfvVnCXJlUYhIJv67F7SLUwUuGwXDIQBfdsL/54lg==",
"path": "opencvsharp4.runtime.win/4.11.0.20250507",
"hashPath": "opencvsharp4.runtime.win.4.11.0.20250507.nupkg.sha512"
},
"PdfPig/0.1.13": {
"type": "package",
"serviceable": true,
"sha512": "sha512-2AUWNKHbkDr2Ofgi2vVPN/Ya++jhsuHd54xeKveqKOwDiAy2E2QhczOUKyU29ADRHoEJgQUhwHFgtbD6nCZ2WA==",
"path": "pdfpig/0.1.13",
"hashPath": "pdfpig.0.1.13.nupkg.sha512"
},
"Radzen.Blazor/8.6.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-72dF/lFJMy8WYb6cUmBd/on8d+taasU4bsJIwn4sZLfsgD6kRmR2SkNnQr8zdqD+uLkSO1bD/7BBORv0A+fKfg==",
"path": "radzen.blazor/8.6.5",
"hashPath": "radzen.blazor.8.6.5.nupkg.sha512"
},
"System.Diagnostics.EventLog/8.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-n1ZP7NM2Gkn/MgD8+eOT5MulMj6wfeQMNS2Pizvq5GHCZfjlFMXV2irQlQmJhwA2VABC57M0auudO89Iu2uRLg==",
"path": "system.diagnostics.eventlog/8.0.1",
"hashPath": "system.diagnostics.eventlog.8.0.1.nupkg.sha512"
},
"System.IO.Pipelines/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==",
"path": "system.io.pipelines/8.0.0",
"hashPath": "system.io.pipelines.8.0.0.nupkg.sha512"
},
"System.Memory/4.6.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-qdcDOgnFZY40+Q9876JUHnlHu7bosOHX8XISRoH94fwk6hgaeQGSgfZd8srWRZNt5bV9ZW2TljcegDNxsf+96A==",
"path": "system.memory/4.6.3",
"hashPath": "system.memory.4.6.3.nupkg.sha512"
},
"System.Reflection.Emit/4.7.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-VR4kk8XLKebQ4MZuKuIni/7oh+QGFmZW3qORd1GvBq/8026OpW501SzT/oypwiQl4TvT8ErnReh/NzY9u+C6wQ==",
"path": "system.reflection.emit/4.7.0",
"hashPath": "system.reflection.emit.4.7.0.nupkg.sha512"
},
"Tesseract/5.2.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-YB7feJlrTWSXtK8+WaCcseGSPK/1r2d2FWeKGyndlrPwYClrzTlCoHD4/oQEUjKafmpkWlhTZZ7pxiRJYZgj6w==",
"path": "tesseract/5.2.0",
"hashPath": "tesseract.5.2.0.nupkg.sha512"
}
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,19 @@
{
"runtimeOptions": {
"tfm": "net8.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "8.0.0"
},
{
"name": "Microsoft.AspNetCore.App",
"version": "8.0.0"
}
],
"configProperties": {
"System.GC.Server": true,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
}
}
}

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]

View File

@ -0,0 +1,22 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("PdfMarker")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("PdfMarker")]
[assembly: System.Reflection.AssemblyTitleAttribute("PdfMarker")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generato dalla classe WriteCodeFragment di MSBuild.

View File

@ -0,0 +1 @@
070885362e780eb1e5a69b2876ce44d48f990effde0fdd252bf53579e034d28e

View File

@ -0,0 +1,43 @@
is_global = true
build_property.TargetFramework = net8.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb = true
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = PdfMarker
build_property.RootNamespace = PdfMarker
build_property.ProjectDir = C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.RazorLangVersion = 8.0
build_property.SupportLocalizedComponentNames =
build_property.GenerateRazorMetadataSourceChecksumAttributes =
build_property.MSBuildProjectDirectory = C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker
build_property._RazorSourceGeneratorDebug =
[C:/Users/g.vitari/RiderProjects/PdfMarker/PdfMarker/Components/App.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBcHAucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[C:/Users/g.vitari/RiderProjects/PdfMarker/PdfMarker/Components/Pages/Home.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xIb21lLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[C:/Users/g.vitari/RiderProjects/PdfMarker/PdfMarker/Components/Routes.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xSb3V0ZXMucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[C:/Users/g.vitari/RiderProjects/PdfMarker/PdfMarker/Components/_Imports.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xfSW1wb3J0cy5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[C:/Users/g.vitari/RiderProjects/PdfMarker/PdfMarker/Components/Layout/MainLayout.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xMYXlvdXRcTWFpbkxheW91dC5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = b-kt6elwgpn6
[C:/Users/g.vitari/RiderProjects/PdfMarker/PdfMarker/Components/Layout/NavMenu.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xMYXlvdXRcTmF2TWVudS5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = b-4ntavvy6gd

View File

@ -0,0 +1,17 @@
// <auto-generated/>
global using global::Microsoft.AspNetCore.Builder;
global using global::Microsoft.AspNetCore.Hosting;
global using global::Microsoft.AspNetCore.Http;
global using global::Microsoft.AspNetCore.Routing;
global using global::Microsoft.Extensions.Configuration;
global using global::Microsoft.Extensions.DependencyInjection;
global using global::Microsoft.Extensions.Hosting;
global using global::Microsoft.Extensions.Logging;
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Net.Http.Json;
global using global::System.Threading;
global using global::System.Threading.Tasks;

Binary file not shown.

View File

@ -0,0 +1 @@
123907410a6fac80af51783d21fe9fea980eaf1c4699173503eb83a78334dcb0

View File

@ -0,0 +1,81 @@
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\appsettings.Development.json
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\appsettings.json
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\PdfMarker.staticwebassets.runtime.json
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\PdfMarker.exe
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\PdfMarker.deps.json
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\PdfMarker.runtimeconfig.json
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\PdfMarker.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\PdfMarker.pdb
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\Radzen.Blazor.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\obj\Debug\net8.0\PdfMarker.csproj.AssemblyReference.cache
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\obj\Debug\net8.0\PdfMarker.GeneratedMSBuildEditorConfig.editorconfig
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\obj\Debug\net8.0\PdfMarker.AssemblyInfoInputs.cache
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\obj\Debug\net8.0\PdfMarker.AssemblyInfo.cs
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\obj\Debug\net8.0\PdfMarker.csproj.CoreCompileInputs.cache
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\obj\Debug\net8.0\PdfMarker.MvcApplicationPartsAssemblyInfo.cache
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\obj\Debug\net8.0\staticwebassets.build.json
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\obj\Debug\net8.0\staticwebassets.development.json
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\obj\Debug\net8.0\staticwebassets\msbuild.PdfMarker.Microsoft.AspNetCore.StaticWebAssets.props
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\obj\Debug\net8.0\staticwebassets\msbuild.build.PdfMarker.props
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\obj\Debug\net8.0\staticwebassets\msbuild.buildMultiTargeting.PdfMarker.props
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\obj\Debug\net8.0\staticwebassets\msbuild.buildTransitive.PdfMarker.props
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\obj\Debug\net8.0\staticwebassets.pack.json
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\obj\Debug\net8.0\scopedcss\Components\Layout\MainLayout.razor.rz.scp.css
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\obj\Debug\net8.0\scopedcss\Components\Layout\NavMenu.razor.rz.scp.css
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\obj\Debug\net8.0\scopedcss\bundle\PdfMarker.styles.css
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\obj\Debug\net8.0\scopedcss\projectbundle\PdfMarker.bundle.scp.css
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\obj\Debug\net8.0\PdfMarker.csproj.Up2Date
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\obj\Debug\net8.0\PdfMarker.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\obj\Debug\net8.0\refint\PdfMarker.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\obj\Debug\net8.0\PdfMarker.pdb
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\obj\Debug\net8.0\PdfMarker.genruntimeconfig.cache
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\obj\Debug\net8.0\ref\PdfMarker.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\BlazorDebugProxy\BrowserDebugHost.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\BlazorDebugProxy\BrowserDebugHost.runtimeconfig.json
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\BlazorDebugProxy\BrowserDebugProxy.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\BlazorDebugProxy\Microsoft.CodeAnalysis.CSharp.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\BlazorDebugProxy\Microsoft.CodeAnalysis.CSharp.Scripting.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\BlazorDebugProxy\Microsoft.CodeAnalysis.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\BlazorDebugProxy\Microsoft.CodeAnalysis.Scripting.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\BlazorDebugProxy\Microsoft.FileFormats.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\BlazorDebugProxy\Microsoft.NET.WebAssembly.Webcil.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\BlazorDebugProxy\Microsoft.SymbolStore.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\BlazorDebugProxy\Newtonsoft.Json.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\Microsoft.AspNetCore.Components.WebAssembly.Server.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\Microsoft.Extensions.Configuration.Binder.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\Microsoft.Extensions.Configuration.FileExtensions.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\Microsoft.Extensions.Configuration.Json.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\Microsoft.Extensions.Configuration.UserSecrets.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\Microsoft.Extensions.DependencyInjection.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\Microsoft.Extensions.Diagnostics.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\Microsoft.Extensions.Diagnostics.Abstractions.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\Microsoft.Extensions.Hosting.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\Microsoft.Extensions.Hosting.Abstractions.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\Microsoft.Extensions.Logging.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\Microsoft.Extensions.Logging.Abstractions.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\Microsoft.Extensions.Logging.Configuration.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\Microsoft.Extensions.Logging.Console.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\Microsoft.Extensions.Logging.Debug.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\Microsoft.Extensions.Logging.EventLog.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\Microsoft.Extensions.Logging.EventSource.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\Microsoft.Extensions.Options.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\System.Diagnostics.EventLog.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\runtimes\win\lib\net8.0\System.Diagnostics.EventLog.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\x86\leptonica-1.82.0.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\x86\tesseract50.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\x64\leptonica-1.82.0.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\x64\tesseract50.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\OpenCvSharp.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\UglyToad.PdfPig.Core.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\UglyToad.PdfPig.DocumentLayoutAnalysis.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\UglyToad.PdfPig.Fonts.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\UglyToad.PdfPig.Package.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\UglyToad.PdfPig.Tokenization.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\UglyToad.PdfPig.Tokens.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\UglyToad.PdfPig.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\Tesseract.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\runtimes\win-x64\native\OpenCvSharpExtern.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\runtimes\win-x64\native\opencv_videoio_ffmpeg4110_64.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\runtimes\win-x86\native\OpenCvSharpExtern.dll
C:\Users\g.vitari\RiderProjects\PdfMarker\PdfMarker\bin\Debug\net8.0\runtimes\win-x86\native\opencv_videoio_ffmpeg4110.dll

Binary file not shown.

View File

@ -0,0 +1 @@
a41eada879ce07df74bfc56f6f36fb2b5eafd1741915d35685b195989569c538

Some files were not shown because too many files have changed in this diff Show More