我想为Django视图打开PDF,但是我的PDF没有文本,而python返回了一个空白PDF。 在每个页面上,这是对页面的扫描:link
from django.http import HttpResponse
def views_pdf(request, path):
with open(path) as pdf:
response = HttpResponse(pdf.read(),content_type='application/pdf')
response['Content-Disposition'] = 'inline;elec'
return response
异常类型:UnicodeDecodeError
异常值:'charmap'编解码器无法解码位置373中的字节0x9d:字符映射到
Unicode错误提示
无法编码/解码的字符串是:��������
在Python上怎么说不是文字而是图片?
答案 0 :(得分:0)
默认情况下,Python 3以文本模式打开文件,也就是说,它试图将文件的内容解释为文本。这就是导致您看到的异常的原因。
由于PDF文件通常是二进制文件,请尝试以二进制模式打开文件。在这种情况下,read()
将返回一个bytes
对象。
这是一个示例(在IPython中)。首先,以文字开头:
In [1]: with open('2377_001.pdf') as pdf:
...: data = pdf.read()
...:
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
<ipython-input-1-d807b6ccea6e> in <module>()
1 with open('2377_001.pdf') as pdf:
----> 2 data = pdf.read()
3
/usr/local/lib/python3.6/codecs.py in decode(self, input, final)
319 # decode input (taking the buffer into account)
320 data = self.buffer + input
--> 321 (result, consumed) = self._buffer_decode(data, self.errors, final)
322 # keep undecoded input until the next call
323 self.buffer = data[consumed:]
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe2 in position 10: invalid continuation byte
接下来,以二进制模式读取同一文件:
In [2]: with open('2377_001.pdf', 'rb') as pdf:
...: data = pdf.read()
...:
In [3]: type(data)
Out[3]: bytes
In [4]: len(data)
Out[4]: 45659
In [5]: data[:10]
Out[5]: b'%PDF-1.4\n%'
这解决了第一部分,即如何读取数据。
第二部分是如何将其传递给HttpResponse
。根据{{3}}:
“典型用法是将页面内容作为字符串传递给
HttpResponse
构造函数”
因此,传递bytes
可能会或可能不会(我没有安装Django进行测试)。 Django documentation说:
“
content
应该是迭代器或字符串。”
我发现以下要点可以写入二进制数据:
from django.http import HttpResponse
def django_file_download_view(request):
filepath = '/path/to/file.xlsx'
with open(filepath, 'rb') as fp: # Small fix to read as binary.
data = fp.read()
filename = 'some-filename.xlsx'
response = HttpResponse(mimetype="application/ms-excel")
response['Content-Disposition'] = 'attachment; filename=%s' % filename # force browser to download file
response.write(data)
return response
答案 1 :(得分:0)
问题可能是您尝试使用的文件未使用正确的编码类型。您可以轻松地在大多数pdf查看器中找到pdf的编码,例如adobe acrobat(在属性中)。找到使用的编码后,可以将其提供给Python,如下所示:
替换
with open(path) as pdf:
与:
with open(path, encoding="whatever encoding your pdf is in") as pdf:
尝试Latin-1
编码通常可以正常工作