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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With