Hi Dennis, you're not giving much info so it's hard to help by just reading your post. You have to make it easy for people to help you :D
Did you save a backtrace? What kind of error are you having? What version of each library are you using? Which problems did you have with cairocffi? Did you try to check their github (especially the closed issues) to see if anyone had your same error?
You mention you switched from WeasyPrint to xhtml2pdf, where does it show the encoding error? Can you isolate it to a reproducible example? What's "unsupported type" error?
Maybe you just have to install compatible libraries in your container.
Anyhow, start from the beginning: you need an error backtrace (or traceback in Python) and a list of packages with versions :D
Yes, this is the traceback error when i use xhtml2pdf view:
UnicodeEncodeError at /generatepdf
'latin-1' codec can't encode character '\ufeff' in position 0: ordinal not in range(256)
Request Method: GET
Request URL: 127.0.0.1:8000/generatepdf
Django Version: 2.0.6
Exception Type: UnicodeEncodeError
Exception Value:
'latin-1' codec can't encode character '\ufeff' in position 0: ordinal not in range(256)
Exception Location: /home/dcruz/PycharmProjects/Clientes/misclientes/utils.py in render_to_pdf, line 12
Python Executable: /usr/bin/python3
Python Version: 3.6.5
Python Path:
['/home/dcruz/PycharmProjects/Clientes',
'/usr/lib/python36.zip',
'/usr/lib/python3.6',
'/usr/lib/python3.6/lib-dynload',
'/home/dcruz/.local/lib/python3.6/site-packages',
'/usr/local/lib/python3.6/dist-packages',
'/usr/local/lib/python3.6/dist-packages/Django-2.0.6-py3.6.egg',
'/usr/local/lib/python3.6/dist-packages/django_templated_email-2.3.0-py3.6.egg',
'/usr/local/lib/python3.6/dist-packages/django_render_block-0.5-py3.6.egg',
'/usr/lib/python3/dist-packages']
Server time: Sáb, 20 Abr 2019 14:46:22 -0400
Unicode error hint
The string that could not be encoded/decoded was: <ht
I think there is a rare character at the first position that makes the error.. :S
So, the error is telling you something. I don't know what you're encoding nor I can see the code you're writing but the error as you guessed means the first character is outside latin-1.
According to the search engine \ufeff is the byte order mark.
You should try to encode the text with UTF-8:
>>>print("\ufeffTEXT".encode("latin-1").decode("latin-1"))Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>UnicodeEncodeError:'latin-1'codeccan't encode character '\ufeff' in position 0: ordinal not in range(256)>>> print("\ufeffTEXT".encode("utf-8").decode("utf-8"))TEXT
I think you're doing something wrong with encoding/decoding the text before you transform it.
Can you show me how are you opening the source file? Also check what encoding does it have on disk:
File "/home/dcruz/.local/lib/python3.6/site-packages/xhtml2pdf/parser.py" in pisaParser
context.parseCSS()
File "/home/dcruz/.local/lib/python3.6/site-packages/xhtml2pdf/context.py" in parseCSS
self.css = self.cssParser.parse(self.cssText)
File "/home/dcruz/.local/lib/python3.6/site-packages/xhtml2pdf/w3c/cssParser.py" in parse
src, stylesheet = self._parseStylesheet(src)
File "/home/dcruz/.local/lib/python3.6/site-packages/xhtml2pdf/w3c/cssParser.py" in _parseStylesheet
src, atResults = self._parseAtKeyword(src)
File "/home/dcruz/.local/lib/python3.6/site-packages/xhtml2pdf/w3c/cssParser.py" in _parseAtKeyword
src, result = self._parseAtPage(src)
File "/home/dcruz/.local/lib/python3.6/site-packages/xhtml2pdf/w3c/cssParser.py" in _parseAtPage
stylesheetElements.extend(atResults)
Exception Type: TypeError at /generatepdf
Exception Value: 'NotImplementedType' object is not iterable
NotImplementedType object is not iterable.. and there is all :(
Here is my utils.py code: (pretty the same as the manual example)
from io import BytesIO
from django.http import HttpResponse
from django.template.loader import get_template
from xhtml2pdf import pisa
def render_to_pdf(template_src, context_dict={}):
template = get_template(template_src)
html = template.render(context_dict)
result = BytesIO()
pdf = pisa.pisaDocument(BytesIO(html.encode("ISO-8859-1")), result)
if not pdf.err:
return HttpResponse(result.getvalue(), content_type='application/pdf')
return None
I don't know how to use markdown sorry for the unformatted thing
I the docs you can see an example, but in your shared code I dont see nothing like that example.
Maybe you use this guide, in that case you need to set the correct encondig because by default the library take this based from the HTML header data, something like this:
I don't know what else i can do... im going to install Deepin 15.9 on my server to try WeasyPrint again. :S but i know that ins't a good deployment practice :S
You use pip3 but when you run the Django app what version are you using ? Maybe the xhtml2pdf in your app was taken from the python2 packages folder...
My advice is you need to use virtualenv or maybe the venv built-in module in >= python3.3 and with that you ensure the packages installed via pip and the version is the correct.
Can you give us a complete traceback in text format (not a screenshot) ? It's hard to debug otherwise. I just tried to install WeasyPrint without issues (but I'm on a macOS, not Linux), which makes me think there's either something weird going on with the steps you're taking or you're missing some key library that the Python packages need.
The issue in the link seems related to network problems, sometimes you just need to re-issue a command.
Let's start from the beginning: installing WeasyPrint.
this way you know you're using an isolated version of pip. Then you can issue pip install weasyprint and pip install https://github.com/xhtml2pdf/xhtml2pdf/archive/master.zip
If you're still having problems then you'll know there's something missing and you can open an issue to xhtml2pdf or whichever package blows up during installation.
@rhymes
: The problem was that Cairocffi was installed badly, when one consulted through pip freeze the version showed something strange about the version.
But when trying to install version 1.0.1 I got a network error, reading on the internet I discovered that others had the same error so I upgraded my pip to its latest version and then install Cairocffi == 1.0.1.
Now I only have a Warning from WeasyPrint saying that I am using a lower version than the one required in Cairo and that this can bring rendering problems.
Try the app and render me well what I need, so for now I will ignore that Warning, I do not want to break that hahahaha again.
Many thanks to all who helped me, I really appreciate it that you have spent part of your precious time in me.
: D
For further actions, you may consider blocking this person and/or reporting abuse
We're a place where coders share, stay up-to-date and grow their careers.
Hi Dennis, you're not giving much info so it's hard to help by just reading your post. You have to make it easy for people to help you :D
Did you save a backtrace? What kind of error are you having? What version of each library are you using? Which problems did you have with cairocffi? Did you try to check their github (especially the closed issues) to see if anyone had your same error?
You mention you switched from WeasyPrint to xhtml2pdf, where does it show the encoding error? Can you isolate it to a reproducible example? What's "unsupported type" error?
Maybe you just have to install compatible libraries in your container.
Anyhow, start from the beginning: you need an error backtrace (or traceback in Python) and a list of packages with versions :D
Yes, this is the traceback error when i use xhtml2pdf view:
UnicodeEncodeError at /generatepdf
'latin-1' codec can't encode character '\ufeff' in position 0: ordinal not in range(256)
Request Method: GET
Request URL: 127.0.0.1:8000/generatepdf
Django Version: 2.0.6
Exception Type: UnicodeEncodeError
Exception Value:
'latin-1' codec can't encode character '\ufeff' in position 0: ordinal not in range(256)
Exception Location: /home/dcruz/PycharmProjects/Clientes/misclientes/utils.py in render_to_pdf, line 12
Python Executable: /usr/bin/python3
Python Version: 3.6.5
Python Path:
['/home/dcruz/PycharmProjects/Clientes',
'/usr/lib/python36.zip',
'/usr/lib/python3.6',
'/usr/lib/python3.6/lib-dynload',
'/home/dcruz/.local/lib/python3.6/site-packages',
'/usr/local/lib/python3.6/dist-packages',
'/usr/local/lib/python3.6/dist-packages/Django-2.0.6-py3.6.egg',
'/usr/local/lib/python3.6/dist-packages/django_templated_email-2.3.0-py3.6.egg',
'/usr/local/lib/python3.6/dist-packages/django_render_block-0.5-py3.6.egg',
'/usr/lib/python3/dist-packages']
Server time: Sáb, 20 Abr 2019 14:46:22 -0400
Unicode error hint
The string that could not be encoded/decoded was: <ht
I think there is a rare character at the first position that makes the error.. :S
So, the error is telling you something. I don't know what you're encoding nor I can see the code you're writing but the error as you guessed means the first character is outside
latin-1
.According to the search engine
\ufeff
is the byte order mark.You should try to encode the text with UTF-8:
I think you're doing something wrong with encoding/decoding the text before you transform it.
Can you show me how are you opening the source file? Also check what encoding does it have on disk:
Im saving the html file as utf-8 right now and there is another error.
Environment:
Request Method: GET
Request URL: 127.0.0.1:8000/generatepdf
Django Version: 2.0.6
Python Version: 3.6.5
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sites',
'misclientes.apps.MisclientesConfig']
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.6/dist-packages/Django-2.0.6-py3.6.egg/django/core/handlers/exception.py" in inner
File "/usr/local/lib/python3.6/dist-packages/Django-2.0.6-py3.6.egg/django/core/handlers/base.py" in _get_response
File "/usr/local/lib/python3.6/dist-packages/Django-2.0.6-py3.6.egg/django/core/handlers/base.py" in _get_response
File "/usr/local/lib/python3.6/dist-packages/Django-2.0.6-py3.6.egg/django/views/generic/base.py" in view
File "/usr/local/lib/python3.6/dist-packages/Django-2.0.6-py3.6.egg/django/views/generic/base.py" in dispatch
File "/home/dcruz/PycharmProjects/Clientes/misclientes/views.py" in get
File "/home/dcruz/PycharmProjects/Clientes/misclientes/utils.py" in render_to_pdf
File "/home/dcruz/.local/lib/python3.6/site-packages/xhtml2pdf/document.py" in pisaDocument
File "/home/dcruz/.local/lib/python3.6/site-packages/xhtml2pdf/document.py" in pisaStory
File "/home/dcruz/.local/lib/python3.6/site-packages/xhtml2pdf/parser.py" in pisaParser
File "/home/dcruz/.local/lib/python3.6/site-packages/xhtml2pdf/context.py" in parseCSS
File "/home/dcruz/.local/lib/python3.6/site-packages/xhtml2pdf/w3c/cssParser.py" in parse
File "/home/dcruz/.local/lib/python3.6/site-packages/xhtml2pdf/w3c/cssParser.py" in _parseStylesheet
File "/home/dcruz/.local/lib/python3.6/site-packages/xhtml2pdf/w3c/cssParser.py" in _parseAtKeyword
File "/home/dcruz/.local/lib/python3.6/site-packages/xhtml2pdf/w3c/cssParser.py" in _parseAtPage
Exception Type: TypeError at /generatepdf
Exception Value: 'NotImplementedType' object is not iterable
NotImplementedType object is not iterable.. and there is all :(
Here is my utils.py code: (pretty the same as the manual example)
from io import BytesIO
from django.http import HttpResponse
from django.template.loader import get_template
from xhtml2pdf import pisa
def render_to_pdf(template_src, context_dict={}):
template = get_template(template_src)
html = template.render(context_dict)
result = BytesIO()
pdf = pisa.pisaDocument(BytesIO(html.encode("ISO-8859-1")), result)
if not pdf.err:
return HttpResponse(result.getvalue(), content_type='application/pdf')
return None
I don't know how to use markdown sorry for the unformatted thing
What version of
xhtml2pdf
are you using ?I the docs you can see an example, but in your shared code I dont see nothing like that example.
Maybe you use this guide, in that case you need to set the correct encondig because by default the library take this based from the HTML header data, something like this:
But if your HTML file is UTF8 you need to encode that and pass the correct encoding argument to
pisaDocument
.I'm using xhtml2pdf version 0.2.3.
Still getting
NotImplementedType object its not iterable
This gonna make me crazy guys..
Could be a bug in the
xhtml2pdf
library.But if you go to the master branch you can see the correct lines
So just install directly from Github:
I'll try this next mon. Right now i can't download files. Thanks a lot @Kip
thepracticaldev.s3.amazonaws.com/i...
I've installed it but same error.... :(
I don't know what else i can do... im going to install Deepin 15.9 on my server to try WeasyPrint again. :S but i know that ins't a good deployment practice :S
You use
pip3
but when you run the Django app what version are you using ? Maybe thexhtml2pdf
in your app was taken from thepython2
packages folder...My advice is you need to use
virtualenv
or maybe the venv built-in module in>= python3.3
and with that you ensure the packages installed via pip and the version is the correct.Dead Simple Python: Virtual Environments and pip
Jason C. McDonald
How i know what version use? i suppose that if Django 2.0.6 uses Python3 then xhtml2pdf uses the same.
Today i tried to install WeasyPrint again but:
dev.to/dcruz1990/weasyprint-imposs...
Can you give us a complete traceback in text format (not a screenshot) ? It's hard to debug otherwise. I just tried to install WeasyPrint without issues (but I'm on a macOS, not Linux), which makes me think there's either something weird going on with the steps you're taking or you're missing some key library that the Python packages need.
The issue in the link seems related to network problems, sometimes you just need to re-issue a command.
Let's start from the beginning: installing WeasyPrint.
Using pip directly it works:
The same happened with xhtml2pdf:
So now that we've established it could work, we know that there are three main factors at play:
Can you isolate the problem?
Create a virtualenv:
this way you know you're using an isolated version of pip. Then you can issue
pip install weasyprint
andpip install https://github.com/xhtml2pdf/xhtml2pdf/archive/master.zip
If you're still having problems then you'll know there's something missing and you can open an issue to xhtml2pdf or whichever package blows up during installation.
Let me know!
@rhymes : The problem was that Cairocffi was installed badly, when one consulted through pip freeze the version showed something strange about the version.
But when trying to install version 1.0.1 I got a network error, reading on the internet I discovered that others had the same error so I upgraded my pip to its latest version and then install Cairocffi == 1.0.1.
Now I only have a Warning from WeasyPrint saying that I am using a lower version than the one required in Cairo and that this can bring rendering problems.
Try the app and render me well what I need, so for now I will ignore that Warning, I do not want to break that hahahaha again.
Many thanks to all who helped me, I really appreciate it that you have spent part of your precious time in me.
: D