2

PDFからテキストを抽出するためにpython2.7とPDFminerを使用しています。PDFminerで奇妙な文字の単語が表示されることがありますが、pdfビューアでは表示されないことがあります。また、PDFminerと他のpdfビューアによって返される一部のpdfドキュメントの結果は同じです(奇妙な)が、pdfビューアがテキストを認識できるドキュメント(コピーアンドペースト)があります。戻り値の例を次に示します。

pdfビューアから:فتــح بـــاب ا�ستيــرادالبيــ�ض والدجــــاجالمجمـــد from PDFMiner:ªéªdG êÉ````LódGh ¢†``«ÑdG OGô``«à°SG ÜÉóHí``àa

だから私の質問は、PDFビューアと同じ結果を得ることができるか、そしてPDFminerの何が問題になっているのかということです。私が知らないエンコーディングが欠落していますか?

4

2 に答える 2

2

はい。

これは、identity-H、identity-Vなどのカスタムフォントエンコーディングが使用されているが、フォントが適切に埋め込まれていない場合に発生します。

pdfminerは、テキストを解釈するためにエンコードが必要なため、このような場合にガベージ出力を提供します

于 2012-12-04T12:39:27.090 に答える
0

読もうとしている 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 か月前だったため、元のソースを失いました。このコードの一部を入手した元の投稿を誰かが見つけた場合は、私に知らせてください。そうすれば、コードに値するクレジットを与えることができます。

于 2016-11-19T21:41:59.213 に答える