gpt4 book ai didi

c# - 在 C# 中从 PDF 中读取基于标签名称的特定值

转载 作者:太空狗 更新时间:2023-10-30 00:17:50 26 4
gpt4 key购买 nike

我有一个 asp.net Core 2.0 C# 应用程序,它读取/解析 PDF 文件并获取文本。在此我想阅读具有特定标签名称的特定值。您可以看到下图 我想获取值171857,即Invoice 编号并将其存储在数据库中。 enter image description here

我已尝试使用以下代码使用 iTextSharp 阅读 pdf。

using (PdfReader reader = new PdfReader(fileName))
{
StringBuilder sb = new StringBuilder();

ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();
for (int page = 0; page < reader.NumberOfPages; page++)
{
string text = PdfTextExtractor.GetTextFromPage(reader, page + 1, strategy);
if (!string.IsNullOrWhiteSpace(text))
{
sb.Append(Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(text))));
}
}

var pdfText = sb.ToString();
}

pdfText 变量中,我将从 pdf 中获取所有文本内容,但这似乎不是获取发票编号的正确方法。有没有其他方法可以通过它的标签名称从 pdf 中读取特定内容,就像我们将提供标签名称 Invoice 并将返回值 171857 作为其他第 3 方的示例pdf 阅读器库?

如有任何帮助或建议,我们将不胜感激。

谢谢

最佳答案

我曾帮助一位 friend 从 Excel arc 生成的 pdf 发票中提取类似的值。我已经为这个答案创建了一个 Excel 发票并将其打印为 PDF 文件和 zipped供下载以供测试。

我接下来要做的是使用一个名为 PDFClown 的开源和免费库.这是 nuget为它打包。

到目前为止一切顺利,我所做的是扫描所有 pdf 文档(例如发票可以是一页或多页)将每个内容添加到字符串列表中。

下一步我找到索引(发票编号索引可以在列表中的第 10 个元素中,在我们的例子中它是索引 1),它引用我将称为标签或标签的发票值。

因此我没有您的 pdf 文件,我临时添加了一个名为(或任何其他名称)“INVOICE”的唯一标签。在这种情况下,发票编号位于发票标签之后。所以我找到“INVOICE”标签的索引并添加 1 来索引这是因为发票编号跟在发票标签后面。在这种情况下,我将选择发票文本 0005 并将其作为值 5 返回。这样您就可以获取我们列表中扫描的每个文本/值后跟任何标记的内容,并以您需要的方式返回它。

因此您需要稍微尝试一下以使其 100% 适合您的 pdf 文件。

这是我的测试文件 Excel 和 Pdf zipped向下。下载它进行测试。

代码如下:

public class InvoiceTextExtraction
{
private List<string> _contentList;

public void GetValueFromPdf()
{
_contentList = new List<string>();
CreatePdfContent(@"C:\temp\Invoice1.pdf");

var index = _contentList.FindIndex(e => e == "INVOICE") + 1;
int.TryParse(_contentList[index], out var value);
Console.WriteLine(value);
}


public void CreatePdfContent(string filePath)
{
using (var file = new File(filePath))
{
var document = file.Document;

foreach (var page in document.Pages)
{
Extract(new ContentScanner(page));
}
}
}

private void Extract(ContentScanner level)
{
if (level == null)
return;

while (level.MoveNext())
{
var content = level.Current;
switch (content)
{
case ShowText text:
{
var font = level.State.Font;
_contentList.Add(font.Decode(text.Text));
break;
}
case Text _:
case ContainerObject _:
Extract(level.ChildLevel);
break;
}
}
}
}

从 pdf 文件中提取的输入。代码扫描返回以下元素:

INVOICE
0005

PAYMENT DUE BY:
4/19/2019
.etc
.
.
.
Tax
USD TOTAL
171857
18 september 2019

这是结果

5

代码的灵感来自这个link .

关于c# - 在 C# 中从 PDF 中读取基于标签名称的特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56162692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com