読もうとしている PDF ファイルには、pdfMiner でまだサポートされていないエンコーディングが含まれている可能性があります。
先月同様の問題があり、「pdfBox」という名前のJavaライブラリを使用してPythonから呼び出すことで最終的に解決しました。pdfBox ライブラリは、私が必要とするエンコーディングをサポートし、魅力的に機能しました!.
まず、公式サイトから pdfbox をダウンロード
し、コードから .jar ファイルへのパスを参照しました。
これは、私が使用したコードの簡略化されたバージョンです (テストされていませんが、元のテスト済みコードに基づいています)。呼び出してインストールできる subprocess32 が必要です。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')
` このコードはすべて私が書いたものではありません. 他のスタック オーバーフローの回答の提案に従いましたが、1 か月前だったため、元のソースを失いました。このコードの一部を入手した元の投稿を誰かが見つけた場合は、私に知らせてください。そうすれば、コードに値するクレジットを与えることができます。