Como criar um Gerador de PDF: mudanças entre as edições

De EAPn
Ir para navegação Ir para pesquisar
(Criou página com '==Passo 1 - Criar um Template== Usaremos o LibreOffice Writer ([https://www.libreoffice.org/download/download/ Baixe clicando aqui]) para gerar documento de template em format...')
 
Sem resumo de edição
Linha 14: Linha 14:
[[Arquivo:Pdf3.png|commoldura|centro|Figura 3]]
[[Arquivo:Pdf3.png|commoldura|centro|Figura 3]]
<br>
<br>
Com isso concluído, você já tem um template funcional, ....(escrever mais sobre o WebService de PDF do inf http://pdf.inf.ufsc.br/gera?odturl=).
Com isso concluído, você já tem um template funcional, e ele deve estar hospedado no servidor e ....(escrever mais sobre o WebService de PDF do inf http://pdf.inf.ufsc.br/gera?odturl=).


==Passo 2 - Criar documentos==
==Passo 2 - Criar parâmetro==
Crie um parâmetro clicando na pool do processo, seguindo em '''Data > Parameters > Add...''' com nome '''wsPDFurl''' do tipo '''Text'''.
Defina o valor do parâmetro em '''Configure > Parameters''', ao encontrar o '''wsPDFurl''' definido anteriormente, insira este valor: '''http://pdf.inf.ufsc.br/gera?odturl='''
[[Arquivo:Pdf4.png|commoldura|centro|Figura 4]]
<br>
Na Figura 4 pode-se observar as duas etapas realizadas,

==Passo 3 - Criar documentos==
Deve-se criar um '''document''' do tipo '''single''' para cada PDF gerado. <br>
Deve-se criar um '''document''' do tipo '''single''' para cada PDF gerado. <br>
'''Atenção:''' Se for preciso enviar esse documento como anexo por e-mail, será necessário criar um '''document''' do tipo '''multiple''', pois o Bonita só aceita documentos múltiplos como anexo. É preciso criar um '''Operation''' na tarefa para que seja adiciona à lista.
'''Atenção:''' Se for preciso enviar esse documento como anexo por e-mail, será necessário criar um '''document''' do tipo '''multiple''', pois o Bonita só aceita documentos múltiplos como anexo. É preciso criar um '''Operation''' na tarefa para que seja adiciona à lista.
[[Arquivo:Pdf5.png|commoldura|centro|Figura 5]]

<br>
==Passo 3 - Criar uma variável para as chaves==
Por convenção, o documento múltiplo para email será explicitado adicionando a palavra '''email''' ao final do nome, como realizado na Figura 5.
==Passo 4 - Criar uma variável para as chaves==
Já no projeto a ser inserido o gerador de PDF:
Já no projeto a ser inserido o gerador de PDF:


Linha 42: Linha 51:
*Após isso salve.
*Após isso salve.


==Passo 4 - Criar o conector==
==Passo 5 - Criar o conector==
Com a tarefa de serviço selecionada, adicione um conector do tipo '''Groovy Script''' em '''Execution > Connectors in > Add...'''. Insira nomes apropriados para o nome do conector e script, como por exemplo: '''gerarPDF()'''.
<pre>
import org.apache.http.HttpEntity
import org.apache.http.HttpResponse
import org.apache.http.NameValuePair
import org.apache.http.client.HttpClient
import org.apache.http.client.entity.UrlEncodedFormEntity
import org.apache.http.client.methods.HttpPost
import org.apache.http.auth.AuthScope
import org.apache.http.message.BasicNameValuePair
import org.bonitasoft.engine.bpm.document.DocumentValue
import org.apache.http.impl.client.HttpClients;

//Parte 1 - Requisitando template no servidor

Long case_id = processInstanceId;
HttpClient httpclient = HttpClients.createDefault();
String url = wsPDFurl + "http://documentacao.processos.ufsc.br/templates/p00/template_teste.odt"; //Isso é um exemplo, esta url depende muito do caminho escolhido para hospedagem do documento
HttpPost httppost = new HttpPost(url);

//Parte 2 - Preenchendo a lista com os valores que se deseja inserir no documento.
//Obs.: A ordem utilizada no Passo de criação das chaves de template, deve ser seguida exatamente da mesma forma nessa lista.

List<String> valores = new ArrayList<String>();

valores.addAll(
bdm.getNome(),
bdm.getCelular().toString(), //Como é um array de strings, deve se converter qualquer outro tipo de dado em string.
bdm.getEmail()
);

// Parte 3 - Criando uma lista que relaciona cada chave com seu valor.

ArrayList<String> chaves = chavesTemplate; //Requisita a variável local já criada com as chaves

List<NameValuePair> params = new ArrayList<NameValuePair>();

params.addAll( // Pode-se imaginar essa lista em um laço "for", mas por um motivo desconhecido, a utilização dele acaba em erro.
new BasicNameValuePair(chaves[0], valores[0]),
new BasicNameValuePair(chaves[1], valores[1]),
new BasicNameValuePair(chaves[2], valores[2])
//Instancie novos objetos nessa lista com base no número de valores a serem relacionados.
);


httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
HttpResponse response = httpclient.execute(httppost);
byte[] content = response.getEntity().getContent().getBytes();
String filename = "P00_Exemplo-" + case_id.toString() + ".pdf"; //Modifique o nome
apiAccessor.processAPI.attachDocument(processInstanceId, "documentoPDF", filename, "", content); //Modifique o nome do documento a ser anexado.
</pre>

Edição das 20h54min de 11 de maio de 2021

Passo 1 - Criar um Template

Usaremos o LibreOffice Writer (Baixe clicando aqui) para gerar documento de template em formato .odt.
Devemos inserir as chaves que serão posteriormente usadas para inserir informações.

  • Vá em Inserir > Campo > Outros Campos, ou simplesmente Ctrl + F2;
FIgura 1
  • Na janela que será aberta, siga em Variáveis;
  • Selecione Tipo como Campo do Usuário e Formato como Texto;
  • Em nome e valor, por convenção, escreva o mesmo texto e colocando no formato CT_nomeDaVariavel, como foi feito na Figura 2;
Figura 2
  • Ao clicar em Inserir, você verá que a chave foi adicionada ao documento;
  • Na Figura 3, temos um exemplo com chaves: CT_Nome, CT_Celular e CT_Email;
Figura 3


Com isso concluído, você já tem um template funcional, e ele deve estar hospedado no servidor e ....(escrever mais sobre o WebService de PDF do inf http://pdf.inf.ufsc.br/gera?odturl=).

Passo 2 - Criar parâmetro

Crie um parâmetro clicando na pool do processo, seguindo em Data > Parameters > Add... com nome wsPDFurl do tipo Text. Defina o valor do parâmetro em Configure > Parameters, ao encontrar o wsPDFurl definido anteriormente, insira este valor: http://pdf.inf.ufsc.br/gera?odturl=

Figura 4


Na Figura 4 pode-se observar as duas etapas realizadas,

Passo 3 - Criar documentos

Deve-se criar um document do tipo single para cada PDF gerado.
Atenção: Se for preciso enviar esse documento como anexo por e-mail, será necessário criar um document do tipo multiple, pois o Bonita só aceita documentos múltiplos como anexo. É preciso criar um Operation na tarefa para que seja adiciona à lista.

Figura 5


Por convenção, o documento múltiplo para email será explicitado adicionando a palavra email ao final do nome, como realizado na Figura 5.

Passo 4 - Criar uma variável para as chaves

Já no projeto a ser inserido o gerador de PDF:

  • Insira uma tarefa do tipo Service;
    • Vá em Data > Local Variables > Add...;
  • Adicione uma variável local a ela com nome chavesTemplate do tipo Java Object, automaticamente o Bonita define a Classe como java.util.List;
  • Adicionando um valor padrão, iremos colocar todas as chaves do template em uma lista de Strings e no final retornaremos ela, dessa forma:
List<String> lista =  new ArrayList<String>();

lista.addAll(
	"CT_Nome",
	"CT_Celular",
	"CT_Email"
);

return lista;
  • Após isso salve.

Passo 5 - Criar o conector

Com a tarefa de serviço selecionada, adicione um conector do tipo Groovy Script em Execution > Connectors in > Add.... Insira nomes apropriados para o nome do conector e script, como por exemplo: gerarPDF().

import org.apache.http.HttpEntity
import org.apache.http.HttpResponse
import org.apache.http.NameValuePair
import org.apache.http.client.HttpClient
import org.apache.http.client.entity.UrlEncodedFormEntity
import org.apache.http.client.methods.HttpPost
import org.apache.http.auth.AuthScope
import org.apache.http.message.BasicNameValuePair
import org.bonitasoft.engine.bpm.document.DocumentValue
import org.apache.http.impl.client.HttpClients;

//Parte 1 - Requisitando template no servidor

Long case_id = processInstanceId;
HttpClient httpclient = HttpClients.createDefault();
String url = wsPDFurl + "http://documentacao.processos.ufsc.br/templates/p00/template_teste.odt"; //Isso é um exemplo, esta url depende muito do caminho escolhido para hospedagem do documento
HttpPost httppost = new HttpPost(url);

//Parte 2 - Preenchendo a lista com os valores que se deseja inserir no documento.
//Obs.: A ordem utilizada no Passo de criação das chaves de template, deve ser seguida exatamente da mesma forma nessa lista.

List<String> valores = new ArrayList<String>();

valores.addAll(
	bdm.getNome(),
    bdm.getCelular().toString(), //Como é um array de strings, deve se converter qualquer outro tipo de dado em string.
    bdm.getEmail()
);

// Parte 3 - Criando uma lista que relaciona cada chave com seu valor.

ArrayList<String> chaves = chavesTemplate; //Requisita a variável local já criada com as chaves

List<NameValuePair> params = new ArrayList<NameValuePair>();

params.addAll( // Pode-se imaginar essa lista em um laço "for", mas por um motivo desconhecido, a utilização dele acaba em erro.
	new BasicNameValuePair(chaves[0], valores[0]),
	new BasicNameValuePair(chaves[1], valores[1]),
	new BasicNameValuePair(chaves[2], valores[2])
    //Instancie novos objetos nessa lista com base no número de valores a serem relacionados.
);


httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
HttpResponse response = httpclient.execute(httppost);
byte[] content = response.getEntity().getContent().getBytes();
String filename = "P00_Exemplo-" + case_id.toString() + ".pdf"; //Modifique o nome
apiAccessor.processAPI.attachDocument(processInstanceId, "documentoPDF", filename, "", content); //Modifique o nome do documento a ser anexado.