ASP.NET CORE 9 MVC /C# Контроллер извлекает тексты из счетов с использованием PDFPIG на основе кода в ответе, как группировать текст в строки, если существует небольшая разница в положении Y. < /p>
Счета -фактуры могут иметь несколько страниц с одинаковыми нижних колонтитулов, такие как < /p>
Первая страница < /p>
Invoice 123
Name Quantity Price
Item 1 12.22 333
....
Item N 44.44 755.55
MyCompany
...
Myaddress
< /code>
Вторая страница: < /p>
Item N+1 222.22 333
....
Item X 44.44 44.00
....
MyCompany
...
Myaddress
< /code>
Page Cooler < /p>
MyCompany
...
Myaddress
< /code>
Появляется много раз в извлеченном тексту. Длина нижнего колонтитула может быть от 1 до N линий в зависимости от счета. Тот же документ обычно имеет одинаковое количество строк в нижнем колонтитуле. Может ли какая -то обработка текста C# или регулярность, используемая для обнаружения и удаления повторяющихся частей линии? < /P>
Это мой код: < /p>
async Task ExtractTextPdfPigAsync(MemoryStream pdfStream)
{
pdfStream.Position = 0;
StringBuilder tulem = new();
using UglyToad.PdfPig.PdfDocument document = UglyToad.PdfPig.PdfDocument.Open(pdfStream, new UglyToad.PdfPig.ParsingOptions() { SkipMissingFonts = true });
foreach (UglyToad.PdfPig.Content.Page page in document.GetPages())
GetWordsInReadingOrder(page, tulem);
return tulem.ToString();
}
///
/// Returns a sequence of words in the order they appear in the PDF, based on an unsupervised reading order detector.
///
/// The page to extract words from.
/// A sequence of words in reading order.
public static void GetWordsInReadingOrder(Page page, StringBuilder builder)
{ // Extract all words from the page using the NearestNeighbourWordExtractor
List words = page.GetWords().ToList();
List sorted = (from r in page.GetWords()
orderby r.BoundingBox.Bottom, r.BoundingBox.Left
select r).ToList();
if (sorted.Count == 0)
return;
List lines = [];
const double rowHeight = 10;
double lnLastTop = 0;
int lnLastRow = 1;
double csvReaVpos = sorted.First().BoundingBox.Bottom;
foreach (Word r in sorted)
{
if (r.BoundingBox.Bottom >= lnLastTop + (0.5 * rowHeight) || r.BoundingBox.Bottom - csvReaVpos > rowHeight)
{
++lnLastRow;
csvReaVpos = r.BoundingBox.Bottom;
}
lnLastTop = r.BoundingBox.Bottom;
lines.Add(new WordsWithLines()
{
RowNo = lnLastRow,
WordElement = r
});
}
IOrderedEnumerable wordsList = from r in lines
orderby r.RowNo descending, r.WordElement.BoundingBox.Left
select r;
int rowNo = wordsList.First().RowNo;
bool first = true;
foreach (WordsWithLines word in wordsList)
{
if (rowNo != word.RowNo)
{
builder.AppendLine();
first = true;
rowNo = word.RowNo;
}
if (!first)
builder.Append(' ');
builder.Append(word.WordElement.Text);
first = false;
}
}
sealed class WordsWithLines
{
public int RowNo;
public Word WordElement;
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... m-pdf-text
Как удалить дублирующие нижние колонтитулы из PDF -текста ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
PrintJS удаляет верхние и нижние колонтитулы, а также показывает цвет фона строки CSS
Anonymous » » в форуме CSS - 0 Ответы
- 26 Просмотры
-
Последнее сообщение Anonymous
-