Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UnicodeDecodeError: Django Generate PDF with weasyprint

I am making an app with Django. I want to generate pdf when I browse select link. So I used weasyprint module for convert my pdf. I import weasyprint module. But When I run that app, I found some error. This is views.py file

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

This is HTML file. I wanna create pdf this html file.

<!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>

When I was browsing that url. I got this error. I was tring to solve this error. But I cant.

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

this is full tracebook Environment:

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
like image 885
Asaduzzaman Sohel Avatar asked Dec 18 '22 03:12

Asaduzzaman Sohel


1 Answers

You are reading the pdf file in text mode ('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

but you need to use binary mode ('rb')

>>> response = HttpResponse(content_type='application/pdf')
>>> output = open('example.pdf', 'rb')
>>> response.write(output.read())

When HttpResponse.write is called, checks whether its input is str or bytes; if the input is str it will attempt to encode it, causing an error in this case. By opening the file in binary mode you ensure the input is bytes and no encoding will be attempted.

like image 198
snakecharmerb Avatar answered Dec 20 '22 16:12

snakecharmerb