어쩌면 당신은 읽으려고하는 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가 필요합니다. 다른 스택 오버플로 답변에 대한 제안을 따라했지만 한 달 전 이었으므로 원본 소스를 잃어 버렸습니다. 누구든지이 코드 조각이있는 원래 게시물을 발견하면 알려 주시기 바랍니다. 코드에 대한 크레딧을 줄 수 있습니다.