Fatura eletrônica ZUGFeRD a partir de uma lista do SharePoint: Converta JSON em XML EN 16931 e em PDF/A-3 no Power Automate com PDF4me

O PDF4me Create ZUGFeRD Invoice é uma ação do Power Automate que transforma dados de faturas em uma fatura eletrônica híbrida em PDF/A-3. Apontada para uma lista do SharePoint, ela utiliza o JSON gerado por uma ação Compose a partir de cada linha, escreve o XML EN 16931, desenha a fatura legível no PDF base, arquiva o resultado e o envia por e-mail ao comprador.
Ao pesquisar por ZUGFeRD, você se depara com um de três lugares: uma explicação sobre o formato, um validador que verifica se um arquivo já existente está correto ou uma biblioteca em PHP, Java ou C# para desenvolvedores que criam softwares de faturamento. Todos os três partem do pressuposto de que a fatura já existe em algum lugar. A pergunta que nenhum deles responde é a que uma equipe financeira realmente enfrenta: os dados da fatura estão em uma lista, planilha ou em qualquer sistema que registre as vendas, e precisam ser convertidos em uma fatura eletrônica válida. Este fluxo preenche essa lacuna, em sete etapas e sem código.
Uma linha é inserida em uma lista do SharePoint com o vendedor, o comprador, um item e as datas. Quatro segundos depois, há uma fatura PDF/A-3 em uma biblioteca de documentos: uma página legível, com o XML EN 16931 incorporado para processamento pelo software do comprador. Você nunca escreve esse XML. Você descreve a fatura como um pequeno objeto JSON e o PDF4me gera o esquema. A linha recebe o status e um link, e o comprador recebe o arquivo por e-mail.
Perguntas e respostas baseadas no porquê
Por que manter os dados de faturas em uma lista do SharePoint? Porque esse é o formato em que os dados já estão para a maioria das pequenas equipes financeiras: uma linha por fatura, preenchida por uma pessoa. As colunas correspondem diretamente aos campos exigidos pelo padrão, o que significa que o mapeamento é visível para qualquer pessoa que abra a lista, e uma nova fatura é uma nova linha, em vez de um novo arquivo em uma pasta monitorada.
Por que descrever a fatura em JSON em vez de escrever em XML? Porque a sintaxe Cross Industry Invoice é verbosa e rígida: namespaces aninhados, nomes de elementos que ninguém lembra, códigos que precisam estar exatamente no lugar certo. O objeto JSON diz a mesma coisa em muito menos linhas, com chaves que correspondem aos termos comerciais que representam. O PDF4me converte tudo para o esquema, então a parte que é fácil de errar é justamente a que você não precisa manter.
Por que renderizar a fatura em um PDF base? Porque um arquivo ZUGFeRD tem duas partes e ambas precisam estar em conformidade. O XML é para o software do comprador, a página impressa é para quem a abre. Render Invoice on PDF desenha a fatura na página base a partir dos mesmos dados que geraram o XML, portanto, as duas partes nunca se desalinham como acontece quando um layout é mantido separadamente.
Por que PDF/A-3 e não um PDF comum? Porque PDF/A-3 é o formato de arquivo que permite a inclusão de anexos, e o XML incorporado é esse anexo. É também a parte que torna a fatura legível anos depois: as fontes e os perfis de cores são mantidos dentro do arquivo, o que é importante para um documento que a maioria das empresas é obrigada a guardar por uma década.
O que você receberá
Entrada: uma linha com o número da fatura, as datas, a moeda, o bloco do vendedor, o bloco do comprador e um item de linha. Saída: uma fatura ZUGFeRD PDF/A-3 na biblioteca ZUGFeRD Invoices, a linha atualizada com seu status e um link, e um e-mail para o comprador com a fatura em anexo.

Uma linha por fatura. Cada coluna neste painel se torna uma chave no JSON que o fluxo constrói.

Um arquivo por número de fatura, redigido pela conta de fluxo.

A metade legível do mesmo arquivo, tal como o comprador o vê.
Do que você precisa
- Power Automate. Abra o Power Automate. Um fluxo de trabalho automatizado na nuvem com conectores padrão. SharePoint, Office 365 Outlook e PDF4me não exigem plano premium.
- Chave da API do PDF4me. Obtenha sua chave da API. Este fluxo usa uma conexão PDF4me, PDF4me PDF.
- Uma lista do SharePoint para as solicitações. A lista capturada chama-se ZUGFeRD Requests e contém os campos InvoiceNumber, InvoiceDate, DueDate, Moeda, o bloco Seller (nome, rua, código postal, cidade, país, ID de IVA), o bloco Buyer, ItemDescription, Quantidade, UnitPrice, VATRate, uma coluna Email, uma coluna de seleção Status e uma coluna OutputLink na qual o fluxo grava.
- Um PDF de fatura base. O fluxo capturado mantém
BaseInvoice.pdfem uma biblioteca chamada ZUGFeRD Templates. Esta é a página onde a fatura é impressa, portanto, seu cabeçalho deve ser inserido aqui. - Uma biblioteca para as faturas finalizadas. O fluxo capturado grava no ZUGFeRD Invoices.
- Os dados do vendedor, incluindo o ID fiscal (IVA), são inseridos nas colunas da lista, permitindo que o mesmo fluxo emita faturas para mais de uma entidade jurídica.
O Fluxo em Resumo
- When an item is created (SharePoint), ele monitora a lista chamada
ZUGFeRD Requests. - Compose cria o JSON da fatura a partir da linha.
- Get file content using path reads
/ZUGFeRD Templates/BaseInvoice.pdf. - Create ZUGFeRD Invoice (PDF4me PDF) converte o JSON em XML EN 16931 e retorna o PDF híbrido.
- Create file (SharePoint) é salvo como
ZUGFeRD_<invoice number>.pdf. - Update item (SharePoint) define Status como
Generatede preenche OutputLink. - Send an email (V2) (Office 365 Outlook) envia a fatura ao comprador.
Visão geral completa do fluxo

Quatro segundos e alguns segundos de ponta a ponta, e a própria fatura eletrônica leva cerca de um segundo. A etapa mais lenta é a gravação do arquivo pelo SharePoint.
Passo 1: Como acionar uma fatura eletrônica quando uma solicitação é recebida?
Fluxo até agora: nada ainda, este é o gatilho.
A adição de uma linha é a forma como uma fatura é solicitada, portanto, esse é o sinal.
- Crie um Automated cloud flow e selecione 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: configuração

Cada coluna na nova linha se torna um token que as próximas seis ações podem usar.
Passo 2: Como construir o JSON da fatura a partir de colunas de lista?
Fluxo até o momento: o gatilho do SharePoint.
Uma única ação Compose descreve toda a fatura. É aqui que os nomes das suas colunas correspondem aos nomes esperados pelo padrão, e o texto é curto o suficiente para ser lido em uma única tela.
- Adicionar Data Operation > Compose.
- Cole o objeto abaixo em Entradas e substitua cada valor pelo token correspondente.
{
"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: configuração

Os valores de texto são representados por tokens entre aspas. Moedas e quantidades são números puros, por isso são representados pelo float.
De onde vem cada parte da fatura?
| Chave JSON | O que ele carrega | Fonte |
|---|---|---|
InvoiceId, TypeCode, InvoiceType | Número da fatura, código do tipo de documento 380 para fatura comercial e etiqueta impressa na página | InvoiceNumber, depois valores fixos |
IssueDate, DeliveryDate | Quando a fatura foi emitida e quando o serviço foi prestado | InvoiceDate, com o sufixo T00:00:00 |
Seller | Nome, ID fiscal e endereço completo | SellerName, SellerVATID, SellerStreet, SellerPostalCode, SellerCity, SellerCountry |
Buyer | Nome e endereço do cliente | BuyerName, BuyerStreet, BuyerPostalCode, BuyerCity, BuyerCountry |
LineItems | Descrição, quantidade com código da unidade C62, preço unitário e total da linha | ItemDescription, Quantidade, UnitPrice |
Totals | Moeda, total líquido, base de cálculo do imposto, taxa e valor do IVA, total geral | Moeda, VATRate e os valores calculados |
Payment | Moeda, a referência que o comprador indica ao efetuar o pagamento e a data de vencimento | Moeda, InvoiceNumber, DueDate |
Dica: As chaves monetárias são a única parte que precisa de cálculos aritméticos e devem ser números puros, em vez de strings entre aspas, para o que servem as expressões float. LineTotal é a quantidade multiplicada pelo preço unitário, TaxBasisTotal é a soma dos totais das linhas, TaxTotal é a base de cálculo do imposto multiplicada pela alíquota, dividida por 100, e GrandTotal é a soma dos dois. Para a linha capturada, os valores são 1005, 1005, 190,95 e 1195,95. Um "1005" entre aspas será rejeitado, enquanto um 1005 simples será aceito.
Etapa 3: De onde vem o PDF base?
Fluxo até agora: o gatilho mais Compose.
Os arquivos ZUGFeRD possuem uma página legível, e é aqui que tudo começa.
- Adicionar 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 (avançado):
Yes
- Site Address:
Get file content using path: configuração

Guarde o cabeçalho desta pasta. Ele é lido do zero a cada impressão, portanto, alterá-lo afetará a próxima fatura.
Passo 4: Como converter o JSON em um arquivo ZUGFeRD PDF/A-3?
Fluxo até o momento: o gatilho, Compose e Get file content using path.
Esta é a ação que gera a fatura eletrônica. Ela lê o JSON, grava o XML EN 16931 e retorna um único arquivo contendo ambas as partes.
- Adicionar a Create ZUGFeRD Invoice a partir da conexão PDF4me PDF.
- Configurar:
- ZUGFeRD version and Input Format:
2.0-JSON - Output Mode:
XmlWithPdf - Invoice JSON Data: a expressão
base64(outputs('Compose')) - Conformance Level:
EN16931 - Render Invoice on PDF:
Yes - File Content: uma expressão
base64()sobre o conteúdo de Get file content using path - File Name:
BaseInvoice.pdf
- ZUGFeRD version and Input Format:
Create ZUGFeRD Invoice: configuração

O formato de entrada determina qual campo de dados é exibido. Selecione 2.0-JSON e a ação solicitará Invoice JSON Data, e não Invoice XML Data.
O que cada configuração decide
| Campo | Valor aqui | O que ele controla |
|---|---|---|
| ZUGFeRD version and Input Format | 2.0-JSON | Qual geração ZUGFeRD a saída segue e quais dados chegam em formato JSON? Essa escolha é o que faz o campo Invoice JSON Data aparecer |
| Output Mode | XmlWithPdf | Retornar um arquivo híbrido, o PDF com o XML incorporado, em vez do XML isoladamente |
| Invoice JSON Data | base64(outputs('Compose')) | O objeto da fatura, codificado em base64 durante a entrada |
| Conformance Level | EN16931 | O perfil que a fatura alega atender e, portanto, quais chaves o JSON deve fornecer |
| Render Invoice on PDF | Yes | Desenhe a fatura legível diretamente no PDF base, em vez de deixar a página como estava |
| File Content, File Name | O PDF base | A página em que a fatura foi emitida e o nome do relatório de ação |
Dica: A ação exibe Invoice XML Data, Invoice JSON Data ou Invoice CSV Data dependendo da metade do menu suspenso que corresponde ao formato escolhido. Preencha apenas a opção que corresponde à sua escolha. Preencher dois campos de dados na mesma execução é a causa mais comum de falhas de validação nesta ação.
Etapa 5: Onde a fatura deve ser arquivada?
Fluxo até o momento: tudo através Create ZUGFeRD Invoice.
O número da fatura identifica o arquivo, o que permite que a biblioteca faça buscas.
- Adicionar SharePoint > Create file.
- Configurar:
- Site Address:
PDF4me Support - https://ynoox1.sharepoint.com/sites/PDF4meSupport - Folder Path:
/ZUGFeRD Invoices - File Name:
ZUGFeRD_seguido pelo token InvoiceNumber e.pdf - File Content: o token Body da Create ZUGFeRD Invoice
- Site Address:
Create file: configuração

Para RE-2026-0007 este arquivo é ZUGFeRD_RE-2026-0007.pdf.
Etapa 6: Como você registra o resultado na solicitação?
Fluxo até agora: tudo através de Create file.
A linha que solicitava a fatura também deveria indicar o que aconteceu com ela.
- Adicionar SharePoint > Update item.
- Configurar:
- Site Address:
PDF4me Support - https://ynoox1.sharepoint.com/sites/PDF4meSupport - List Name:
ZUGFeRD Requests - Id: o token ID do gatilho
- Title: o token Title do gatilho
- Status Value (avançado):
Generated - OutputLink (avançado): o URL da biblioteca seguido por
ZUGFeRD_, o token InvoiceNumber e.pdf
- Site Address:
Update item: configuração

O link é montado a partir do URL da biblioteca e do mesmo padrão de nome usado Create file, com o espaço no nome da biblioteca já codificado como %20.
Passo 7: Como você envia a fatura para o comprador?
Fluxo até agora: tudo através Update item.
Uma fatura eletrônica que permanece em uma biblioteca não foi emitida, portanto, a última ação consiste em entregá-la.
- Adicionar Office 365 Outlook > Send an email (V2).
- Configurar:
- Para: o token Email do gatilho
- Assunto:
Your ZUGFeRD e-invoiceseguida do token InvoiceNumber - Body: uma linha com o nome do comprador e da fatura, e indicando que o arquivo é um PDF/A-3 com XML EN 16931 incorporado
- Abra Advanced parameters e adicione o anexo:
- Nome Attachments - 1:
ZUGFeRD_mais o token InvoiceNumber mais.pdf - Conteúdo Attachments - 1: o token File Content da Create ZUGFeRD Invoice
- Importance:
Normal
- Nome Attachments - 1:
Send an email (V2): configuração

O anexo obtém seus bytes da ação que os produziu, portanto o SharePoint nunca os lê de volta.
Execute o fluxo e verifique
- Save o fluxo.
- Adicione uma linha às ZUGFeRD Requests com um comprador, um item de linha, ambas as datas e um endereço que você possa verificar.
- Abra o histórico de execução. Todas as sete ações devem estar verdes e a execução completa deve levar alguns segundos.
- Abra a biblioteca ZUGFeRD Invoices e verifique se o arquivo está lá, sob o número da fatura.
- Volte à linha: Status deve exibir Generated e OutputLink deve abrir a fatura.
- Abra o anexo do e-mail e verifique ambas as partes: a página deve mostrar os valores corretos e o arquivo deve conter o XML.
A captura de tela levou cerca de quatro segundos no total, com a fatura eletrônica sendo gerada em apenas um deles. O resultado, ZUGFeRD_RE-2026-0007.pdf, tem aproximadamente 331 KB e é apresentado como uma fatura alemã: vendedor Muster GmbH em Berlin com ID DE123456789, cliente Test Kunde AG em Muenchen, tipo de documento 380, um item de Consulting com IVA de 19%, valor líquido de 1.005,00 EUR, IVA de 190,95 EUR e total de 1.195,95 EUR.
O que você realmente construiu? Um sistema de faturamento eletrônico que parte dos seus próprios registros. Os dados permanecem onde o departamento financeiro os mantém, o padrão é atendido por um XML que você nunca precisou escrever, o comprador recebe um arquivo que seu software pode ler automaticamente e que sua equipe pode visualizar na tela, e a linha de solicitação registra que o arquivo foi enviado.
Variações comuns que você pode adicionar sem reconstruir
Como isso se compara às outras formas de gerar uma fatura ZUGFeRD
Cada linha descreve a alternativa. A última linha é este fluxo.
| Comparação | Quem o dirige? | De onde vêm os dados? | O que você mantém |
|---|---|---|---|
| Software de faturamento com exportação ZUGFeRD versus este fluxo | Qualquer pessoa, dentro desse produto | Registros do próprio produto | Uma assinatura, e tudo o que o produto oferece |
| Plataforma de faturamento eletrônico versus este fluxo | Finanças, através de um portal | Uploads ou uma integração | Um contrato por documento e sua respectiva conexão |
| Biblioteca de desenvolvedor versus este fluxo | Um desenvolvedor, dentro de um aplicativo | Seu banco de dados, por meio de código | O código, as atualizações de esquema e os lançamentos |
| Esse fluxo | Qualquer pessoa que possa adicionar uma linha à lista | Uma lista do SharePoint que a equipe mantém | Um objeto JSON e um PDF base |
Perguntas frequentes
O que é uma fatura ZUGFeRD?
Uma fatura ZUGFeRD é um arquivo que funciona de duas maneiras. É um PDF normal que qualquer pessoa pode abrir e ler, e dentro dele há um anexo XML contendo a mesma fatura como dados estruturados. O sistema de contabilidade do comprador lê o XML e registra a fatura sem que ninguém precise digitá-la, enquanto o responsável pelas contas a pagar ainda visualiza uma página.
O formato vem do FeRD, o fórum alemão para faturamento eletrônico, e seu equivalente francês é Factur-X, que é a mesma ideia com outro nome.
O que é o formato ZUGFeRD?
Tecnicamente, trata-se de um contêiner PDF/A-3 com um arquivo XML incorporado na sintaxe Cross Industry Invoice e um perfil que indica o grau de completude dos dados. O perfil utilizado aqui é EN16931, que corresponde ao padrão semântico europeu para faturamento eletrônico: o conjunto de campos que EN 16931 define como o núcleo de uma fatura.
Na prática, a consequência disso para a automação é que a saída é avaliada com base no XML, e não na página. Forneça os dados solicitados pelo perfil e o arquivo é aprovado; deixe a página mais bonita e nada muda.
Como criar uma fatura ZUGFeRD?
Você precisa de três coisas: os dados da fatura em formato estruturado, uma página para a parte que será preenchida pelo usuário e um programa que insira o XML no PDF como um anexo PDF/A-3.
Neste fluxo, os dados são uma linha do SharePoint convertida em JSON, a página é o BaseInvoice.pdf e Create ZUGFeRD Invoice executa a terceira parte com Output Mode XmlWithPdf. Se seus dados já existirem como XML Cross Industry Invoice ou como uma linha CSV, altere o formato de entrada e utilize esse formato. O restante do fluxo permanece inalterado.
Qual a diferença entre ZUGFeRD e XRechnung?
Ambos atendem ao mesmo padrão europeu, e a diferença está na formatação. ZUGFeRD é híbrido: um PDF legível com o XML incorporado, adequado para faturas enviadas a clientes que podem abri-las manualmente. XRechnung é somente XML e é o formato exigido pelos compradores do setor público alemão.
Se você enviar faturas para empresas, o arquivo híbrido geralmente é a opção mais segura, pois pode ser lido por qualquer pessoa que o abra. Se a fatura for para um órgão público, verifique qual formato é exigido por esse órgão antes de enviar.
Solução de problemas
Abra o resultado Compose no histórico de execuções e leia-o como JSON antes de qualquer outra coisa. Uma coluna vazia deixa uma chave vazia, e um valor monetário que manteve as aspas chega como texto onde um número era esperado. Ambos produzem um objeto que parece correto, mas ainda assim falha na conversão.
Conformance Level define quais campos o perfil exige. Alegar conformidade com EN16931 enquanto o JSON omite chaves esperadas pelo perfil resulta em falha na validação, mesmo que o arquivo abra normalmente. Forneça as chaves ausentes ou utilize um perfil de nível inferior.
Render Invoice on PDF está definida como Não, portanto o XML foi incorporado sem exibir nada. O arquivo ainda é uma fatura eletrônica válida, mas a parte escrita à mão corresponde ao conteúdo original do PDF.
Verifique o conteúdo do anexo na etapa de e-mail e o File Content em Create file. Ambos devem vir da Create ZUGFeRD Invoice. Anexar o PDF base, em vez disso, envia uma página que parece correta, mas não contém nada para o software deles ler.
Próximos passos
O mesmo padrão de sete etapas (uma linha chega, uma fatura é descrita como dados, um arquivo é produzido, arquivado, registrado e enviado) é o que toda exigência de faturamento eletrônico realmente requer, independentemente do formato que seus compradores acabem precisando.