我需要运行一些分析,从PDF文档中提取数据。
使用iTextSharp
,我使用PdfTextExtractor.GetTextFromPage
方法从PDF文档中提取内容,并在一条长行中返回给我。
有没有办法逐行获取文本,以便我可以将它们存储在数组中?这样我就可以逐行分析数据,这将更灵活。
以下是我使用的代码:
string urlFileName1 = "pdf_link";
PdfReader reader = new PdfReader(urlFileName1);
string text = string.Empty;
for (int page = 1; page <= reader.NumberOfPages; page++)
{
text += PdfTextExtractor.GetTextFromPage(reader, page);
}
reader.Close();
candidate3.Text = text.ToString();
答案 0 :(得分:8)
public void ExtractTextFromPdf(string path)
{
using (PdfReader reader = new PdfReader(path))
{
StringBuilder text = new StringBuilder();
ITextExtractionStrategy Strategy = new iTextSharp.text.pdf.parser.LocationTextExtractionStrategy();
for (int i = 1; i <= reader.NumberOfPages; i++)
{
string page = "";
page = PdfTextExtractor.GetTextFromPage(reader, i,Strategy);
string[] lines = page.Split('\n');
foreach (string line in lines)
{
MessageBox.Show(line);
}
}
}
}
答案 1 :(得分:1)
LocationTextExtractionStrategy将自动插入&#39; \ n&#39;在输出文本中。但是,有时它会插入&#39; \ n&#39;它不应该在哪里。 在这种情况下,您需要构建自定义TextExtractionStrategy或RenderListener。基本上,检测换行的代码是方法
public virtual bool SameLine(ITextChunkLocation other) {
return OrientationMagnitude == other.OrientationMagnitude &&
DistPerpendicular == other.DistPerpendicular;
}
在某些情况下&#39; \ n&#39;如果DistPerpendicular和other.DistPerpendicular之间只有很小的差异,则不应插入,因此您需要将其更改为类似Math.Abs(DistPerpendicular - other.DistPerpendicular)&lt; 10
或者您可以将这段代码放在自定义TextExtractionStrategy / RenderListener类的RenderText方法中
答案 2 :(得分:1)
这里的所有其他代码示例都不适合我,这可能是由于itext7 API的更改所致。
这里的最小示例可以正常工作:
var pdfReader = new iText.Kernel.Pdf.PdfReader(fileName);
var pdfDocument = new iText.Kernel.Pdf.PdfDocument(pdfReader);
var contents = iText.Kernel.Pdf.Canvas.Parser.PdfTextExtractor.GetTextFromPage(pdfDocument.GetFirstPage());
答案 3 :(得分:0)
使用LocationTextExtractionStrategy代替SimpleTextExtractionStrategy。 LocationTextExtractionStrategy提取的文本包含行尾的新行字符。
ITextExtractionStrategy Strategy = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), renderFilter);
string pdftext = PdfTextExtractor.GetTextFromPage(reader,pageno, Strategy);
string[] words = pdftext.Split('\n');
return words;
答案 4 :(得分:0)
我知道这是在一个较旧的帖子上发布的,但是我花了很多时间试图弄清楚这一点,因此我将与以后尝试使用此google的人们分享一下:
using System;
using System.Text;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;
namespace PDFApp2
{
class Program
{
static void Main(string[] args)
{
string filePath = @"Your said path\the file name.pdf";
string outPath = @"the output said path\the text file name.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 iTextSharp.text.pdf.parser.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 (System.IO.StreamWriter file = new System.IO.StreamWriter(outPath, true))
{
file.WriteLine(line);
}
}
}
reader.Close();
}
catch (Exception ex)
{
Console.Write(ex);
}
}
}
}
我让程序从设置的路径中读取PDF,并仅输出到文本文件,但是您可以对任何内容进行操作。这是建立在Snziv Gupta的回应之上的。
答案 5 :(得分:-2)
尝试
String page = PdfTextExtractor.getTextFromPage(reader, 2);
String s1[]=page.split("\n");