2011-01-11 6 views
2

PDF에서 PDF를 추출하려면 PDFBox를 사용하고 있습니다. PDF는 매우 단순한 테이블 형식의 구조를 가지고 있으며 각 열은 매우 넓습니다.PDFBox 텍스트 추출에서 "긴"공백 유지

모든 종류의 가로 공간이 하나의 공백 문자로 변환된다는 것을 제외하고는 실제로 잘 작동합니다. 더 이상 열을 구분할 수 없습니다 (열 사이의 공백은 열 사이의 공백처럼 보입니다).

일반적인 솔루션은 매우 어렵지만,이 경우에는 열이 실제로 멀리 떨어져 있으므로 "긴 공백"과 "단어 사이의 공백"을 쉽게 구분할 수 있습니다.

x 인치 이상의 가로 공백을 하나의 공간이 아닌 다른 것으로 변환하도록 PDFBox에 지시하는 방법이 있습니까? 비례적인 접근법 (x inch가 y 공백이 됨)도 가능합니다.

pdftotext C library/tool에는 '-layout'스위치가있어 레이아웃을 유지하려고합니다. 기본적으로, 내가 PDFBox로 에뮬레이션 할 수 있다면, 완벽 할 것입니다.

+0

[이 답변] (https://stackoverflow.com/a/45842515/1729265)을 참조하십시오. – mkl

답변

2

이 설정이없는 것 같지만 "긴"공간이있을 때 PDFTextStripper 도구가 열 구분 기호 (|)를 출력하도록 원본을 수정할 수있었습니다. 출력 선을 작성하는 코드에서 현재 및 이전 문자의 x 위치를 볼 수 있으며, 충분히 큰 경우 특별한 것을하십시오. PDFTextStripper는 많은 보호 된 메소드를 가지고 있지만 실제로 확장 할 수있는 것은 아닙니다. 개인 수업을 변경하기 위해 수업 전체를 복사해야했습니다.

코드를 살펴보면, 특정 PDF에서이 간단한 접근 방식이 성공했다는 것이 나에게 행운이라고 말합니다. 좀 더 일반적인 해결책은 매우 까다로운 것 같습니다.

+1

어떤 개인적인 방법을 바꾸어야 했습니까? 어떻게 변경 했습니까? –

1

PDF 텍스트 추출이 어렵습니다.

텍스트 인 경우 출력을 하나의 큰 문자열은 다음과 같은 공간으로 분리로 -

PDFTextOut("  Column 1     Column 2   Column 3"); 

하고는 쿠리어으로 고정 폭 폰트를 사용하고이 후 이론적 아이템 사이의 공간의 수를 계산할 수있다 텍스트는 각 문자가 동일한 너비이므로 글꼴이 그러한 Arial에 비례하면 계산이 더 어려워집니다.

사실 대부분의 PDF는 각 텍스트를 개별적으로 해당 위치에 배치하여 생성됩니다. 따라서 기술적으로 공백 문자 나 열 사이의 다른 문자는 없습니다. 텍스트는 페이지의 절대 위치에 배치됩니다. 당신이 찾아 치열 데이터 당신이 언급 한 것처럼 픽셀 위치를 사용하여 몇 가지 가정을하고 조금함으로써하기 위해 조금 더 많은 작업을해야 PDF 문서에 데이터 추출을 수행하기 위해

PDFMoveTo(100,100); 
PDFTextOut("Column 1"); 
PDFMoveTo(250,100); 
PDFTextOut("Column 2"); 

운.

+1

글쎄, PDF 텍스트 추출은 어렵지만 xpdf의 pdftotext의 레이아웃 보존 옵션은 잘 작동합니다. PDFBox와 비슷한 것을 사용하는 것이 좋을 것입니다. 이미 읽기 순서를 유지하고, 같은 줄에 같은 줄에 텍스트를 넣고, 단어를 글자로 묶는 데 성공했습니다. 평문 출력이 다음 구문 분석 논리 (테이블을 재구성해야 함)에 대해 충분히 명확한 지 여부는 또 다른 질문입니다. 다행히도, 제 경우에는 효과가있었습니다. – Thilo