簡體   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