2012-10-01 4 views
1

나는 pdf에서 텍스트를 추출하는 데 python2.7 및 PDFminer를 사용하고 있습니다. 나는 때로는 PDFminer가 이상한 글자로 된 말을하지만 pdf 시청자는 그렇지 않다는 것을 알아 차렸다. 또한 일부 PDF 문서의 경우 PDFminer 및 기타 PDF 뷰어가 반환 한 결과는 동일하지만 (이상한) PDF 뷰어가 텍스트 (복사하여 붙여 넣기)를 인식 할 수있는 문서가 있습니다.PDFminer 이상한 문자를 제공

의 PDF 뷰어 : 여기에 반환 된 값의 예입니다 فتح باب استيراد البيض والدجاج المجمد PDFMiner에서 :

그래서 내 질문은 ªéªdG êÉ````LódGh ¢†``«ÑdG OGô``«à°SG ÜÉ H의 í``àa O 나는 같은 얻을 수 있습니다 pdf 뷰어로 결과 및 PDFminer에 문제가있는 경우 내가 모르는 인코딩이 누락 되었습니까?

답변

1

예.

맞춤 글꼴 인코딩이 사용 된 경우 등이 이에 해당합니다. identity-H, identity-V 등이 있지만 글꼴은 제대로 포함되지 않았습니다. 인코딩이 텍스트

0

어쩌면 당신은 읽으려고하는 PDF 파일이 아직 pdfMiner에서 지원하지 않는 인코딩이 있습니다를 해석하는 데 필요하기 때문에

pdfminer는 이러한 경우에 쓰레기 출력을 제공합니다.

나는 지난 달 비슷한 문제가 있었고 마침내 "pdfBox"라는 자바 라이브러리를 사용하여 파이썬에서 호출하여 해결했습니다. pdfBox 라이브러리는 내가 필요로하고 매력처럼 작동하는 인코딩을 지원합니다!.

먼저 official site 에서 pdfbox를 다운로드 한 다음 내 코드에서 .jar 파일의 경로를 참조했습니다.

다음은 사용 된 코드의 단순화 된 버전입니다 (테스트되지 않았지만 원래 테스트 된 코드를 기반으로합니다). 당신은 당신이 pip install subprocess32

import subprocess32 as subprocess 
import os 
import tempfile 

def extractPdf(file_path, pdfboxPath, timeout=30, encoding='UTF-8'): 
    #tempfile = temp_file(data, suffix='.pdf') 
    try: 
     command_args = ['java', '-jar', os.path.expanduser(pdfboxPath), 'ExtractText', '-console', '-encoding', encoding, file_path] 
     status, stdout, stderr = external_process(command_args, timeout=timeout) 
    except subprocess.TimeoutExpired: 
     raise RunnableError('PDFBox timed out while processing document') 
    finally: 
     pass#os.remove(tempfile) 

    if status != 0: 
     raise RunnableError('PDFBox returned error status code {0}.\nPossible error:\n{1}'.format(status, stderr)) 

    # We can use result from PDFBox directly, no manipulation needed 
    pdf_plain_text = stdout 
    return pdf_plain_text 

def external_process(process_args, input_data='', timeout=None): 
    process = subprocess.Popen(process_args, 
           stdout=subprocess.PIPE, 
           stdin=subprocess.PIPE, 
           stderr=subprocess.PIPE) 
    try: 
     (stdout, stderr) = process.communicate(input_data, timeout) 
    except subprocess.TimeoutExpired as e: 
     # cleanup process 
     # see https://docs.python.org/3.3/library/subprocess.html?highlight=subprocess#subprocess.Popen.communicate 
     process.kill() 
     process.communicate() 
     raise e 

    exit_status = process.returncode 
    return (exit_status, stdout, stderr) 


def temp_file(data, suffix=''): 
    handle, file_path = tempfile.mkstemp(suffix=suffix) 
    f = os.fdopen(handle, 'w') 
    f.write(data) 
    f.close() 
    return file_path 

if __name__ == '__main__': 
    text = extractPdf(filename, 'pdfbox-app-2.0.3.jar') 

` 이 코드는 전적으로 나를에 의해 작성되지 않았습니다를 호출하여 설치할 수있는, subprocess32가 필요합니다. 다른 스택 오버플로 답변에 대한 제안을 따라했지만 한 달 전 이었으므로 원본 소스를 잃어 버렸습니다. 누구든지이 코드 조각이있는 원래 게시물을 발견하면 알려 주시기 바랍니다. 코드에 대한 크레딧을 줄 수 있습니다.

관련 문제