ValueError:在PDF(Python/Flask)上使用open()时嵌入空字节

2024-05-13 18:45:00 发布

您现在位置:Python中文网/ 问答频道 /正文

将PDF从vue.js前端发送到Flask后端时,我遇到以下错误:

ValueError: embedded null byte

我正在添加带有b-form-file的文件。当我在控制台中打印文件时,我可以看到它就在那里。我用axios发送:

extractPayslipData () {
  console.log('Extracting payslip data...')
  const path = `http://localhost:5000/api/extractPayslipData`
  let formData = new FormData()
  formData.append('payslip_file', this.payslip_file)
  formData.append('payslip_type', this.payslip_type)
  var self = this
  Axios.post(path, formData, {
      headers: {
        'Content-Type': 'multipart/form-data'
      }
  }).then(function (response) {
    var extracted_form = response.data['extracted_form']
  }).catch(function (error) {
    console.log(error)
  })
  return
}

我还可以在接收请求的python代码中看到它(pdfObject是一个文件存储对象:

<FileStorage: 'Payslip_to_Print_03_20_2020.pdf' ('application/pdf')>

当我试图打开已通过的文件时出错。前端调用extract_payslip_data(),在那里我可以得到PDF文件(我想它是以字节为单位的)。我想调用payslip_decoder(),这就是错误发生的地方:

def extract_payslip_data():

pdfObject = dict(request.files)
payslip_file = pdfObject['payslip_file'].read()

extracted_form = payslip_decoder(payslip_file)

response = {
    'extracted_form': extracted_form
}

return jsonify(response)



def payslip_decoder(payslip_file):

# creating a pdf file object
pdfFileObj = open(payslip_file, 'rb')

以下是打印文件时显示的示例(长输出的随机摘录):

\xb4|\xca\x04\xa2Ty\xbbE<\x81D\x90%b\x08D\xff\xa9\x89\xff0\xecO\x9a\x99k\xb9\xa8\x8d\x1f\x01-\xd1\x06\xa8\\\xa6\x01\xe4\xe7~\x80\xa2\x12\x01\x92\xb0[\xbe\x02\xfd\xde\xb7`|4P\xdc\xbc\x18\xfd\xd1\x99\xb9\xff,\xe8\xdfw\x85\xcb\x14\x8f\\A\xea\xe78vD$\x83+\x15\xe7\xcd\xac)\xae%@\x03\x02P\x064\xa0\t\xf4\x80\x110\x07L\xe0\x00\x9c\x81\x1b\xf0\x04\xbe`\x1e\x08\x05\x91 \x0e,\x06\\\x90\x06\x84@\x0c\xf2\xc12\xb0\x1a\x14\x83R\xb0\x05\xec\x00\xd5\xa0\x0e4\x82f\xd0\n\x0e\x83Np\x0c\x9c\x06\xe7\xc0%p\x05\xdc\x00\xf7\x80\x0c\x8c\x80\xa7`\x12\xbc\x02\xd3\x10\x04a!2D\x854!}\xc8\x04\xb2\x82\x1c \x164\x17\xf2\x85\x82\xa1\x08(\x0eJ\x82R!\x11$\x85\x96Ak\xa1R\xa8\x1c\xaa\x86\xea\xa1f\xe8[\xe8(t\x1a\xba\x00\rBw\xa0!h\x1c\xfa\x15z\x07#0\t\xa6\xc1\xba\xb0)l\x0b\xb3`/8\x08\x8e\x84\x17\xc1\xa9p\x0e\xbc\x04.\x827\xc3\x95p\x03|\x10\xee\x80O\xc3\x97\xe0\x1b\xb0\x0c~\nO!\x00!"t\xc4\x00a",\x84\x8d\x84"\xf1H\n"FV %H\x05\xd2\x80\xb4"\xddH\x1fr\r\x91!\x13\xc8[\x14\x06EE1PL\x94\x1b*\x00\x15\x85\xe2\xa2rP+P\x9bP\xd5\xa8\xfd\xa8\x0eT/\xea\x1aj\x085\x89\xfa\x88&\xa3u\xd0VhWt :\x16\x9d\x8a\xceG\x17\xa3+\xd0M\xe8v\xf4Y\xf4\r\xf4\x08\xfa\x15\x06\x83\xa1c\xcc0\xce\x98\x00L\x1c&\x1d\xb3\x14\xb3\t\xb3\x0b\xd3\x869\x85\x19\xc4\x0cc\xa6\xb0X\xac&\xd6\n\xeb\x8e\r\xc5r\xb0\x12l1\xb6\n{\x10{\x12{\x15;\x82}\x83#\xe2\xf4q\x0e8?\\<N\x84[\x83\xab\xc0\x1d\xc0\x9d\xc0]\xc5\x8d\xe2\xa6\xf1*x\x13\xbc+>\x14\xcf\xc3\x17\xe2\xcb\xf0\x8d\xf8n\xfce\xfc\x08~\x9a\xa0J0#\xb8\x13"\t\xe9\x84\xd5\x84JB+\xe1,\xe1>\xe1\x05\x91H4$\xba\x10\xc3\x89\x02\xe2*b%\xf1\x10\xf1<q\x88\xf8\x96D!Y\x92\xd8\xa4\x04\x92\x94\xb4\x99\xb4\x8ft\x8at\x87\xf4\x82L&\x9b\x92=\xc9\xf1d\ty3\xb9\x99|\x86\xfc\x90\xfcF\x89\xaad\xa3\x14\xa8\xc4SZ\xa9T\xa3\xd4\xa1tU\xe9\x992^\xd9D\xd9Ky\xb1\xf2\x12\xe5\n\xe5#\xca\x97\x95\'T\xf0*\xa6*l\x15\x8e\xca\n\x95\x1a\x95\xa3*\xb7T\xa6T\xa9\xaa\xf6\xaa\xa1\xaaB\xd5M\xaa\x07T/\xa8\x8eQ\xb0\x14S\x8a/\x85G)\xa2\xec\xa5\x9c\xa1\x0cS\x11\xaa\x11\x95M\xe5R\xd7R\x1b\xa9g\xa9#4\x0c\xcd\x8c\x16HK\xa7\x95\xd2\xbe\xa1\r\xd0&\xd5(j\xb3\xd5\xa2\xd5\n\xd4j\xd4\x8e\xab\xc9\xe8\x08\xdd\x94\x1eH\xcf\xa4\x97\xd1\x0f\xd3o\xd2\xdf\xa9\xeb\xaa{\xa9\xf3\xd57\xaa\xb7\xaa_U\x7f\xad\xa1\xad\xe1\xa9\xc1\xd7(\xd1h\xd3\xb8\xa1\xf1N\x93\xa1\xe9\xab\x99\xa1\xb9U\xb3S\xf3\x81\x16J\xcbR+\\+_k\xb7\xd6Y\xad\tm\x9a\xb6\x9b6W\xbbD\xfb\xb0\xf6]\x1dX\xc7R\'Bg\xa9\xce^\x9d~\x9d)]=]\x7f\xddl\xdd*\xdd3\xba\x13zt=O\xbdt\xbd\xedz\'\xf4\xc6\xf5\xa9\xfas\xf5\x05\xfa\xdb\xf5O\xea?a\xa81\xbc\x18\x99\x8cJF/c\xd2@\xc7 \xc0@jPo0`0mhf\x18e\xb8\xc6\xb0\xcd\xf0\x81\x11\xc1\x88e\x94b\xb4\xdd\xa8\xc7h\xd2X\xdf8\xc4x\x99q\x8b\xf1]\x13\xbc\t\xcb$\xcdd\xa7I\x9f\xc9kS3\xd3\x18\xd3\xf5\xa6\x9d\xa6cf\x1af\x81fK\xccZ\xcc\xee\x9b\x93\xcd=\xccs\xcc\x1b\xcc\xaf[`,X\x16\x19\x16\xbb,\xaeX\xc2\x96\x8e\x96i\x965\x96\x97\xad`+\'+\x81\xd5.\xabAk\xb4\xb5\x8b\xb5\xc8\xba\xc1\xfa\x16\x93\xc4\xf4b\xe61[\x98C6t\x9b`\x9b56\x9d6\xcfl\x8dm\xe3m\xb7\xda\xf6\xd9~\xb4s\xb4\xcb\xb4k\xb4\xbbgO\xb1\x9fg\xbf\xc6\xbe\xdb\xfeW\x07K\x07\xaeC\x8d\xc3\xf5Y\xe4Y~\xb3V\xce\xea\x9a\xf5|\xb6\xd5l\xfe\xec\xdd\xb3o;R\x1dC\x1c\xd7;\xf68~prv\x12;\xb5:\x8d;\x1b;\'9\xd7:\xdfb\xd1Xa\xacM\xac\xf3.h\x17o\x97\x95.\xc7\\\xde\xba:\xb9J\\\x0f\xbb\xfe\xe2\xc6t\xcbp;\xe066\xc7l\x0e\x7fN\xe3\x9cawCw\x8e{\

我能做些什么来解决这个问题?谢谢


Tags: formfilex00payslipxa9xb0xbcxa8
1条回答
网友
1楼 · 发布于 2024-05-13 18:45:00

您可以将文件保存在临时文件夹中,然后将其打开

import tempfile

payslip_file = request.files.get('payslip_file')
file_name = xyz.ext

# Create temp dir
temp_local_dir = tempfile.mkdtemp()
file_path = os.path.join(temp_local_dir, file_name)

payslip_file.stream.seek(0)
payslip_file.save(file_path)
payslip_file.close()

pdfFileObj  = open(file_path, 'rb')


# Delete temp file after use
if os.path.exists(file_path):
   os.remove(file_path) # Delete file

相关问题 更多 >