Es posible que en una integración de Odoo ya productiva un día les reporten que un documento PDF (factura, presupuesto, lo que sea), y que en solo una de esas impresiones Odoo devuelva un extenso error que finaliza algo asi:
lxml.etree.XMLSyntaxError: PCDATA invalid Char value 2, line 37, column 65
¿Cómo lo resolvemos?
Debugging
Lo primero es no desesperarse y tratar de entender el error. Cuando lxml nos dice PCDATA invalid Char value se está refiriendo a que hay un carácter en el documento que es inválido desde el punto de vista de la codificación. El problema ahora será encontrarlo, algunos errores comunes en Odoo es la dirección del cliente que al ser copiada de otro sistema puede tener guiones no soportados o cosas extrañas, o también datos del producto que en cargas masivas tienen algún carácter mal codificado. Para detectarlo, nos iremos al archivo de Odoo que dispara el documento PDF (en la trazabilidad del error lo van a encontrar). Por ejemplo, si fuese una factura sería este:
account_edi_ubl_cii/models/account_edi_xml_cii_facturx.py
Si leemos bien el código vamos a encontrar la función que exporta el XML para generar el PDF, y una variable llama xml_content donde se guarda dicho contenido. En otros documentos puede ser distinto el nombre, pero siempre tendremos el contenido XML generado previo a armar el PDF, que es lo que nos va a dar la pauta de error. Así que simplemente agregamos en dicha función:
_logger.info(xml_content)
Ahora si, nos va a imprimir en el log el XML completo, que podremos pasar a un editor para buscar la línea con error (la columna no es exacta, pero la línea si). Dicha línea va a decir cual registro tiene error. Como dije arriba, puede ser el partner, el producto, la campaña, cualquier registro que el sistema requiera imprimir en el documento y que sea un registro Many2one, One2many o Many2many. En dicho XML nos dirá el ID, y con eso podremos ir a fijarnos en los campos visibles en cual se colocó el carácter sin codificación, borrarlo y volver a sacar el documento.