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

pro*_*011 4 c# pdf itext pdfparser

我有一个asp.net Core 2.0 C#读取/解析P​​DF文件并获取文本的应用程序。在此,我想读取具有特定标签名称的特定值。你可以看到下面的图片我想要得到的价值171857Invoice数量并将其存储在数据库中。 在此处输入图片说明

我已经尝试过使用以下代码读取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阅读器库一样?

任何帮助或建议,将不胜感激。

谢谢

may*_*ʎɐɯ 6

我帮助一个朋友从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)

该代码的灵感来自于此链接