Извлечь значение из файла PDF в переменную - PullRequest
2 голосов
/ 08 февраля 2020

Я пытаюсь получить "Номер счета", в данном случае INV-3337 из файла PDF и хотел бы сохранить его как переменную для будущего использования в коде.

В настоящее время я работаю над примером и использую этот PDF для тестирования: https://slicedinvoices.com/pdf/wordpress-pdf-invoice-plugin-sample.pdf

С моим текущим кодом я могу проанализировать весь контент до .txt формат. Кто-нибудь может подсказать мне, как получить только необходимое значение и сохранить его в переменной? Можно ли это сделать напрямую с помощью itextsharp? Или мне нужно сначала проанализировать все в файл .txt, затем разобрать файл .txt, сохранить значение как переменную, удалить файл .txt и продолжить?

Примечание! В реальной настройке будет много файлов PDF для анализа.

Вот мой текущий код:

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


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

            string filePath = @"C:\temp\parser\Invoice_Template.pdf";
            string outPath = @"C:\temp\parser\Invoice_Template.txt";
            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)
                    {
                        //Creating and appending to a text file
                        using (StreamWriter file = new StreamWriter(outPath, true))
                        {
                            file.WriteLine(line);
                        }
                    }
                }

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

РЕДАКТИРОВАТЬ:

Я правильно понял?

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


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

            string filePath = @"C:\temp\parser\Invoice_Template.pdf";
            string outPath = @"C:\temp\parser\Invoice_Template.txt";
            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)
                    {
                        //Creating and appending to a text file
                        using (StreamWriter file = new StreamWriter(outPath, true))
                        {
                            // file.WriteLine(line);

                           int indexOccurrance = line.LastIndexOf("Invoice Number");
                           if(indexOccurrance > 0)
                           {
                           var invoiceNumber = line.Substring(indexOccurrance, (line.Length - indexOccurrance) );
                           }
                        }
                    }
                }

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

1 Ответ

0 голосов
/ 08 февраля 2020

Один из вариантов - поиск "Invoice Number" в тексте каждой строки, используя LastIndexOf. Если найдено, используйте Substring, чтобы получить остаток этой строки (который будет Invoice Number)

Что-то вроде:

int indexOccurrance = line.LastIndexOf("Invoice Number");
if(indexOccurrance > 0)
{
  var invoiceNumber = line.Substring(indexOccurrance, (line.Length - indexOccurrance) );
}
...