חילוץ טקסט מ PDF
-
אני משתמש בitextsharp
הנה קוד בVB
Private Function ReadPdfFile(fileName As String) As String Dim text As New StringBuilder() If File.Exists(fileName) Then Dim pdfReader As New PdfReader(fileName) 'For page As Integer = 1 To pdfReader.NumberOfPages Dim strategy As parser.ITextExtractionStrategy = New parser.SimpleTextExtractionStrategy() Dim currentText As String = parser.PdfTextExtractor.GetTextFromPage(pdfReader, 1, strategy) currentText = New String(currentText.Reverse().ToArray) text.Append(currentText) 'Next pdfReader.Close() End If Return text.ToString() End Function
פורסם במקור בפורום CODE613 ב26/07/2013 15:00 (+03:00)
-
תודה רבה זה ממש מצויין! פעם אחרונה שראיתי קוד שמשתמש בסיפריה הזו לחילוץ טקסט מ PDF היה הכל בג'יבריש...
אבל זה ממש מצוייןרק הבעיה שהוא מביא את השורות מסוף העמוד לתחילתו ברוורס...
לכן היתי צריך לכתוב קצת אחרת את הפונקציות הבאות:Private Function ReadPdfFile2(fileName As String) As String Dim text As New StringBuilder() If File.Exists(fileName) Then Dim pdfReader As New pdf.PdfReader(fileName) For page As Integer = 1 To pdfReader.NumberOfPages text.AppendLine(parser.PdfTextExtractor.GetHebTextFromPage( pdfReader, page) & vbCrLf) Next pdfReader.Close() End If Return text.ToString() End Function
כמו שאתם רואים יש פה פונקציה חדשה שנקראת GetHebTextFromPage שלא קיימת בספריית ITEXT זו עוד פונקציה שהיתי צריך להוסיף
public static String GetHebTextFromPage(PdfReader reader, int pageNumber) { PdfReaderContentParser parser = new PdfReaderContentParser(reader); return parser.ProcessContent(pageNumber, new LocationTextExtractionStrategy()).GetResultantHebText(); }
ועוד פונקציה אחרונה חדשה
public string Reverse(string input) { char[] chars = input.ToCharArray(); Array.Reverse(chars); return new String(chars); } public virtual String GetResultantHebText() { if (DUMP_STATE) DumpState(); locationalResult.Sort(); StringBuilder sb = new StringBuilder(); StringBuilder sb2 = new StringBuilder(); TextChunk lastChunk = null; foreach (TextChunk chunk in locationalResult) { if (lastChunk == null) { sb2.Append(chunk.text[0] > 127 ? chunk.text : Reverse(chunk.text)); } else { if (chunk.SameLine(lastChunk)) { sb2.Append(chunk.text[0] > 127 ? chunk.text : Reverse(chunk.text)); } else { sb2.Append(chunk.text[0] > 127 ? chunk.text : Reverse(chunk.text)); sb.AppendLine(Reverse(sb2.ToString())); sb2 = new StringBuilder(); } } lastChunk = chunk; } return sb.ToString(); }
פורסם במקור בפורום CODE613 ב26/07/2013 16:28 (+03:00)
-
סליחה שאני כותב עוד לפני שקראתי הכל ובדקתי לעומק, אבל כדי לא לבזבז זמן אשאל את המנוסים כבר, אפשר לחלץ בעיקרון טקסט לפי מיקום מדוייק של קווי X-Y כלומר יש לי ריבוע שקבוע נמצא שם תעודת זהות, האם אני יכול פשוט לגשת לריבוע לפי מיקום פיזי במסמך.
תודה.פורסם במקור בפורום CODE613 ב22/07/2014 20:54 (+03:00)
-
https://github.com/modesty/pdf2json
נראה שזה יכול לתת טקסט עם מיקום.
פורסם במקור בפורום CODE613 ב22/07/2014 22:02 (+03:00)
-
-
@דוד ל.ט.
אתה לא אמור להוציא לפי מיקום.
אם זה תמיד במיקום מסויים, אז זה בהכרח גם במבנה זהה, ואתה יכול להוציא לפי מבנה. לדוגמה הפסקה החמישית.אם זה לא כטקסט אלא כפיקסלים אתה צריך להוציא אכן לפי מיקום.
אני מבין וחשבתי ע"ז יש שם מידע שהמחלקה של אייטקסט לא מזהה אותו וכנראה צריך OCR למזלי זה מידע של ספרות כך שאין צורך ב OCR עברי. חבל שאני לא יכול להעלות את הקובץ, מדובר במידע שמגיע ממשרדי ממשלה ונוגע לפרטיות של אנשים.... (לערוך את הקובץ PDF כדי לטשטש את המידע האישי צריך תוכנה, ואין לי את התוכנה לעריכת PDF זה צריך להגיע אלי בדואר רשום ממקסיקו עוד מאתיים שנה :lol: :lol: :lol: :lol: )
פורסם במקור בפורום CODE613 ב23/07/2014 17:41 (+03:00)