pro*_*011 4 c# pdf itext pdfparser
我有一个asp.net Core 2.0 C#读取/解析PDF文件并获取文本的应用程序。在此,我想读取具有特定标签名称的特定值。你可以看到下面的图片我想要得到的价值171857是Invoice数量并将其存储在数据库中。

我已经尝试过使用以下代码读取pdf iTextSharp。
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();
}
Run Code Online (Sandbox Code Playgroud)
在pdfText变量中,我将从pdf中获取所有文本内容,但这似乎不是获取发票编号的正确方法。还有其他方法可以通过其标签名称从pdf读取pdf的特定内容,例如我们将提供标签名称Invoice,并且它将返回值171857,例如与其他第三方pdf阅读器库一样?
任何帮助或建议,将不胜感激。
谢谢
我帮助一个朋友从Excel arc生成的pdf发票中提取了相似的值。为此,我创建了一个Excel发票并将其打印为PDF文件,并压缩以供下载以进行测试。
接下来,我正在使用一个名为PDFClown的开源和免费库。这是它的nuget包。
到目前为止,我所做的是我扫描了所有pdf文档(例如发票可以是一页或多页),并将每个内容添加到字符串列表中。
下一步,我找到引用发票值的索引(索引编号索引可能在列表中的第10个元素中,在本例中为索引1),我将其称为“标签”或“标签”。
因此,我没有您的pdf文件,我即兴创作并添加了一个唯一的标签(或其他名称)“ INVOICE ”。在这种情况下,发票编号位于发票标记标签之后。因此,我找到“ INVOICE”标签的索引,并在索引中添加1,这是因为发票编号紧随发票标签之后。这样,在这种情况下,我将选择发票文本0005并将其作为值5返回。这样,您可以获取每个文本/值以及列表中扫描的任何标签的内容,并以所需的方式返回。
因此,您需要稍微玩一下才能使其100%适合pdf文件。
所以这是我的测试文件Excel和Pdf 压缩了。下载它进行测试。
这是代码:
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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
输入是从pdf文件中提取的。代码扫描返回以下元素:
INVOICE
0005
PAYMENT DUE BY:
4/19/2019
.etc
.
.
.
Tax
USD TOTAL
171857
18 september 2019
Run Code Online (Sandbox Code Playgroud)
这是结果
5
Run Code Online (Sandbox Code Playgroud)
该代码的灵感来自于此链接。