I need to run some analysis my extracting data from a PDF document.
Using iTextSharp
, I used the PdfTextExtractor.GetTextFromPage
method to extract contents from a PDF document and it returned me in a single long line.
Is there a way to get the text by line so that i can store them in an array? So that i can analyze the data by line which will be more flexible.
Below is the code I used:
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();
86 Answers
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); } } } }
1I know this is posting on an older post, but I spent a lot of time trying to figure this out so I'm going to share this for the future people trying to google this:
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); } } } }
I had the program read in a PDF, from a set path, and just output to a text file, but you can manipulate that to anything. This was building off of Snziv Gupta's response.
All the other code samples here didn't work for me, probably due to changes to the itext7 API.
This minimal example here works ok:
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());
1LocationTextExtractionStrategy will automatically insert '\n' in the output text. However, sometimes it will insert '\n' where it shouldn't. In that case you need to build a custom TextExtractionStrategy or RenderListener. Bascially the code that detects newline is the method
public virtual bool SameLine(ITextChunkLocation other) { return OrientationMagnitude == other.OrientationMagnitude && DistPerpendicular == other.DistPerpendicular; }
In some cases '\n' shouldn't be inserted if there is only small difference between DistPerpendicular and other.DistPerpendicular, so you need to change it to something like Math.Abs(DistPerpendicular - other.DistPerpendicular) < 10
Or you can put that piece of code in the RenderText method of your custom TextExtractionStrategy/RenderListener class
Use LocationTextExtractionStrategy in lieu of SimpleTextExtractionStrategy. LocationTextExtractionStrategy extracted text contains the new line character at the end of line.
ITextExtractionStrategy Strategy = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), renderFilter); string pdftext = PdfTextExtractor.GetTextFromPage(reader,pageno, Strategy); string[] words = pdftext.Split('\n'); return words;
0Try
String page = PdfTextExtractor.getTextFromPage(reader, 2); String s1[]=page.split("\n");
ncG1vNJzZmirpJawrLvVnqmfpJ%2Bse6S7zGiorp2jqbawutJoaG5vZG2FcXyOnq%2BtqpGYwW7AxLGrZpqpYrmqusRmnaunnWK9pbKMrqqippditrWx162qoZmipXqkedKhmKuo