将 PDF 文件解析到内存并执行搜索特定值
Parse PDF file to memory and perform search for certain value
我对整个 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);
}
}
}
}
这是控制台中的输出:
如何将我现在正在做的事情写入 InvoiceNumbers 列表而不是控制台并从中执行搜索?我想用我当前的设置搜索是不可能的?
请注意,在围绕 Console.Writeline()
的 foreach
循环中有一组额外的 {
}
,您可以将其删除。
如果您想存储在屏幕截图中突出显示的整个发票编号("INV-3337" 而不仅仅是“3337”),InvoiceNumbers
需要是字符串列表,而不是整数.
我假设发票总是相同的,或者数字总是相同的格式(即 "Invoice Number 'INV-####"),您可以在 foreach
中添加一行环形。由于每个 line
都是一个字符串,您可以检查 line
是否包含 "Invoice Number"。如果是,您可以将其添加到 InvoiceNumbers
并删除短语 "Invoice Number"。然后 trim 它去掉任何空格。高于或低于 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 应该会有所帮助。
这是假设唯一的区别是实际数字。如果不是,您可以随时查看 regular expressions 并让它寻找像 "INV-\d*" 这样的模式。这也假设发票编号格式始终相同。
我对整个 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);
}
}
}
}
这是控制台中的输出:
如何将我现在正在做的事情写入 InvoiceNumbers 列表而不是控制台并从中执行搜索?我想用我当前的设置搜索是不可能的?
请注意,在围绕 Console.Writeline()
的 foreach
循环中有一组额外的 {
}
,您可以将其删除。
如果您想存储在屏幕截图中突出显示的整个发票编号("INV-3337" 而不仅仅是“3337”),InvoiceNumbers
需要是字符串列表,而不是整数.
我假设发票总是相同的,或者数字总是相同的格式(即 "Invoice Number 'INV-####"),您可以在 foreach
中添加一行环形。由于每个 line
都是一个字符串,您可以检查 line
是否包含 "Invoice Number"。如果是,您可以将其添加到 InvoiceNumbers
并删除短语 "Invoice Number"。然后 trim 它去掉任何空格。高于或低于 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 应该会有所帮助。
这是假设唯一的区别是实际数字。如果不是,您可以随时查看 regular expressions 并让它寻找像 "INV-\d*" 这样的模式。这也假设发票编号格式始终相同。