在python中将pdf的字符串表示转换为字节的某种方法

时间:2018-09-06 15:53:52

标签: python python-3.x pdf flask byte

我实际上正在尝试做一些我不知道是否可以做的事情。

问题:

我有一个Web客户端和一个Web服务器,该服务器(使用flask以python编写)处理pdf文件以获取一些数据,而客户端仅发送pdf文件并等待响应。这种想法是,客户端可以发送各种pdf文件进行处理,而我想做的就是,仅需一个请求即可将所有pdf文件从客户端发送到服务器。

我计划要做的事情:

我正在考虑将每个pdf的Blob转换为字符串,并发送带有JSON正文的POST请求,如下所示:

BODY:
  {
    "content":[
        {"name": "pdf_name_1.pdf", "data": "some blob data converted to string"},
        {"name": "pdf_name_2.pdf", "data": "some blob data converted to string"},
        {"name": "pdf_name_3.pdf", "data": "some blob data converted to string"},
        ...
    ]
}

因此,然后在服务器中,我正在考虑将数据再次转换为blob(字节),以便记下pdf文件并开始处理数据。

我的问题:

有什么方法可以将pdf的str表示形式转换为字节,以便用python在磁盘上写下pdf?

非常感谢,如果有人提出另一种想法仅在一个请求中发送一堆pdf,请告诉我。

pd:我正在将python 3.5和Flask用于Web服务器。

1 个答案:

答案 0 :(得分:0)

在这种情况下,最好发送通过 files 关键字传递的文件数据,如下所示:

import requests


def send_pdf_data(filename_list, encoded_pdf_data):
    files = {}

    for (filename, encoded, index) in zip(filename_list, encoded_pdf_data, range(len(filename_list))):
        files[f"pdf_name_[index].pdf"] = (filename, open(filename, 'rb'), 'application/pdf')

    data = {}
    # *Put whatever you want in data dict*

    requests.post("http://yourserveradders", data=data, files=files)


def main():
    filename_list = ["pdf_name_1.pdf", "pdf_name_2.pdf"]
    pdf_blob_data = [open(filename, 'wb').read() for filename
                     in filename_list]

if __name__ == '__main__':
    main()

但是,如果您真的想将数据作为json传递,则应使用base-64模块,如@Mark Ransom所述。

您可以通过以下方式实现它:

import requests
import json
import base64


def encode(data: bytes):
    """
    Return base-64 encoded value of binary data.
    """
    return base64.b64encode(data)


def decode(data: str):
    """
    Return decoded value of a base-64 encoded string.
    """
    return base64.b64decode(data.encode())


def get_pdf_data(filename):
    """
    Open pdf file in binary mode,
    return a string encoded in base-64.
    """
    with open(filename, 'rb') as file:
        return encode(file.read())


def send_pdf_data(filename_list, encoded_pdf_data):
    data = {}
    # *Put whatever you want in data dict*
    # Create content dict.
    content = [dict([("name", filename), ("data", pdf_data)])
               for (filename, data) in zip(filename_list, encoded_pdf_data)]
    data["content"] = content

    data = json.dumps(data) # Convert it to json.
    requests.post("http://yourserveradders", data=data)


def main():
    filename_list = ["pdf_name_1.pdf", "pdf_name_2.pdf"]
    pdf_blob_data = [get_pdf_data(filename) for filename
                     in filename_list]

if __name__ == '__main__':
    main()