在django中显示PDF;解码错误

时间:2011-07-29 18:39:20

标签: django pdf encoding

我正在尝试将PDF传递到Django应用程序,并且遇到了unicode /解码PDF的问题。 PDF存储在mysb数据库中,位于中等字段中。我很感激任何帮助,因为看起来编码遇到了PDF的元数据问题,我不知道该怎么做 - 我已经检查了几个看似相似的问题但可以找不到我要找的东西。我需要以某种方式解码/重新编码PDF吗?谢谢!

这是错误:

Request Method:     POST
Request URL:    http://0.0.0.0:8000/admin/pdf/abc/
Exception Type:     DjangoUnicodeDecodeError
Exception Value:    'utf8' codec can't decode byte 0x89 in position 614: unexpected code byte
Exception Location:     /usr/lib/python2.5/site-packages/django/utils/encoding.py in  force_unicode, line 92
Python Executable:  /usr/bin/python

我的代码如下:

class ABCAdmin(admin.ModelAdmin):

actions = ['print_selected_pdf']

def get_user(self):
    return '%s'%(self.user.username)

def create_pdf(self, queryset):
    response = HttpResponse(mimetype="applicaton/pdf")
    response['Content-Disposition'] = 'attachment; filename=form.pdf'


    p=canvas.Canvas(response)
    # loop through the objects
    for  obj in queryset:
         string1 = (obj.form)

        # update the label_printed to true
         obj.pdf_printed=True
         obj.save()

    p.save()
    return response

def print_selected_pdf(self, request, queryset):
    # prints the pdfs for those that are selected,
    # regardless if the pdf_printed field is true or false
    return self.create_pdf(queryset.order_by('user'))

print_selected_pdf.short_description = "Print selected PDF"
get_user.short_description='Printed By'

list_display=('form_no',get_user,'request_date','pdf_printed')

def queryset(self,request):
    # get the user id
    user = User.objects.get(username=request.user)

    if request.user.is_superuser:
        qs = self.model._default_manager.all()
    else:
        qs = self.model._default_manager.filter(user=user.id)
    return qs

def formfield_for_foreignkey(self, db_field, request, **kwargs):
    if db_field.name == "user" and not request.user.is_superuser:
        # get the user id
        user = User.objects.get(username=request.user)
        kwargs["queryset"]=User.objects.filter(id=user.id)
        return db_field.formfield(**kwargs)
    return super(ABCAdmin,self).formfield_for_foreignkey(
        db_field, request, **kwargs)

admin.site.register(ABC, ABCAdmin)

编辑:完全引用:

Environment:

Request Method: POST
Request URL: http://0.0.0.0:8000/admin/pdf/abc/
Django Version: 1.1
Python Version: 2.5.2
Installed Applications:
['django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.admin',
 'app.pdf']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware')


Traceback:
File "/usr/lib/python2.5/site-packages/django/core/handlers/base.py" in get_response
  92.                 response = callback(request, *callback_args, **callback_kwargs)
File "/usr/lib/python2.5/site-packages/django/contrib/admin/options.py" in wrapper
  226.                 return self.admin_site.admin_view(view)(*args, **kwargs)
File "/usr/lib/python2.5/site-packages/django/views/decorators/cache.py" in    _wrapped_view_func
  44.         response = view_func(request, *args, **kwargs)
File "/usr/lib/python2.5/site-packages/django/contrib/admin/sites.py" in inner
  186.             return view(request, *args, **kwargs)
File "/usr/lib/python2.5/site-packages/django/contrib/admin/options.py" in   changelist_view
  912.             response = self.response_action(request,queryset=cl.get_query_set())
File "/usr/lib/python2.5/site-packages/django/contrib/admin/options.py" in  response_action
  694.             response = func(self, request, queryset.filter(pk__in=selected))
File ".../pdf/admin.py" in print_selected_pdf
  56.         return self.create_pdf(queryset.order_by('user'))
File ".../pdf/admin.py" in create_pdf
  48.              obj.save()
File "/usr/lib/python2.5/site-packages/django/db/models/base.py" in save
  410.         self.save_base(force_insert=force_insert, force_update=force_update)
File "/usr/lib/python2.5/site-packages/django/db/models/base.py" in save_base
  474.                         rows = manager.filter(pk=pk_val)._update(values)
File "/usr/lib/python2.5/site-packages/django/db/models/query.py" in _update
  444.         return query.execute_sql(None)
File "/usr/lib/python2.5/site-packages/django/db/models/sql/subqueries.py" in execute_sql
  120.         cursor = super(UpdateQuery, self).execute_sql(result_type)
File "/usr/lib/python2.5/site-packages/django/db/models/sql/query.py" in execute_sql
  2369.         cursor.execute(sql, params)
File "/usr/lib/python2.5/site-packages/django/db/backends/util.py" in execute
  22.             sql = self.db.ops.last_executed_query(self.cursor, sql, params)
File "/usr/lib/python2.5/site-packages/django/db/backends/__init__.py" in last_executed_query
  213.             u_params = tuple([to_unicode(val) for val in params])
File "/usr/lib/python2.5/site-packages/django/db/backends/__init__.py" in <lambda>
  211.         to_unicode = lambda s: force_unicode(s, strings_only=True)
File "/usr/lib/python2.5/site-packages/django/utils/encoding.py" in force_unicode
  92.         raise DjangoUnicodeDecodeError(s, *e.args)

异常类型:/ admin / pdf / abc /中的DjangoUnicodeDecodeError 异常值:'utf8'编解码器无法解码614位的字节0x89:意外的代码字节。你传入[编辑了长度 - 这里显示了PDF中的所有元数据]

2 个答案:

答案 0 :(得分:4)

  

PDF存储在mysql数据库中,位于中等字段中。

你刚刚输掉比赛。请改用FileField

答案 1 :(得分:0)

我不得不使用查询集来避免解码错误。在我的情况下,Filefield不实用。