You can try to download the fpdf source code from the repository (see the download zip link) and update your web2py distribution:
http://code.google.com/p/pyfpdf/source/browse/ Please let follow this on the fpdf site: http://code.google.com/p/pyfpdf/issues/detail?id=66 Thanks for reporting it! Mariano Reingart http://www.sistemasagiles.com.ar http://reingart.blogspot.com On Tue, Oct 29, 2013 at 2:41 PM, step <step.l...@gmail.com> wrote: > Fair enough, Richard, I'm providing sample code here, and I will link to it > in the issue report. > Comments in the sample code explain the 0x95 codec error and also ask some > questions. > Thanks for your help. > > Download TTF font DejaVuSans.ttf and copy it into gluon/contrib/fpdf/ > You can download it from the FPDF site > http://code.google.com/p/pyfpdf/downloads/detail?name=fpdf_unicode_font_pack.zip&can=2&q= > > Add this function to controllers/default.py > > def issue(): return dict() > > > Replace views/generic.pdf > {{""" > replace the standard views/generic.pdf file with this file > """ > import os > # we comment this as we are using a custom model function > # from gluon.contrib.generics import pdf_from_html > filename = '%s/%s.html' % (request.controller,request.function) > if os.path.exists(os.path.join(request.folder,'views',filename)): > html=response.render(filename) > else: > html=BODY(BEAUTIFY(response._vars)).xml() > pass > # note the pyfpdf instead of pdf in the function call > # pyfpdf is defined in views/issue.html > =pyfpdf_from_html(html) > }} > > Create views/default/issue.html > {{""" > Put this file in [app]/default/issue.html then browse .../default/issue.pdf. > You should see a PDF file with two bullets, both with garbage characters, > one for an accented a, the other one for the euro sign. > Now comment out the line after #1# below and uncomment the similar line > after #2#. > The aim is to print out the two characters correctly. Browse again the pdf > page to test... > Instead you will get a codec error involving character 0x95. > 0x95 is the bullet sign that FPDF adds for UL() below (counter-proof: > replace OL() for UL() to get going) > This reproduces issue #66 that I reported on the FPDF google code site > http://code.google.com/p/pyfpdf/issues/detail?id=66. > > I'm still left scratching my head on how to print the euro character and the > accented a character at the same time. > I tried playing with codecs in #3# below to no avail. > """ > def text(a): > print repr(a) > return a.decode("utf-8").encode("utf-8") > #3# setting encode 'latin-1' prints accented characters (but errors out > on euro, which needs utf-8 encoding) > > def pyfpdf_from_html(html): > import os > from gluon.contrib.fpdf import FPDF, HTMLMixin > > class MyFPDF(FPDF, HTMLMixin): > pass > > pdf = MyFPDF() > pdf.add_font('DejaVu', '', 'DejaVuSans.ttf', uni=True) > pdf.set_font('DejaVu', '', 12) > pdf.add_page() > #1#this works but the default font doesn't include the euro character > pdf.write_html('%s' % html) > #2#this errors out with 'utf8' codec can't decode byte 0x95 in position > 5: invalid start byte > ###note that 0x95 is the bullet sign that FPDF adds for UL() below - > replace it with OL() to get going > #pdf.write_html('<font face="DejaVu" size="12">%s<font>' % html) > return XML(pdf.output(dest='S')) > }} > > {{=HTML(BODY(UL([text('à'),text('€')])))}} > > > > On Monday, October 28, 2013 9:46:10 PM UTC+1, Richard wrote: >> >> did you user your_string.decode('utf8') before passing to FPDF?? >> >> I think you have mistake in your code, you should provide example code in >> you issue report!! >> >> Richard >> >> >> On Mon, Oct 28, 2013 at 2:40 PM, step <step...@gmail.com> wrote: >>> >>> I discovered and reported in >>> http://code.google.com/p/pyfpdf/issues/detail?id=66 an issue with >>> gluon/contrib/FPFD. Basically, rendering HTML <UL> tags as PDF may trigger a >>> utf8 codec error because fpdf/html.py sets the bullet character as '\x95'. >>> As a work-around I have replaced '\x95' with '*'. >>> >>> -- >>> Resources: >>> - http://web2py.com >>> - http://web2py.com/book (Documentation) >>> - http://github.com/web2py/web2py (Source code) >>> - https://code.google.com/p/web2py/issues/list (Report Issues) >>> --- >>> You received this message because you are subscribed to the Google Groups >>> "web2py-users" group. >>> To unsubscribe from this group and stop receiving emails from it, send an >>> email to web2py+un...@googlegroups.com. >>> >>> For more options, visit https://groups.google.com/groups/opt_out. >> >> > -- > Resources: > - http://web2py.com > - http://web2py.com/book (Documentation) > - http://github.com/web2py/web2py (Source code) > - https://code.google.com/p/web2py/issues/list (Report Issues) > --- > You received this message because you are subscribed to the Google Groups > "web2py-users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to web2py+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/groups/opt_out. -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.