Sails não possui um recurso nativo para geração de arquivos PDF, e nem precisa. Existem dezenas de biliotecas JavaScript que fazem isso!.
Escolhemos a biblioteca PDFKit pela sua flexibilidade, compatibilidade e segurança, mas você pode escolher qualquer outra que seja compatível com Node.js
Se esta é sua primeira vez aqui, recomendamos a leitura dos conteúdos abaixo antes de continuar:
npm i pdfkit --savesails generate controller nome-do-controller info: Created a new controller ("nome-do-controle") at api/controllers/NomeDoControleController.js!config/routes.js e adicione a seguinte linha: 'GET /relatorio':'NomeDoControleController.gerar',api/controllers/NomeDoControleController.js). Ele provavelmente conterá algo do tipo:
/**
* NomeDoControleController
*
* @description :: Server-side actions for handling incoming requests.
* @help :: See https://sailsjs.com/docs/concepts/actions
*
*/
module.exports = {
}
/**
* Exemplo de PDF Report Controller
*
* @description :: Server-side actions for handling incoming requests.
* @help :: See https://sailsjs.com/docs/concepts/actions
* :: See https://pdfkit.org/docs/getting_started.html
*/
// carrega em memoria o PDFkit
const PDFDocument = require('pdfkit')
module.exports = {
// Funcao evocada pela rota 'GET /relatorio':'NomeDoControleController.gerar',
// definida no arquivo config/routes.js
gerar: function (req, res) {
// Cria um documento PDF mas mantem em memoria (bufferedPages = true)
// A omissao do atributo `size` atribui o formato `letter` ao documento
const doc = new PDFDocument({ size: 'A4', bufferPages: true })
const formato = {
margins: {
top: 50,
bottom: 50,
left: 72,
right: 72
},
size: 'A4',
font: 'Courier'
}
// define as dimensoes especificas desta pagina inicial
doc.switchToPage(0)
doc
.fontSize(30)
.text('Titulo de seu documento', 100, 200)
.fontSize(25)
.text('Subtitulo do documento', 100, 230)
.fontSize(12)
.text('Resumo inicial do que se deve comunicar com este relatorio', 110, 260)
// aplica as dimensoes gerais definidas no objeto 'formato'
// adiciona uma pagina seguinte com texto longo. Observe que o PDFKit separa as linhas
doc.addPage(formato)
.fontSize(10).text('conteudo textual e relevante que deve ser apresentado no relatorio em letras menores e com conteudo longo. Observe a mudança de linha', 100, 100)
// Desenha um triangulo numa nova pagina
doc.addPage(formato)
.save()
.moveTo(100, 150)
.lineTo(100, 250)
.lineTo(200, 250)
.fill('#FF3300');
// Adiciona um texto de outra cor e um link, sem definicao de margem
doc
.addPage()
.fillColor('blue')
.text('Aqui nós temos um link!', 100, 100)
.underline(100, 100, 160, 27, { color: '#0000FF' })
.link(100, 100, 160, 27, 'http://google.com/');
// captura um determinado conjunto de paginas. A omissao significa todos
const range = doc.bufferedPageRange() // => { start: 0, count: 3 }
// navega pagina a pagina para preencher no rodape o numero de paginas totais
for (i = range.start, end = range.start + range.count, range.start <= end; i < end; i++) {
doc.switchToPage(i)
doc.text(`Pagina ${i + 1} de ${range.count}`, 100, 700)
}
// finaliza a montagem das paginas
doc.flushPages()
// transforma em streaming de saida e envia ao requisitante
doc.pipe(res)
// finaliza o processamento e limpa a memoria
doc.end()
}
}
<a href='/relatorio'>Relatorio</a><iframe src="/relatorio" frameborder="1"></iframe>sails lift, faça login e visualize seu pdf (ou clique no link [Relatorio])
//Exemplo de politica "sem necessidade de autenticação"
//que deve estar contida no arquivo config/policies.js
NomeDoControleController: {
'gerar': true
},
Este é um exemplo simplificado para demonstrar como gerar conteúdo PDF dentro de uma aplicação Sails. Visite o site PDFKit para conhecer outras opções de construção de conteúdo para seu arquivo PDF.