Justerat lite i gränssnittet
This commit is contained in:
81
StockHistory/PdfPigLetterExtractor.cs
Normal file
81
StockHistory/PdfPigLetterExtractor.cs
Normal file
@ -0,0 +1,81 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UglyToad.PdfPig;
|
||||
using UglyToad.PdfPig.Content;
|
||||
|
||||
|
||||
namespace StockHistory;
|
||||
|
||||
|
||||
public static class PdfPigLetterExtractor
|
||||
{
|
||||
public static List<string> ExtractLines(List<PdfSida> pages, double lineTolerance = 3.0, double wordSpacingFactor = 0.5)
|
||||
{
|
||||
var result = new List<string>();
|
||||
|
||||
foreach (var page in pages)
|
||||
{
|
||||
var letters = page.FoundLetters;
|
||||
|
||||
// 1. Gruppér tecken till rader baserat på Y-position
|
||||
var lines = letters
|
||||
.GroupBy(l => Math.Round(l.BoundingBox.Top / lineTolerance))
|
||||
.OrderBy(g => g.Key);
|
||||
|
||||
foreach (var lineGroup in lines)
|
||||
{
|
||||
var lineLetters = lineGroup
|
||||
.OrderBy(l => l.BoundingBox.Left)
|
||||
.ToList();
|
||||
|
||||
// 2. Bygg ord genom att titta på avstånd mellan tecken
|
||||
var words = BuildWords(lineLetters, wordSpacingFactor);
|
||||
|
||||
result.Add(string.Join(" ", words));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private static List<string> BuildWords(List<Letter> letters, double spacingFactor)
|
||||
{
|
||||
var words = new List<string>();
|
||||
var currentWord = new List<Letter>();
|
||||
|
||||
for (int i = 0; i < letters.Count; i++)
|
||||
{
|
||||
var letter = letters[i];
|
||||
currentWord.Add(letter);
|
||||
|
||||
if (i < letters.Count - 1)
|
||||
{
|
||||
var next = letters[i + 1];
|
||||
|
||||
// Avstånd mellan tecken
|
||||
double gap = next.BoundingBox.Left - letter.BoundingBox.Right;
|
||||
|
||||
// Typisk teckenbredd
|
||||
double avgWidth = letter.BoundingBox.Width;
|
||||
|
||||
// Om gapet är större än spacingFactor * teckenbredd → nytt ord
|
||||
if (gap > avgWidth * spacingFactor)
|
||||
{
|
||||
//words.Add(new string(currentWord.Select(l => l.Value).ToArray()));
|
||||
words.Add(string.Concat(currentWord.Select(l => l.Value)));
|
||||
currentWord.Clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (currentWord.Count > 0)
|
||||
{
|
||||
//words.Add(new string(currentWord.Select(l => l.Value).ToArray()));
|
||||
words.Add(string.Concat(currentWord.Select(l => l.Value)));
|
||||
}
|
||||
|
||||
return words;
|
||||
}
|
||||
}
|
||||
@ -7,6 +7,10 @@
|
||||
<UseWindowsForms>true</UseWindowsForms>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Remove="PdfPigLetterExtractor.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.6" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.6" />
|
||||
|
||||
38
StockHistory/frmStockHistoryInit.Designer.cs
generated
38
StockHistory/frmStockHistoryInit.Designer.cs
generated
@ -44,6 +44,9 @@
|
||||
CommissionHeader = new ColumnHeader();
|
||||
AmountToPayHeader = new ColumnHeader();
|
||||
btnClose = new Button();
|
||||
btnAnalysMany = new Button();
|
||||
txtVald = new TextBox();
|
||||
lblAntal = new Label();
|
||||
SuspendLayout();
|
||||
//
|
||||
// btnChooseFile
|
||||
@ -74,7 +77,7 @@
|
||||
btnAnalysera.BackColor = Color.FromArgb(128, 255, 128);
|
||||
btnAnalysera.FlatStyle = FlatStyle.Flat;
|
||||
btnAnalysera.Font = new Font("Segoe UI", 13F);
|
||||
btnAnalysera.Location = new Point(26, 86);
|
||||
btnAnalysera.Location = new Point(26, 126);
|
||||
btnAnalysera.Name = "btnAnalysera";
|
||||
btnAnalysera.Size = new Size(143, 37);
|
||||
btnAnalysera.TabIndex = 2;
|
||||
@ -84,10 +87,10 @@
|
||||
//
|
||||
// txtFound
|
||||
//
|
||||
txtFound.Location = new Point(26, 149);
|
||||
txtFound.Location = new Point(26, 180);
|
||||
txtFound.Multiline = true;
|
||||
txtFound.Name = "txtFound";
|
||||
txtFound.Size = new Size(468, 334);
|
||||
txtFound.Size = new Size(468, 303);
|
||||
txtFound.TabIndex = 3;
|
||||
//
|
||||
// btnSaveToDb
|
||||
@ -95,7 +98,7 @@
|
||||
btnSaveToDb.BackColor = Color.FromArgb(128, 255, 128);
|
||||
btnSaveToDb.FlatStyle = FlatStyle.Flat;
|
||||
btnSaveToDb.Font = new Font("Segoe UI", 13F);
|
||||
btnSaveToDb.Location = new Point(197, 86);
|
||||
btnSaveToDb.Location = new Point(351, 126);
|
||||
btnSaveToDb.Name = "btnSaveToDb";
|
||||
btnSaveToDb.Size = new Size(143, 37);
|
||||
btnSaveToDb.TabIndex = 4;
|
||||
@ -168,12 +171,36 @@
|
||||
btnClose.UseVisualStyleBackColor = false;
|
||||
btnClose.Click += btnClose_Click;
|
||||
//
|
||||
// btnAnalysMany
|
||||
//
|
||||
btnAnalysMany.Location = new Point(0, 0);
|
||||
btnAnalysMany.Name = "btnAnalysMany";
|
||||
btnAnalysMany.Size = new Size(75, 23);
|
||||
btnAnalysMany.TabIndex = 2;
|
||||
//
|
||||
// txtVald
|
||||
//
|
||||
txtVald.Location = new Point(0, 0);
|
||||
txtVald.Name = "txtVald";
|
||||
txtVald.Size = new Size(100, 27);
|
||||
txtVald.TabIndex = 1;
|
||||
//
|
||||
// lblAntal
|
||||
//
|
||||
lblAntal.Location = new Point(0, 0);
|
||||
lblAntal.Name = "lblAntal";
|
||||
lblAntal.Size = new Size(100, 23);
|
||||
lblAntal.TabIndex = 0;
|
||||
//
|
||||
// frmStockHistoryInit
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(8F, 20F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
BackColor = Color.LightGray;
|
||||
ClientSize = new Size(1413, 553);
|
||||
Controls.Add(lblAntal);
|
||||
Controls.Add(txtVald);
|
||||
Controls.Add(btnAnalysMany);
|
||||
Controls.Add(btnClose);
|
||||
Controls.Add(lwTransactions);
|
||||
Controls.Add(btnSaveToDb);
|
||||
@ -205,5 +232,8 @@
|
||||
private ColumnHeader CommissionHeader;
|
||||
private ColumnHeader AmountToPayHeader;
|
||||
private Button btnClose;
|
||||
private Button btnAnalysMany;
|
||||
private TextBox txtVald;
|
||||
private Label lblAntal;
|
||||
}
|
||||
}
|
||||
@ -12,14 +12,15 @@ using System.Drawing.Drawing2D;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace StockHistory
|
||||
{
|
||||
namespace StockHistory;
|
||||
|
||||
public partial class frmStockHistoryInit : Form
|
||||
{
|
||||
private readonly IPdfOpener _pdfOpener;
|
||||
private readonly IPdfFormatter _pdfFormatter;
|
||||
private readonly ITransactionNotesServices _transactionNotes;
|
||||
private List<PdfSida> _pdfSidor = new();
|
||||
private List<PdfSida> localPdfSida = new();
|
||||
|
||||
public frmStockHistoryInit(
|
||||
IPdfOpener pdfOpener,
|
||||
@ -32,6 +33,7 @@ namespace StockHistory
|
||||
_pdfFormatter = pdfFormatter;
|
||||
_transactionNotes = transactionNotes;
|
||||
btnAnalysera.Enabled = false;
|
||||
|
||||
Shown += async (s, e) => await LoadBusinessAsync();
|
||||
}
|
||||
|
||||
@ -42,7 +44,7 @@ namespace StockHistory
|
||||
{
|
||||
ofdFiler.Title = "Välj en PDF-fil";
|
||||
ofdFiler.FileName = "";
|
||||
ofdFiler.Filter = "PDF-filer (*.pdf)|*.pdf|Alla filer (*.*)|*.*";
|
||||
ofdFiler.Filter = "PDF-filer (*.pdf)|*.pdf|ExcelTrans (*.csv)|*.csv|Alla filer (*.*)|*.*";
|
||||
var result = ofdFiler.ShowDialog();
|
||||
|
||||
if (result == DialogResult.OK)
|
||||
@ -57,7 +59,9 @@ namespace StockHistory
|
||||
{
|
||||
_pdfOpener.OpenPdf(lblFileName.Text);
|
||||
_pdfSidor = _pdfOpener.PdfSidor;
|
||||
|
||||
btnAnalysera.Enabled = true;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -65,9 +69,27 @@ namespace StockHistory
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void btnAnalysera_Click(object sender, EventArgs e)
|
||||
{
|
||||
string PdfResult = _pdfFormatter.ExtractFormattedTextUsingWords(_pdfSidor);
|
||||
string PdfResult=string.Empty;
|
||||
if (lblFileName.Text.ToLower().Contains("avanza"))
|
||||
{
|
||||
//var Result = PdfPigLetterExtractor.ExtractLines(_pdfSidor);
|
||||
//SelectPdfLetterData(Result);
|
||||
}
|
||||
else
|
||||
{
|
||||
PdfResult = _pdfFormatter.ExtractFormattedTextUsingWords(_pdfSidor);
|
||||
SelectPdfData(PdfResult);
|
||||
}
|
||||
btnAnalysera.Enabled = false;
|
||||
lblFileName.Text = string.Empty;
|
||||
}
|
||||
|
||||
|
||||
private void SelectPdfData(string PdfResult)
|
||||
{
|
||||
txtFound.Text = string.Empty;
|
||||
List<string> result = PdfResult.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList();
|
||||
//List<string> selected = new();
|
||||
@ -92,8 +114,6 @@ namespace StockHistory
|
||||
|
||||
}
|
||||
}
|
||||
btnAnalysera.Enabled = false;
|
||||
lblFileName.Text = string.Empty;
|
||||
}
|
||||
|
||||
private async void btnSaveToDb_Click(object sender, EventArgs e)
|
||||
@ -214,5 +234,6 @@ namespace StockHistory
|
||||
{
|
||||
this.Close();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user