C# 使用iTextC从PDF中逐行提取文本#

C# 使用iTextC从PDF中逐行提取文本#,c#,pdf,itext,extract,carriage-return,C#,Pdf,Itext,Extract,Carriage Return,我需要运行一些分析,从PDF文档中提取数据 使用iTextSharp,我使用了pdftextractor.GetTextFromPage方法从PDF文档中提取内容,它以一行长线返回我 有没有办法逐行获取文本,以便将它们存储在数组中?这样我就可以按行分析数据,这将更加灵活 下面是我使用的代码: string urlFileName1 = "pdf_link"; PdfReader reader = new PdfReader(urlFileName1);

我需要运行一些分析,从PDF文档中提取数据


使用
iTextSharp
,我使用了
pdftextractor.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();
string urlFileName1=“pdf\u链接”;
PdfReader reader=新的PdfReader(urlFileName1);
string text=string.Empty;
对于(int page=1;pageTry


使用LocationTextExtractionStrategy代替SimpleTextExtractionStrategy。LocationTextExtractionStrategy提取的文本在行尾包含新行字符

ITextExtractionStrategy Strategy = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), renderFilter);
string pdftext = PdfTextExtractor.GetTextFromPage(reader,pageno, Strategy);
string[] words = pdftext.Split('\n');
return words;
public void ExtractTextFromPdf(字符串路径)
{
使用(PdfReader读取器=新PdfReader(路径))
{
StringBuilder text=新的StringBuilder();
itextractionstrategy Strategy=new iTextSharp.text.pdf.parser.LocationTextExtractionStrategy();

对于(int i=1;iLocationTextExtractionStrategy将自动在输出文本中插入“\n”。但是,有时它会在不应该插入的地方插入“\n”。 在这种情况下,您需要构建一个自定义的TextExtractionStrategy或RenderListener

public virtual bool SameLine(ITextChunkLocation other) {
            return OrientationMagnitude == other.OrientationMagnitude &&
                   DistPerpendicular == other.DistPerpendicular;
        }
在某些情况下,如果distvertical和other.distvertical之间只有很小的差异,则不应插入“\n”,因此需要将其更改为类似Math.Abs(distvertical-other.distvertical)<10的值


或者,您可以将这段代码放入自定义TextExtractionStrategy/RenderListener类的RenderText方法中

我知道这是在一篇较旧的帖子上发布的,但我花了很多时间试图弄清楚这一点,因此我将与未来尝试谷歌搜索的人分享:

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);
        }
    }
}
}
使用系统;
使用系统文本;
使用iTextSharp.text.pdf;
使用iTextSharp.text.pdf.parser;
名称空间PDFApp2
{
班级计划
{
静态void Main(字符串[]参数)
{
字符串filePath=@“您所说的路径\文件名.pdf”;
字符串outPath=@“输出所述路径\文本文件名.txt”;
int pagesToScan=2;
string strText=string.Empty;
尝试
{
PdfReader reader=新的PdfReader(文件路径);

对于(int page=1;page这里的所有其他代码示例对我都不起作用,可能是由于ITEXT7API的更改

这里的这个最小示例可以正常工作:

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());

Xander
几个问题..首先,
PdfReader(urFileName
)`是否在调用过程中同时读取所有行..?如果是这样,则可能需要将for循环更改为while循环,并调用
reader.ReadLine()
method..我正在查看如何使用StreamReader类正常读取。请告诉我是否有.ReadLine()方法检查此链接outHi@DJKRAZE是的PdfReader(urlFileName1)一次读取所有行。我认为没有.ReadLine()方法方法。转到他们的,但找不到它。您可以做一个示例来说明while循环的含义吗?查看此
上一个Stackoverflow
发布它应该为您指出正确的方向
PdfTextExtractor.GetTextFromPage(阅读器,第页)
使用
LocationTextExtractionStrategy
,该策略在文本行更改时插入
'\n'
。如果您不这样做,则有可疑之处。因此,您能否提供PDF供检查?请尝试文本。替换(“\n”,“
”)在发布答案时,请始终包含一些关于代码工作方式及其确切功能的摘要。仅发布代码片段通常是不够的。GetTextFromPage有一个重载,允许您传递iTextractionStrategy。
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);
        }
    }
}
}
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());