[英]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.