Разобрать файл PDF в память и выполнить поиск по определенному значению - PullRequest
0 голосов
/ 12 февраля 2020

Я довольно новичок во всем этом и пытаюсь изучить его более практичным способом, чтобы собрать больше интереса и понимания. У меня есть код, который разбирает файл 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);
            }
        }
    }
}

Вот вывод в console:

enter image description here

Как записать список InvoiceNumbers вместо Console, что я сейчас делаю, и выполнить поиск по нему? Я думаю, с моей текущей настройкой поиск будет невозможен?

1 Ответ

1 голос
/ 13 февраля 2020

Просто заметка, у вас есть дополнительный набор { } в вашем foreach l oop, окружающем Console.Writeline(), который вы можете удалить.

Если вы хотите сохранить все номер счета, как он выделен на вашем скриншоте («INV-3337» вместо просто «3337»), InvoiceNumbers должен быть списком строк, а не целых.

Я предполагаю, что счет всегда идет чтобы быть одинаковым, или число всегда будет одинакового формата (т. е. "номер счета 'INV - ####"), вы можете просто добавить строку в ваш foreach l oop. Поскольку каждый 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 l oop. После извлечения номера счета-фактуры нет смысла просматривать остальную часть документа, если только у вас нет нескольких счетов-фактур в одном документе.

if (line.Contains("Invoice Number"))
{
    InvoiceNumbers.Add(line.Replace("Invoice Number", "").Trim());
    break;
}

Если вы хотите выполнить поиск в списке для конкретного счета-фактуры число, этот ответ должен помочь с этим.

Это при условии , что единственной разницей будет фактическое число. Если это не так, вы всегда можете взглянуть на регулярные выражения и заставить его искать шаблон типа "INV- \ d *". Это также предполагает, что формат номера счета всегда один и тот же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...