用python打开没有文本的pdf

时间:2018-09-17 20:25:47

标签: django python-3.x

我想为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上怎么说不是文字而是图片?

2 个答案:

答案 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编码通常可以正常工作