2017-10-14 3 views
1

Je crée une application avec Django. Je veux générer le pdf quand je regarde le lien choisi. J'ai donc utilisé weasyprint module pour convertir mon pdf. J'importe le module de weasyprint. Mais quand je cours cette application, j'ai trouvé une erreur. Ce est views.py fichierUnicodeDecodeError: Django Générer un PDF avec weasyprint

def customersProfile(request, customer_id, sys_type): 
    sys_type=sys_type 
    area="profile" 
    site_credit = site_credit1 
    time_now=timezone.now() 
    customers=get_object_or_404(CustomerInfo, pk=customer_id) 

    html_string = render_to_string('shop/profile.html', {'customers': customers, 'todaydate': today_date,'site_name': 'Moon Telecom', 'time_now': time_now, 'site_credit': site_credit, 'area': area}) 
    html = HTML(string=html_string) 
    result = html.write_pdf() 


    response = HttpResponse(content_type='application/pdf;') 
    response['Content-Disposition'] = 'inline; filename=list_people.pdf' 
    response['Content-Transfer-Encoding'] = 'binary' 
    with tempfile.NamedTemporaryFile(delete=True) as output: 
     output.write(result) 
     output.flush() 
     output = open(output.name, 'r') 
     response.write(output.read()) 

    return response 

Ceci est fichier HTML. Je veux créer pdf ce fichier html.

<!DOCTYPE html> 
<html> 

<head> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> 
</head> 

<body style> 

    <div class="container"> 
     <div class="row"> 
      <div class="col-lg-12"> 
       <div class="site_title" style="text-align:center; margin:0 auto"> 
        <h3>মুন টেলিকম</h3> 
        <h3> 
         <a href="{% url 'shop:index' %}" target="_blank">{{site_name}}</a> 
        </h3> 
        <div class="invoice_info_one" style="width:100%; text-align:center"> 
         <p>সকল প্রকার মোবাইল সেট, সীম কার্ড, মেমোরী কার্ড, MP-3, সোলার চার্জার, সোলার ফ্যান, মোবাইল ফোনের ব্যাটারী, চার্জার, ক্যাচিং,কাভার,হেডফোন, রেবন, ডিসপ্লে এবং ইলেট্রিক মালামাল বিক্রেতা</p> 
        </div> 
        <div class="invoice_location"> 
         <p>জাহাঙ্গীর সুপার মার্কেট, ব্রীজ রোড, ফুলহাতা বাজার, মোডেলগঞ্জ।</p> 
        </div> 
        <div class="invoice_contact"> 
         <p>01717-051200(সুকান্ত) 01828-163858(দোকান)</p> 
         <p><b>Email:</b> [email protected]</p> 
        </div> 
        <div class="copy_right"> 
         {% if site_credit %} 
         <p>{{site_credit}}</p> 
         {% else %} 
          <a href="{% url 'shop:nothing' %}">#</a> 
         {% endif %} 
         <p></p> 
        </div> 


        <hr> 
       </div> 
      </div> 
     </div> 
     <div class="container"> 
      <div class="row"> 
       <div class="col-lg-12"> 
        <div class="customer_info"> 
         {% if customers.customer_name %} 
         <h2 style="font-size:15px">Customer Name: 
          <b> {{customers.customer_name}}</b> 
         </h2> 
         {% else %} <p> Name: দেওয়া হয়নি</p> {% endif %} 

         <p style="font-size:14px">Phone Number: 
          {% if customers.customer_mobile_no %} 
          {{customers.customer_mobile_no}} 
          {% else %} 
          No Mobile Number 
          {% endif %} 
         </p> 
         <p style="font-size:14px">Purchase Time: {{customers.customer_sell_date}}</p> 
         <p style="font-size:14px">invoice id: <b>{{customers.customer_uid}}</b></p> 
         <p>{{customers.product_warrenty}}</p> 
        </div> 

       </div> 
      </div> 
     </div> 
     <div class="table table-bordered"> 

      <table class="table"> 
       <thead> 
        <tr> 


         <th>Product Name</th> 
         <th>Product ID</th> 
         <th>Warrenty</th> 
         <th>QN</th> 
         <th>Price</th> 

        </tr> 
       </thead> 
       <tbody> 
        <tr> 


         <td>{{customers.customer_product_name}}</td> 
         <td>{{customers.customer_product_id}}</td> 

         <td>{% if customers.customer_product_warrenty == '' %} 
         <b>No Warrenty</b> 
         {% else %} 
         <b> {{customers.customer_product_warrenty}}</b> Month</td> 
         {% endif %} 
         <td>{{customers.customer_product_quantity}}</td> 

         <td>{{customers.customer_price}} Taka</td> 


        </tr> 

       </tbody> 
       <tr> 
        <td colspan="3"></td> 

        <td colspan="1"> 
         <b>Total Amount</b> 
        </td> 
        <td colspan="1"> 
         <b>{{customers.customer_price}}</b> Taka</td> 
       </tr> 
      </table> 
      {% if customers.customer_conditions %} 
      <div class="warning"> 
       <p style="font-size:8px; width:500px;line-height:15px;"><i>{{customers.customer_product_name}} {{customers.customer_conditions}}</i></p> 
      </div> 
      {% else %} {% endif %} 




     </div> 
    </div> 

    <div class="footer"> 
     <div class="footer_info"> 
      <div class="container"> 
       <div class="row"> 
        <div class="col-lg-12"> 
         <div class="footer_info"> 
         <p>Print date: {{time_now}}</p> 
          <p> 
           <b>বিঃদ্রঃ ডেলিভারির সময় মাল বুঝিয়া নিবেন। পরে কোন আপত্তী গ্রহনযোগ্য নয়</b> 
          </p> 
          <h5>বিক্রিত মাল ফেরত নেওয়া হয় না</h5> 
         </div> 
        </div> 
       </div> 
      </div> 
     </div> 
    </div> 

</body> 

Lorsque je parcourais cette URL. J'ai eu cette erreur. J'ai essayé de résoudre cette erreur. Mais je ne peux pas.

UnicodeDecodeError at /shop/1/customerpage/customerprofile/ 
'utf-8' codec can't decode byte 0xe2 in position 10: invalid continuation byte 
Request Method: GET 
Request URL: http://127.0.0.1:8000/shop/1/customerpage/customerprofile/ 
Django Version: 1.11.6 
Exception Type: UnicodeDecodeError 
Exception Value:  
'utf-8' codec can't decode byte 0xe2 in position 10: invalid continuation byte 

c'est tracebook plein Environnement:

Request Method: GET 
Request URL: http://127.0.0.1:8000/shop/1/customerpage/customerprofile/ 

Django Version: 1.11.6 
Python Version: 3.5.2 
Installed Applications: 
['shop.apps.ShopConfig', 
'django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'crispy_forms', 
'wkhtmltopdf'] 
Installed Middleware: 
['django.middleware.security.SecurityMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware'] 



Traceback: 

File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/exception.py" in inner 
    41.    response = get_response(request) 

File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/base.py" in _get_response 
    187.     response = self.process_exception_by_middleware(e, request) 

File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/base.py" in _get_response 
    185.     response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "/home/asad/Desktop/smartshop/django-app/shop/views.py" in customersProfile 
    333.   response.write(output.read()) 

File "/usr/lib/python3.5/codecs.py" in decode 
    321.   (result, consumed) = self._buffer_decode(data, self.errors, final) 

Exception Type: UnicodeDecodeError at /shop/1/customerpage/customerprofile/ 
Exception Value: 'utf-8' codec can't decode byte 0xe2 in position 10: invalid continuation byte 
+0

Pouvez-vous ajouter le retraçage complet s'il vous plaît? – snakecharmerb

+0

Je l'ai ajouté. S'il te plaît vérifie le. –

Répondre

1

Vous lisez le fichier pdf en mode texte ('r')

>>> response = HttpResponse(content_type='application/pdf') 
>>> output = open('example.pdf', 'r') 
>>> response.write(output.read()) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    ... 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe2 in position 10: invalid continuation byte 

mais vous devez utiliser le mode binaire ('rb')

>>> response = HttpResponse(content_type='application/pdf') 
>>> output = open('example.pdf', 'rb') 
>>> response.write(output.read()) 
Lorsque HttpResponse.write est appelé, il vérifie si son entrée est str ou bytes;

; Si l'entrée est str, il tentera de l'encoder, provoquant une erreur dans ce cas. En ouvrant le fichier en mode binaire, vous vous assurez que l'entrée est bytes et qu'aucun codage ne sera tenté.

+0

très bien. Mais c'est un peu lent pour la création de pdf. Je veux aller plus vite. Comment puis je faire ça? –

+0

Si je ai canneté UTF-8, ça fonctionne. mais le processus est lent. response ['Content-Transfer-Encoding'] = 'UTF-8' avec tempfile.NamedTemporaryFile (delete = True) en sortie: output.write (résultat) output.flush() output = open (output.name , 'rb') response.write (output.read()) –

+0

Comment faire plus vite est une question différente - vous aurez besoin de poser une nouvelle question, pas celle-ci. – snakecharmerb