将PDF文件转换为Base64以索引到Elasticsearch

时间:2015-07-08 21:34:02

标签: python pdf elasticsearch

我需要将PDF索引到Elasticsearch。为此,我需要将文件转换为base64。我将使用Attachment Mapping

我使用以下Python代码将文件转换为Base64编码的字符串:

from elasticsearch import Elasticsearch
import base64
import constants

def index_pdf(pdf_filename):
    encoded = ""
    with open(pdf_filename) as f:
        data = f.readlines()
        for line in data:
            encoded += base64.b64encode(f.readline())
    return encoded

if __name__ == "__main__":
    encoded_pdf = index_pdf("Test.pdf")
    INDEX_DSL = {
        "pdf_id": "1",
        "text": encoded_pdf
    }
    constants.ES_CLIENT.index(
            index=constants.INDEX_NAME,
            doc_type=constants.TYPE_NAME,
            body=INDEX_DSL,
            id="1"
    )

索引的创建以及文档索引工作正常。唯一的问题是,我不认为该文件已经以正确的方式编码。我尝试使用在线工具对该文件进行编码,并且得到了一个完全不同的编码,与我使用Python的编码相比,这个编码更大。

这是PDF文件。

我尝试按照插件文档中的建议查询文本数据。

GET index_pdf/pdf/_search
{
  "query": {
    "match": {
      "text": "piece text"
    }
  }
}

我给出了零点击率。我应该怎么做呢?

1 个答案:

答案 0 :(得分:3)

编码片段不正确,它以“文本”模式打开pdf文件。

根据文件大小,您只需以二进制模式打开文件并使用encode string method 例如:

def pdf_encode(pdf_filename):
    return open(pdf_filename,"rb").read().encode("base64");

或者如果文件大小很大,你可能不得不将编码分解成块而没有查看是否有模块这样做但它可以像下面的示例代码一样简单:

 def chunk_24_read(pdf_filename) :
    with open(pdf_filename,"rb") as f:
        byte = f.read(3)
        while(byte) :
            yield  byte
            byte = f.read(3)


def pdf_encode(pdf_filename):
    encoded = ""
    length = 0
    for data in chunk_24_read(pdf_filename):
        for char in base64.b64encode(data) :
            if(length  and  length % 76 == 0):
               encoded += "\n"
               length = 0

            encoded += char  
            length += 1
    return encoded