PDFminer给出奇怪的字母

2024-09-24 22:31:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用python2.7和PDFminer从pdf中提取文本。我注意到,有时候PDFminer会给我一些带有奇怪字母的单词,但是pdf查看器没有。另外,对于某些pdf文档,PDFminer返回的结果与其他pdf查看器相同(奇怪),但是有些文档中pdf查看器可以识别文本(复制粘贴)。以下是返回值的示例:

从pdf格式的浏览者:‫ف; ; ; ; ;ب 157; 157;يي160;;1590;; 15157;1604;;;\158; 1583;ج\ \160;\1604;مجمـــد 来自PDFMiner:oªéªdG êÉ````LódGh ¢†``«ÑdG OGô``«à°SG ÜÉH``a

所以我的问题是我能得到和pdf阅读器一样的结果吗?PDFminer有什么问题吗。我不知道它是否缺少编码。在


Tags: 文档文本示例pdf格式字母单词pdfminer
2条回答

可能您尝试读取的PDF文件的编码尚不受pdfMiner的支持。在

上个月我遇到了一个类似的问题,最后通过使用名为“pdfBox”的java库并从python调用它来解决它。pdfBox库支持我需要的编码,工作起来很有魅力!。在

首先我从official site下载了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')

在` 这段代码不是完全由我写的。我遵循了其他堆栈溢出答案的建议,但那是一个月前的事了,所以我丢失了原始源代码。如果有人找到我得到这些代码片段的原始帖子,请让我知道,这样我就可以给他们应得的代码学分。在

是的。在

如果使用了自定义字体编码,例如identity-H、identity-V等,但字体没有正确嵌入,就会发生这种情况。在

在这种情况下,pdfminer会给出垃圾输出,因为需要编码来解释文本

相关问题 更多 >