2014-10-22 3 views
1

여기 내 코드입니다 : 이것은 내가 때까지 ... 걸쳐 실행 한 거의 모든 PDF 파일 작동iTextSharp가 N 대신 1..N 페이지를 읽는 이유는 무엇입니까?

var sb = new StringBuilder(); 
var st = new SimpleTextExtractionStrategy(); 
string raw; 
using(var r = new iTextSharp.text.pdf.PdfReader(path)) { 
    for(int pn = 1; pn <= r.NumberOfPages; pn++) { 
     raw = iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(r, pn, st); 
     sb.Append(raw); 
    } 
} 

오늘 :

이 PDF를 들어

http://www7.dleg.state.mi.us/orr/Files/AdminCode/356_10334_AdminCode.pdf

(같은에 그것과 같은 다른 사이트)에서 1 페이지의 텍스트가 추출되었지만 2 페이지의 텍스트에 1 2가 포함되어 있고 페이지 3에 1-3 같은 페이지가 들어 있습니다. 따라서 StringBuilder은 1, 1, 2, 1, 2, 3, 1, 2, 3, 4 등

기본 위치 기반 전략을 사용하면 동일한 문제가 발생하며 어쨌든이 특정 PDF에서는 작동하지 않습니다.

iTextSharp (5.1-ish?)의 이전 버전에서 최근에 업그레이드되었으며 이전에이 문제가 발생하지 않았습니다. 이전에 이러한 파일 중 일부를 문제없이 파싱 한 것으로 보입니다. 나는 소스를 뚫고 뚜렷한 것을 보지 못했습니다.

마지막 페이지 만 묻는 것으로 해결할 수 있다고 생각했지만 작동하지 않습니다. 마지막 페이지 만 가져옵니다. 루프를 하드 코딩하여 2..4 페이지를 얻으면 2, 2, 3, 2, 3, 4가됩니다. 따라서 PdfReaderGetTextFromPage을 호출하는 동안 유지되는 데이터 일 수 있습니다.

답변

2
은 이런 식으로 코드를 변경

:

var sb = new StringBuilder(); 
string raw; 
using(var r = new iTextSharp.text.pdf.PdfReader(path)) { 
    for(int pn = 1; pn <= r.NumberOfPages; pn++) { 
     var st = new SimpleTextExtractionStrategy(); 
     raw = iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(r, pn, st); 
     sb.Append(raw); 
    } 
} 

업데이트를 MKL의 의견에 따라 : 전략은 직면 된 모든 페이지의 내용을 기억합니다. 따라서 아직 아무 것도 버퍼링하지 않고 추출하려는 경우 신선한 전략을 사용해야합니다.

+1

@ richardtallent 코드에 대한 주요 문제점이 무엇인지 궁금하다면 : 전략은 그것이 직면 한 모든 페이지 내용을 기억합니다. 따라서 아직 아무 것도 버퍼링하지 않고 추출하려는 경우 신선한 전략을 사용해야합니다. – mkl

+0

고마워! 나는 "전략"이라고 불리는 객체의 부작용을 기대하지 않고 있었고, 다른 이유로 인해 리팩토링 할 때 전략 인스턴스화를 루프 외부로 옮기는 것을 기억합니다. 루프 안쪽으로 다시 이동했는데 다시 훌륭한 작업으로 돌아 왔습니다. – richardtallent