Pregunta

Instalé xhtml2pdf usando pip para usar con Django.Estoy obteniendo el siguiente importentror:

Reportlab Toolkit Version 2.2 or higher needed

pero tengo reportlab 3.0

>>> import reportlab
>>> print reportlab.Version                                                                                                                                                                                                                 
3.0

Encontré este bloque de atrapamiento en el __init__.py de xhtml2pdf:

REQUIRED_INFO = """
****************************************************
IMPORT ERROR!
%s
****************************************************

The following Python packages are required for PISA:
- Reportlab Toolkit >= 2.2 <http://www.reportlab.org/>
- HTML5lib >= 0.11.1 <http://code.google.com/p/html5lib/>

Optional packages:
- pyPDF <http://pybrary.net/pyPdf/>
- PIL <http://www.pythonware.com/products/pil/>

""".lstrip()

log = logging.getLogger(__name__)

try:
    from xhtml2pdf.util import REPORTLAB22

    if not REPORTLAB22:
        raise ImportError, "Reportlab Toolkit Version 2.2 or higher needed"
except ImportError, e:
    import sys

    sys.stderr.write(REQUIRED_INFO % e)
    log.error(REQUIRED_INFO % e)
    raise

También hay otro error en el util.py:

if not (reportlab.Version[0] == "2" and reportlab.Version[2] >= "1"):

no debería haber leído algo como:

if not (reportlab.Version[:3] >="2.1"):

¿Qué da?

¿Fue útil?

Solución

en util.py Edite las siguientes líneas:

if not (reportlab.Version[0] == "2" and reportlab.Version[2] >= "1"):
    raise ImportError("Reportlab Version 2.1+ is needed!")

REPORTLAB22 = (reportlab.Version[0] == "2" and reportlab.Version[2] >= "2")

y establecer en:

if not (reportlab.Version[:3] >="2.1"):
    raise ImportError("Reportlab Version 2.1+ is needed!")

REPORTLAB22 = (reportlab.Version[:3] >="2.1")

Editar

Mientras que lo anterior funciona, todavía usa literales de cadena para la verificación de la versión.Hay una solicitud de extracción en el proyecto xhtml2pdf con una solución más elegante que compara las versiones utilizando tuplas de enteros.Esta es la solución propuesta:

_reportlab_version = tuple(map(int, reportlab.Version.split('.')))
if _reportlab_version < (2,1):
    raise ImportError("Reportlab Version 2.1+ is needed!")

REPORTLAB22 = _reportlab_version >= (2, 2)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top