2015-01-13 2 views
4

이 테이블의 데이터를 가져 오려고합니다. PDF입니다. 필자는 pdfminer와 pypdf를 약간의 노력으로 해봤지만 실제로 테이블에서 데이터를 가져올 수는 없습니다.pdf에서 테이블 추출

이 같은 테이블 중 하나가 모습입니다 : 당신이 볼 수 있듯이, 일부 열은 'X'로 표시됩니다 enter image description here

. 나는이 테이블에 객체의리스트를 넣으 려하고있다.

이 코드는 지금까지 pdfminer를 사용하고 있습니다.

# pdfminer test 
from pdfminer.pdfdocument import PDFDocument 
from pdfminer.pdfparser import PDFParser 
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter 
from pdfminer.pdfdevice import PDFDevice, TagExtractor 
from pdfminer.pdfpage import PDFPage, PDFTextExtractionNotAllowed 
from pdfminer.converter import XMLConverter, HTMLConverter, TextConverter, PDFPageAggregator 
from pdfminer.cmapdb import CMapDB 
from pdfminer.layout import LAParams, LTTextBox, LTTextLine, LTFigure, LTImage 
from pdfminer.image import ImageWriter 
from cStringIO import StringIO 
import sys 
import os 


def pdfToText(path): 
    rsrcmgr = PDFResourceManager() 
    retstr = StringIO() 
    codec = 'utf-8' 
    laparams = LAParams() 
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams) 
    fp = file(path, 'rb') 
    interpreter = PDFPageInterpreter(rsrcmgr, device) 
    password = '' 
    maxpages = 0 
    caching = True 
    pagenos = set() 

    records = [] 
    i = 1 
    for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password, 
            caching=caching, check_extractable=True): 
     # process page 
     interpreter.process_page(page) 

     # only select lines from the line containing 'Tool' to the line containing "1 The 'All'" 
     lines = retstr.getvalue().splitlines() 

     idx = containsSubString(lines, 'Tool') 
     lines = lines[idx+1:] 
     idx = containsSubString(lines, "1 The 'All'") 
     lines = lines[:idx] 

     for line in lines: 
      records.append(line) 
     i += 1 

    fp.close() 
    device.close() 
    retstr.close() 

    return records 


def containsSubString(list, substring): 
    # find a substring in a list item 
    for i, s in enumerate(list): 
     if substring in s: 
      return i 
    return -1 


# process pdf 
fn = '../test1.pdf' 
ft = 'test.txt' 

text = pdfToText(fn) 
outFile = open(ft, 'w') 
for i in range(0, len(text)): 
    outFile.write(text[i]) 
outFile.close() 

텍스트 파일을 생성하고 텍스트를 모두 가져 오지만 x는 공백을 유지하지 않습니다. 출력은 다음과 같습니다는 X 그냥 하나의

현재 텍스트 문서에서 이격되어있다 enter image description here

, 난 그냥 텍스트 출력 생산하고있어하지만 내 목표는의 데이터로 HTML 문서를 생산하는 것입니다 테이블. 나는 OCR 예제를 찾고 있었고, 대부분은 혼란 스럽거나 불완전한 것으로 보인다. 나는 C#이나 다른 언어를 사용하여 내가 원하는 결과를 얻을 수있다.

EDIT : 테이블 데이터를 가져와야하는 이와 같은 다중 pdfs가 있습니다. 헤더는 모든 pdfs에 대해 동일합니다 (아는 한 멀리).

+0

메모장에서 고정 폭 글꼴을 사용하고 있습니까? 그렇지 않은 경우 모든 배팅이 해제됩니다. –

+0

Windows를 사용하는 경우 Cygwin을 사용할 수 있습니다. –

+0

모노 스페이스 글꼴을 사용 중이며 cygwin을 사용할 수 있습니다. – user

답변

1

나는 그것을 알아 냈다. 나는 잘못된 방향으로 가고 있었다. 내가 한 일은 pdf에서 각 테이블의 png를 작성한 후 opencv & python을 사용하여 이미지를 처리하는 것입니다.

+2

접근 방식을보다 자세하게 설명해 주시겠습니까? 어떻게 테이블을 뽑았 니? 어떤 유형의 이미지 세분화를 사용 했습니까? – sdk

2

시도해보십시오 Tabula 그리고 작동하는 경우 tabula-extractor library (루비로 작성)을 사용하여 프로그래밍 방식으로 데이터를 추출하십시오.

+0

타뷸라가 거의 일했습니다. 대부분의 테이블을 보지만 x의 일부는 같은 셀에 있습니다. – user