将PDF文件解析到内存中并搜索特定值

问题描述 投票:0回答:1

我对整个C#东西还很陌生,并尝试以更实际的方式学习它,以获取更多的兴趣和理解。我有一个解析PDF https://slicedinvoices.com/pdf/wordpress-pdf-invoice-plugin-sample.pdf文件并且运行良好的代码。但是,我想写内存而不是控制台,以便以后从中搜索InvoiceNumber。

我当前用于写入控制台的代码:

using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace PDF_file_reader
{
    class Program
    {
        static void Main(string[] args)
        {

            List<int> InvoiceNumbers = new List<int>();

            string filePath = @"C:\temp\parser\Invoice_Template.pdf";
            int pagesToScan = 2;

            string strText = string.Empty;
            try
            {
                PdfReader reader = new PdfReader(filePath);

                for (int page = 1; page <= pagesToScan; page++) //(int page = 1; page <= reader.NumberOfPages; page++) <- for scanning all the pages in A PDF
                {
                    ITextExtractionStrategy its = new LocationTextExtractionStrategy();
                    strText = PdfTextExtractor.GetTextFromPage(reader, page, its);

                    strText = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(strText)));
                    //creating the string array and storing the PDF line by line
                    string[] lines = strText.Split('\n');
                    foreach (string line in lines)
                    {
                        {
                            //Console.WriteLine($"<{line}>");
                            Console.WriteLine(line.ToString());
                        }
                    }

                    Console.Read();
                }

            }
            catch (Exception ex)
            {
                Console.Write(ex);
            }
        }
    }
}

这是控制台中的输出:

enter image description here

如何写入InvoiceNumbers列表而不是控制台,我现在在做什么,并从中进行搜索?我猜用当前的设置搜索是不可能的?

c# itext
1个回答
0
投票

仅需注意,在{周围的}循环中还有一组额外的foreach Console.Writeline(),可以删除。

如果您要存储屏幕快照中突出显示的整个发票号(“ INV-3337”,而不仅仅是“ 3337”,则InvoiceNumbers必须是字符串列表,而不是整数。

我假设发票总是一样的,或者号码总是一样的格式(即“发票号'INV-####”),您可以在[C0 ]循环。由于每个foreach是一个字符串,因此您可以检查line是否包含“发票编号”。如果是这样,则可以将其添加到line并删除短语“发票编号”。然后修剪它以消除任何空格。在InvoiceNumbers之上或之下,您只需添加:

Console.Writeline(line.ToString());

((我使用if (line.Contains("Invoice Number")) InvoiceNumbers.Add(line.Replace("Invoice Number", "").Trim()); 而不是Replace(),因为您可能需要知道要删除的词组的开始和结束位置。在我看来,Remove()是在这种特殊情况下最安全的路线)] >

您也可以在Replace()语句中添加break;。这将停止if循环。提取发票编号后,就没有理由浏览文档的其余部分,除非一个文档中有多个发票。

foreach

如果要在列表中搜索特定的发票编号,if (line.Contains("Invoice Number")) { InvoiceNumbers.Add(line.Replace("Invoice Number", "").Trim()); break; } 应该可以帮助您。

这是假定

,唯一的区别是实际数字。如果不是,您可以始终查看this answer并寻找“ INV- \ d *”之类的模式。也可以假设发票编号格式始终相同。
© www.soinside.com 2019 - 2024. All rights reserved.