2017-09-25 7 views
0

다음은 pdf에서 텍스트를 추출하는 데 사용하는 코드입니다 (iText for.Net 버전 7.0.4.0 사용). 테스트 중 관찰 한 것은 PDF의 대부분의 사각형 내에서 내용을 추출하여 잘 작동한다는 것입니다. 그러나 그 중 일부는 전체 라인을 제공합니다. 나도 알아iText (.Net)를 사용하여 사각형에서 텍스트를 추출하면 전체 줄이 표시됩니다.

rect와 교차하는 텍스트 조각 (텍스트의 일부가 rect이 아니므로 iText는 조각으로 텍스트 조각을 자르지 않음)을 알고 있습니다.

그러나 PDF의 어떤 매개 변수가 iText에서 텍스트를 분리하는 데 사용되는지 알고 싶습니다.

 var reader = new PdfReader(filePath); 
     PdfDocument pdfDoc = new PdfDocument(reader); 

     var addressRect = new Rectangle(33, 190, 70, 42); // 

     var addressRegionFilter = new TextRegionEventFilter(addressRect); 
     var filterListener = new FilteredTextEventListener(new LocationTextExtractionStrategy(), addressRegionFilter); 
     var addressText = PdfTextExtractor.GetTextFromPage(pdfDoc.GetPage(1), filterListener); 

     pdfDoc.Close(); 
+0

사용중인 기능이 버전간에 변경되었습니다. 당신이 묘사하는 행동은 초기 버전의 행동을 생각 나게합니다. 그 동작은 이후 버전에서 변경되었습니다. 어쩌면 문제는 이후 버전에서 재현 할 수 없습니다. 그것은 왜 아무도 당신의 질문에 대답하지 않는 이유를 설명 할 것입니다. –

+0

당신은 iTextSharp (iText)의 버전 또는 내가 추출하려고하는 PDF 버전을 언급하고 있습니까? 필요한 경우 자세한 내용을 제공 할 수 있습니다. – Sridhar

+0

iText 버전을 언급하고 있습니다. Sharp라는 단어를 사용하는 다른 브랜드를 좋아하지 않는 Sharp라는 회사가 있기 때문에 더 이상 iTextSharp라는 이름을 사용하지 않습니다. iText for Java와 iText for .NET에 대해 이야기합니다. –

답변

2

트릭을 수행해야합니다.

class RectangleTextExtractionStrategy implements ITextExtractionStrategy 
{ 

    private ITextExtractionStrategy innerStrategy = null; 
    private Rectangle rectangle; 

    public RectangleTextExtractionStrategy(ITextExtractionStrategy strategy, Rectangle rectangle) 
    { 
     this.innerStrategy = strategy; 
     this.rectangle = rectangle; 
    } 

    @Override 
    public String getResultantText() { 
     return innerStrategy.getResultantText(); 
    } 

    @Override 
    public void eventOccurred(IEventData iEventData, EventType eventType) { 
     if(eventType != EventType.RENDER_TEXT) 
      return; 
     TextRenderInfo tri = (TextRenderInfo) iEventData; 
     for(TextRenderInfo subTri : tri.getCharacterRenderInfos()) 
     { 
      Rectangle r2 = new CharacterRenderInfo(subTri).getBoundingBox(); 
      if(intersects(r2)) 
       innerStrategy.eventOccurred(subTri, EventType.RENDER_TEXT); 
     } 
    } 

    private boolean intersects(Rectangle rectangle) 
    { 
     // # TODO 
     return true; 
    } 

    @Override 
    public Set<EventType> getSupportedEvents() { 
     return innerStrategy.getSupportedEvents(); 
    } 
} 

여기에 들어있는 모든 TextRenderInfo 개체를 해당 문자의 해당 이벤트로 분할하는 것이 좋습니다. 그런 다음 (검색 영역에있는 경우) 호출을 다른 ITextExtractionStrategy에 위임합니다.

+0

고맙습니다! !! 교차에 필요한 코드를 추가했습니다. 어떤 사람이 위 코드의 C# 버전을 필요로하는지 알려주세요. – Sridhar