繁体   English   中英

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

[英]Converting a PDF file to Base64 to index into Elasticsearch

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

我使用以下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"
    }
  }
}

我点击率为零。 我该怎么办呢?

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

根据文件大小,您只需以二进制模式打开文件并使用编码字符串方法示例:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM