2013-12-11 1 views
5

iTextSharp 라이브러리를 사용하여 PDF의 텍스트를 문자열로 읽으려고합니다..NET에서 PDF의 텍스트 읽기

iTextSharp.text.pdf.PdfReader pdfReader = new iTextSharp.text.pdf.PdfReader(@"C:\mypdf.pdf"); 
ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy(); 
string currentText = PdfTextExtractor.GetTextFromPage(pdfReader, 1, strategy); 
text = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(currentText))); 
pdfReader.Close(); 
Console.WriteLine(text); 

이것은 일반적으로 OK 작동하지만, 모든 몇 줄은 공백이 같은 출력으로 나를 떠나 생략한다 "thisismyoutputwithoutwhitespace". 올바르게 구문 분석 한 텍스트는 그렇지 않은 텍스트와 같습니다. 동일한 텍스트가 일관되게 부정확하게 파싱되어 PDF 내에서 뭔가있는 것으로 생각됩니다.

답변

6

PDF의 콘텐츠 스트림에는 "단어"라는 개념이 없습니다. iText (Sharp)의 텍스트 추출 구현에는 문자를 단어로 그룹화하는 방법을 결정하는 몇 가지 발견법이 있습니다. 2 문자 사이의 거리가 현재 글꼴의 공백 너비의 절반보다 큰 경우 공백이 삽입됩니다.

공백없이 추출 된 텍스트는 "spacewidth/2"보다 작은 단어 사이의 거리를 가질 가능성이 큽니다. SimpleTextExtractionStrategy.RenderText()에서

:

if (spacing > renderInfo.GetSingleSpaceWidth()/2f){ 
    AppendTextChunk(' '); 
} 

당신은 SimpleTextExtractionStrategy을 확장하고 RenderText()을 조정할 수 있습니다.

LocationTextExtractionStrategy에서 더 편리합니다. 당신은 IsChunkAtWordBoundary()를 재정의해야합니다

protected bool IsChunkAtWordBoundary(TextChunk chunk, TextChunk previousChunk) { 
    float dist = chunk.DistanceFromEndOf(previousChunk); 
    if(dist < -chunk.CharSpaceWidth || dist > chunk.CharSpaceWidth/2.0f) 
     return true; 

    return false; 
} 

당신은 당신의 PDF 파일에 대한 좋은 결과를 얻기 위해 약간의 실험을해야합니다. "spacewidth/2"는 분명히 너의 경우에는 너무 큽니다. 하지만 너무 작게 조정하면 가양 성이 생깁니다. 단어 내에 공백이 삽입됩니다.

+0

대단히 감사합니다! 이것은 매우 도움이됩니다. 그러나 IsChunkAtBounary()를 재정의 할 수 있습니까? 나는 "추상, 가상으로 표시되지 않기 때문에 무시할 수 없습니다.". 새로운 클래스 인 LocationTextExtractionStrategy를 확장하고 메서드를 재정의했습니다. –

+0

이것은 Java에서 C#으로 이식하는 오류 인 것 같습니다. 이 문제가 다음 릴리스에서 수정되었는지 확인하겠습니다. 이 문제를 해결하려면 LocationTextExtractionStrategy 코드를 복사해야 완전히 새로운 ITextExtractionStrategy 인터페이스 구현을 효과적으로 생성 할 수 있습니다. 새 구현에서는 isChunkAtWordBoundary 메소드를 조정할 수 있습니다. 나는 가장 깨끗한 해결책이 아니라는 것을 안다. 나는 C#에 익숙하지 않다. 어쩌면 더 많은 C# 경험을 가진 사람이보다 우아한 해결책을 생각할 수 있습니다. – rhens

+0

LocationTextExtractionStrategy 소스 코드를 사용할 수없는 경우 여기 (최신 버전)에서 찾을 수 있습니다. http://sourceforge.net/p/itextsharp/code/HEAD/tree/trunk/src/core/iTextSharp /text/pdf/parser/LocationTextExtractionStrategy.cs – rhens