Factura electrónica ZUGFeRD desde una lista de SharePoint: Convierta JSON en XML EN 16931 y un PDF/A-3 en Power Automate con PDF4me

PDF4me Create ZUGFeRD Invoice es una acción de Power Automate que convierte los datos de una factura en una factura electrónica híbrida PDF/A-3. Al conectarse a una lista de SharePoint, toma el JSON que una acción Compose genera a partir de cada fila, escribe el XML EN 16931, dibuja la factura legible en el PDF base, archiva el resultado y lo envía por correo electrónico al comprador.
Si buscas ZUGFeRD, encontrarás tres opciones: una explicación del formato, un validador que te indica si un archivo que ya tienes es correcto, o una biblioteca en PHP, Java o C# para desarrolladores de software de facturación. Las tres opciones presuponen que la factura ya existe. La pregunta que ninguna responde es la que se plantea un equipo financiero: los datos de la factura están en una lista, en una hoja de cálculo, en cualquier sistema que registre las ventas, y deben generarse como una factura electrónica que cumpla con la normativa. Este flujo es la solución que faltaba, en siete pasos y sin necesidad de código.
Se inserta una fila en una lista de SharePoint con el vendedor, el comprador, una línea de artículo y las fechas. Cuatro segundos después, aparece una factura PDF/A-3 en una biblioteca de documentos: una página legible con el XML EN 16931 integrado para que el software del comprador lo procese. Nunca se escribe ese XML. Se describe la factura como un objeto JSON corto y PDF4me genera el esquema. La fila obtiene el estado y un enlace, y el comprador recibe el archivo por correo electrónico.
Preguntas y respuestas basadas en el porqué
¿Por qué almacenar los datos de las facturas en una lista de SharePoint? Porque ese es el formato que ya utilizan la mayoría de los equipos financieros pequeños: una fila por factura, completada por una persona. Las columnas se corresponden uno a uno con los campos que exige el estándar, lo que significa que la correspondencia es visible para cualquiera que abra la lista, y una nueva factura se convierte en una nueva fila en lugar de un nuevo archivo en una carpeta supervisada.
¿Por qué describir la factura en formato JSON en lugar de usar XML? Porque la sintaxis Cross Industry Invoice es extensa y estricta: espacios de nombres anidados, nombres de elementos difíciles de recordar y códigos que deben ubicarse en el lugar exacto. El objeto JSON expresa lo mismo en muchas menos líneas, con claves que se leen como los términos comerciales que representan. PDF4me lo convierte al esquema, por lo que la parte más propensa a errores es la que no requiere mantenimiento.
¿Por qué generar la factura en un PDF base? Porque un archivo ZUGFeRD tiene dos partes y ambas deben coincidir. El XML es para el software del comprador, y la página impresa es para quien la abre. Render Invoice on PDF dibuja la factura en la página base a partir de los mismos datos que generaron el XML, por lo que ambos archivos nunca se desvincularán, como ocurre cuando el diseño se mantiene por separado.
¿Por qué PDF/A-3 y no un PDF común? Porque PDF/A-3 es el formato de archivo que permite adjuntar archivos, y el XML incrustado es precisamente ese archivo adjunto. Además, es lo que permite que la factura sea legible años después: las fuentes y los perfiles de color se conservan dentro del archivo, algo fundamental para un documento que la mayoría de las empresas deben conservar durante una década.
Lo que obtendrás
Entrada: una fila con el número de factura, las fechas, la moneda, el bloque del vendedor, el bloque del comprador y una línea de artículo. Salida: una factura ZUGFeRD PDF/A-3 en la biblioteca ZUGFeRD Invoices, la fila actualizada con su estado y un enlace, y un correo electrónico al comprador con la factura adjunta.

Una fila por factura. Cada columna de este panel se convierte en una clave en el JSON que genera el flujo.

Un archivo por número de factura, escrito por la cuenta de flujo.

La mitad legible del mismo archivo, tal como la ve el comprador.
Lo que necesitas
- Power Automate. Abre Power Automate. Un flujo automatizado en la nube con conectores estándar. SharePoint, Office 365 Outlook y PDF4me no requieren un plan premium.
- Clave API de PDF4me. Obtenga su clave API. Este flujo utiliza una conexión de PDF4me, PDF4me PDF.
- Una lista de SharePoint para las solicitudes. La lista capturada se llama ZUGFeRD Requests, con InvoiceNumber, InvoiceDate, DueDate, Currency, el bloque Seller (nombre, calle, código postal, ciudad, país, ID), el bloque Buyer, ItemDescription, Quantity, UnitPrice, VATRate, una columna Email, una columna de selección Status y una columna OutputLink a la que escribe el flujo.
- Un PDF base de factura. El flujo capturado guarda
BaseInvoice.pdfen una biblioteca llamada ZUGFeRD Templates. Esta es la página donde se dibuja la factura, por lo que su membrete debe ir aquí. - Una biblioteca para las facturas terminadas. El flujo capturado escribe en ZUGFeRD Invoices.
- Tus datos de vendedor, incluyendo el ID fiscal (IVA). Estos datos se insertan en las columnas de la lista, de modo que el mismo proceso puede generar facturas para más de una entidad jurídica.
El flujo de un vistazo
- When an item is created (SharePoint), se supervisa la lista denominada
ZUGFeRD Requests. - Compose construye el JSON de la factura a partir de la fila.
- Get file content using path reads
/ZUGFeRD Templates/BaseInvoice.pdf. - Create ZUGFeRD Invoice (PDF4me PDF) convierte el JSON a XML EN 16931 y devuelve el PDF híbrido.
- Create file (SharePoint) lo guarda como
ZUGFeRD_<invoice number>.pdf. - Update item (SharePoint) establece Status en
Generatedy rellena OutputLink. - Send an email (V2) (Office 365 Outlook) envía la factura al comprador.
Descripción general del flujo completo

Cuatro segundos y pico de principio a fin, y la factura electrónica en sí tarda aproximadamente un segundo. El paso más lento es la escritura del archivo por parte de SharePoint.
Paso 1: ¿Cómo se genera una factura electrónica cuando llega una solicitud?
Flujo hasta ahora: nada todavía, este es el detonante.
Agregar una fila es la forma en que se solicita una factura, por lo que esa es la señal.
- Cree un Automated cloud flow y seleccione SharePoint > When an item is created.
- Configurar:
- Site Address:
PDF4me Support - https://ynoox1.sharepoint.com/sites/PDF4meSupport - List Name:
ZUGFeRD Requests
- Site Address:
When an item is created: configuración

Cada columna de la nueva fila se convierte en una ficha que las siguientes seis acciones pueden utilizar.
Paso 2: ¿Cómo se construye el JSON de la factura a partir de las columnas de la lista?
Flujo hasta ahora: el desencadenador de SharePoint.
Una sola acción Compose describe toda la factura. Aquí es donde los nombres de las columnas coinciden con los nombres que espera el estándar, y es lo suficientemente breve como para leerse en una sola pantalla.
- Agregar Data Operation > Compose.
- Pega el objeto que aparece a continuación en Inputs y reemplaza cada valor con el token correspondiente.
{
"InvoiceId": "@{triggerBody()?['InvoiceNumber']}",
"TypeCode": "380",
"InvoiceType": "RECHNUNG",
"IssueDate": "@{triggerBody()?['InvoiceDate']}T00:00:00",
"DeliveryDate": "@{triggerBody()?['InvoiceDate']}T00:00:00",
"IsTest": false,
"Seller": {
"Name": "@{triggerBody()?['SellerName']}",
"VatId": "@{triggerBody()?['SellerVATID']}",
"Address": {
"Street": "@{triggerBody()?['SellerStreet']}",
"PostalCode": "@{triggerBody()?['SellerPostalCode']}",
"City": "@{triggerBody()?['SellerCity']}",
"Country": "@{triggerBody()?['SellerCountry']}"
}
},
"Buyer": {
"Name": "@{triggerBody()?['BuyerName']}",
"Address": {
"Street": "@{triggerBody()?['BuyerStreet']}",
"PostalCode": "@{triggerBody()?['BuyerPostalCode']}",
"City": "@{triggerBody()?['BuyerCity']}",
"Country": "@{triggerBody()?['BuyerCountry']}"
}
},
"LineItems": [
{
"ProductName": "@{triggerBody()?['ItemDescription']}",
"Quantity": @{triggerBody()?['Quantity']},
"UnitCode": "C62",
"UnitPrice": @{triggerBody()?['UnitPrice']},
"LineTotal": @{float(...)}
}
],
"Totals": {
"Currency": "@{triggerBody()?['Currency']?['Value']}",
"LineTotal": @{float(...)},
"TaxBasisTotal": @{float(...)},
"TaxPercent": @{triggerBody()?['VATRate']},
"TaxTotal": @{float(...)},
"GrandTotal": @{float(...)},
"ChargeTotal": 0,
"AllowanceTotal": 0
},
"Payment": {
"Currency": "@{triggerBody()?['Currency']?['Value']}",
"PaymentReference": "@{triggerBody()?['InvoiceNumber']}",
"DueDate": "@{triggerBody()?['DueDate']}T00:00:00"
}
}
Compose: configuración

Los valores de texto son tokens entre comillas. El dinero y las cantidades son números simples, por eso pasan por float.
De dónde proviene cada parte de la factura
| Clave JSON | Lo que contiene | Fuente |
|---|---|---|
InvoiceId, TypeCode, InvoiceType | Número de factura, el código de tipo de documento 380 para una factura comercial y la etiqueta impresa en la página | InvoiceNumber, luego valores fijos |
IssueDate, DeliveryDate | Cuándo se emitió la factura y cuándo se prestó el servicio | InvoiceDate, con el sufijo T00:00:00 |
Seller | Nombre, ID fiscal y bloque de dirección completo | SellerName, SellerVATID, SellerStreet, SellerPostalCode, SellerCity, SellerCountry |
Buyer | Nombre y dirección del cliente | BuyerName, BuyerStreet, BuyerPostalCode, BuyerCity, BuyerCountry |
LineItems | Descripción, cantidad con código de unidad C62, precio unitario y total de la línea | ItemDescription, Cantidad, UnitPrice |
Totals | Moneda, total neto, base imponible, tipo y importe del IVA, total general | Moneda, VATRate y importes calculados |
Payment | Moneda, la referencia que el comprador cita al pagar y la fecha de vencimiento | Moneda, InvoiceNumber, DueDate |
Consejo: Las claves de dinero son la única parte que requiere aritmética, y deben ser números enteros en lugar de cadenas entre comillas, para lo cual se usan las expresiones float. LineTotal es la cantidad multiplicada por el precio unitario, TaxBasisTotal es la suma de los totales de línea, TaxTotal es la base impositiva multiplicada por la tasa dividida por 100, y GrandTotal es la suma de ambos. Para la fila capturada, esto es 1005, 1005, 190.95 y 1195.95. Un "1005" entre comillas será rechazado, mientras que un 1005 simple será aceptado.
Paso 3: ¿De dónde proviene el PDF base?
Flujo hasta ahora: el disparador más Compose.
Los archivos ZUGFeRD tienen una página legible, y aquí es donde comienza.
- Agregar SharePoint > Get file content using path.
- Configurar:
- Site Address:
PDF4me Support - https://ynoox1.sharepoint.com/sites/PDF4meSupport - File Path:
/ZUGFeRD Templates/BaseInvoice.pdf - Infer content type (avanzado):
Yes
- Site Address:
Get file content using path: configuración

Guarda tu membrete en este archivo. Se revisa en cada impresión, así que si lo modificas, la siguiente factura también se verá afectada.
Paso 4: ¿Cómo se convierte el JSON en un PDF/A-3 ZUGFeRD?
Flujo hasta ahora: el disparador, Compose y Get file content using path.
Esta es la acción que genera la factura electrónica. Lee el JSON, escribe el XML EN 16931 y devuelve un único archivo con ambas partes.
- Agregue la Create ZUGFeRD Invoice desde la conexión PDF4me PDF.
- Configurar:
- ZUGFeRD version and Input Format:
2.0-JSON - Output Mode:
XmlWithPdf - Invoice JSON Data: la expresión
base64(outputs('Compose')) - Conformance Level:
EN16931 - Render Invoice on PDF:
Yes - File Content: una expresión
base64()sobre el contenido de Get file content using path - File Name:
BaseInvoice.pdf
- ZUGFeRD version and Input Format:
Create ZUGFeRD Invoice: configuración

El formato de entrada determina qué campo de datos aparece. Seleccione 2.0-JSON y la acción solicitará Invoice JSON Data, no Invoice XML Data.
Lo que decide cada configuración
| Campo | Valor aquí | Lo que controla |
|---|---|---|
| ZUGFeRD version and Input Format | 2.0-JSON | ¿Qué generación ZUGFeRD sigue la salida y los datos llegan como JSON? Esta elección es lo que hace que aparezca el campo Invoice JSON Data |
| Output Mode | XmlWithPdf | Devuelve un archivo híbrido, el PDF con el XML incrustado, en lugar de XML por separado |
| Invoice JSON Data | base64(outputs('Compose')) | El objeto de factura, codificado base64 en el camino |
| Conformance Level | EN16931 | El perfil que la factura afirma cumplir y, por lo tanto, qué claves debe proporcionar el JSON |
| Render Invoice on PDF | Yes | Dibuja la factura legible sobre el PDF base en lugar de dejar la página como estaba |
| File Content, File Name | El PDF base | La página en la que se emite la factura y el nombre del informe de la acción |
Consejo: La acción muestra Invoice XML Data, Invoice JSON Data o Invoice CSV Data según el formato seleccionado en la mitad del menú desplegable. Complete solo la opción que coincida con su elección. La causa más común de errores de validación en esta acción es completar dos campos de datos en la misma ejecución.
Paso 5: ¿Dónde se archiva la factura?
Flujo hasta ahora: todo a través de Create ZUGFeRD Invoice.
El número de factura identifica el archivo, lo que permite realizar búsquedas en la biblioteca.
- Agregar SharePoint > Create file.
- Configurar:
- Site Address:
PDF4me Support - https://ynoox1.sharepoint.com/sites/PDF4meSupport - Folder Path:
/ZUGFeRD Invoices - File Name:
ZUGFeRD_seguido del token InvoiceNumber y.pdf - File Content: el token Body de Create ZUGFeRD Invoice
- Site Address:
Create file: configuración

Para RE-2026-0007 esto escribe ZUGFeRD_RE-2026-0007.pdf.
Paso 6: ¿Cómo se registra el resultado de la solicitud?
Flujo hasta ahora: todo a través Create file.
En la fila donde se solicita la factura también debería indicarse qué sucedió con ella.
- Agregar SharePoint > Update item.
- Configurar:
- Site Address:
PDF4me Support - https://ynoox1.sharepoint.com/sites/PDF4meSupport - List Name:
ZUGFeRD Requests - Id: el token ID del disparador
- Title: el token Title del disparador
- Status Value (avanzado):
Generated - OutputLink (avanzado): la URL de la biblioteca seguida de
ZUGFeRD_, el token InvoiceNumber y.pdf
- Site Address:
Update item: configuración

El enlace se construye a partir de la URL de la biblioteca y el mismo patrón de nombre utilizado Create file, con el espacio en el nombre de la biblioteca ya codificado como %20.
Paso 7: ¿Cómo se envía la factura al comprador?
Flujo hasta ahora: todo a través Update item.
Una factura electrónica que permanece en una biblioteca no ha sido emitida, por lo que la última acción la entrega.
- Agregar Office 365 Outlook > Send an email (V2).
- Configurar:
- Para: el token Email del activador
- Asunto:
Your ZUGFeRD e-invoiceseguida del token InvoiceNumber - Body: una línea que indica el nombre del comprador y la factura, y que especifica que el archivo es un PDF/A-3 con XML EN 16931 incrustado
- Abra Advanced parameters y añada el archivo adjunto:
- Nombre Attachments: 1:
ZUGFeRD_más el token InvoiceNumber más.pdf - Contenido Attachments - 1: el token File Content de Create ZUGFeRD Invoice
- Importance:
Normal
- Nombre Attachments: 1:
Send an email (V2): configuración

El archivo adjunto obtiene sus bytes de la acción que los generó, por lo que SharePoint nunca se lee.
Ejecuta el flujo y verifica
- Save el flujo.
- Agregue una fila a ZUGFeRD Requests con un comprador, un artículo, ambas fechas y una dirección que pueda verificar.
- Abre el historial de ejecución. Las siete acciones deberían aparecer en verde y la ejecución completa debería durar unos segundos.
- Abra la biblioteca ZUGFeRD Invoices y compruebe que el archivo se encuentra allí, bajo el número de factura.
- Vuelva a la fila: Status debería indicar Generated y OutputLink debería abrir la factura.
- Abre el archivo adjunto del correo electrónico y comprueba ambas partes: la página debe mostrar las cantidades correctas y el archivo debe contener el XML en su interior.
La ejecución capturada duró aproximadamente cuatro segundos en total, y la factura electrónica se generó en uno de ellos. El resultado, ZUGFeRD_RE-2026-0007.pdf, tiene un tamaño aproximado de 331 KB y se muestra como una factura alemana: vendedor Muster GmbH en Berlin con ID DE123456789, cliente Test Kunde AG en Muenchen, tipo de documento 380, una línea de Consulting con un IVA del 19 %, neto 1.005,00 EUR, IVA 190,95 EUR y un total de 1.195,95 EUR.
¿Qué creaste exactamente? Un sistema de facturación electrónica que parte de tus propios registros. Los datos se quedan donde los guarda el departamento de finanzas, el estándar se cumple con XML que nunca tuviste que escribir, el comprador recibe un archivo que su software puede leer automáticamente y que su personal puede visualizar en pantalla, y la fila de la solicitud registra que se envió.
Variaciones comunes que puedes agregar sin reconstruir
¿Cómo se compara esto con las otras formas de generar una factura ZUGFeRD
Cada fila describe la alternativa. La última fila muestra este flujo.
| Comparación | ¿Quién lo dirige? | De dónde provienen los datos | Lo que mantienes |
|---|---|---|---|
| Software de facturación con exportación ZUGFeRD frente a este flujo | Cualquiera, dentro de ese producto | Los propios registros del producto | Una suscripción y todo lo que el producto admita |
| Plataforma de facturación electrónica frente a este flujo | Finanzas, a través de un portal | Cargas o una integración | Un contrato por documento y una conexión con el mismo |
| Biblioteca del desarrollador frente a este flujo | Un desarrollador, dentro de una aplicación | Tu base de datos, a través del código | El código, las actualizaciones del esquema y las versiones |
| Este flujo | Cualquiera que pueda agregar una fila a la lista | Una lista de SharePoint que el equipo mantiene | Un objeto JSON y un PDF base |
Preguntas frecuentes
¿Qué es una factura ZUGFeRD?
Una factura ZUGFeRD es un archivo que funciona de dos maneras. Es un PDF normal que se puede abrir y leer, y en su interior contiene un archivo XML adjunto con la misma factura como datos estructurados. El sistema contable del comprador lee el XML y registra la factura automáticamente, sin necesidad de que nadie la introduzca manualmente, mientras que la persona encargada de cuentas por pagar sigue viendo una página.
El formato proviene de FeRD, el foro alemán para la facturación electrónica, y su equivalente francés es Factur-X, que es la misma idea con otro nombre.
¿Qué es el formato ZUGFeRD?
Técnicamente, se trata de un contenedor PDF/A-3 con un archivo XML incrustado en la sintaxis Cross Industry Invoice y un perfil que indica el grado de completitud de los datos. El perfil utilizado es EN16931, que se corresponde con el estándar semántico europeo para la facturación electrónica: el conjunto de campos que EN 16931 define como la base de una factura.
La consecuencia práctica para la automatización es que el resultado se evalúa en función del XML, no de la página. Si se proporcionan los datos que solicita el perfil, el archivo se procesa correctamente; si se mejora el diseño de la página, nada cambia.
¿Cómo crear una factura ZUGFeRD?
Necesitas tres cosas: los datos de la factura en un formato estructurado, una página para la parte humana y algo que escriba el XML en el PDF como un archivo adjunto PDF/A-3.
En este flujo, los datos son una fila de SharePoint convertida a JSON, la página es BaseInvoice.pdf y Create ZUGFeRD Invoice realiza la tercera parte con Output Mode XmlWithPdf. Si sus datos ya existen como XML Cross Industry Invoice o como una fila CSV, cambie el formato de entrada y utilice ese formato. El resto del flujo no cambia.
¿Cuál es la diferencia entre ZUGFeRD y XRechnung?
Ambos cumplen con la misma norma europea; la diferencia radica en el formato. ZUGFeRD es híbrido: un PDF legible con el XML integrado, ideal para facturas enviadas a clientes que pueden abrirlas manualmente. XRechnung en cambio, utiliza únicamente XML, el formato que solicitan los compradores del sector público alemán.
Si envía documentos a empresas, el formato híbrido suele ser la opción más segura, ya que cualquier persona que lo abra podrá leerlo. Si factura a una administración pública, compruebe el formato que requiere antes de enviar la factura.
Solución de problemas
Abre la salida Compose en el historial de ejecución y léela como JSON antes que nada. Una columna vacía deja una clave vacía, y un valor monetario que conserva sus comillas aparece como texto donde se espera un número. Ambos generan un objeto que parece correcto, pero aun así falla la conversión.
Conformance Level determina qué campos requiere el perfil. Si se declara la conformidad con EN16931 pero el JSON omite claves que el perfil espera, la validación fallará, aunque el archivo se abra correctamente. En ese caso, deberá proporcionar las claves que faltan o cambiar a un perfil de menor nivel.
Render Invoice on PDF está desactivada, por lo que el XML se insertó sin mostrar ningún contenido. El archivo sigue siendo una factura electrónica válida, pero la parte que contiene el usuario es la que figuraba en el PDF original.
Verifique el contenido del archivo adjunto en el paso de correo electrónico y el File Content en Create file. Ambos deben provenir de Create ZUGFeRD Invoice. Si adjunta el PDF base, se enviará una página que se ve bien, pero que no contiene información que su software pueda leer.
Próximos pasos
El mismo patrón de siete pasos (llega una fila, se describe una factura como datos, se produce un archivo, se archiva, se registra y se envía) es lo que realmente solicita cualquier mandato de facturación electrónica, independientemente del formato que acaben necesitando sus compradores.