Как удалить дублирующие нижние колонтитулы из PDF -текстаC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как удалить дублирующие нижние колонтитулы из PDF -текста

Сообщение Anonymous »

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»