Assim como o core Prisma e algumas libs este módulo de funções eu modifiquei a partir de um módulo lua já existente, visto que sua licença permite isso:
https://github.com/cpressey/pdf.lua/blob/master/UNLICENSE
A versão lua pode ser encontrada aqui:
https://github.com/cpressey/pdf.lua
No futuro, não tão perto, quero desenvolver eu mesmo uma lib pdf com base em C mais completa, do mesmo modo que fiz com outras libs, incluindo a psqlite3, mysqlite, ig, pcgi etc.
Bem, trata-se de uma lib básica que gera um arquivo pdf de texto na versão pdf-1.0 sem codificação.
A lib, se já não perceberam está inclusa na versão Prisma-1.0.100, inclusive nos exemplos.
Vamos ao exemplo básico:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
local PDF = inclua "pdf" pdf = PDF.novo() helv = pdf:nova_fonte{ nome = "Helvetica" }; times = pdf:nova_fonte{ nome = "Times-Roman" }; corrier = pdf:nova_fonte{ nome = "Corrier" }; pag = pdf:nova_pagina(); pag:inicio_texto(); pag:def_fonte(corrier, 23); pag:def_texto_pos(10,700); pag:mostre( "Ola mundo em prisma pdf" ); pag:fim_texto(); pag:ad(); pdf:escreva("minimo.pdf"); |
Detalhes:
1 |
local PDF = inclua "pdf" |
Incluímos a biblioteca pdf para usar suas funções.
1 |
pdf = PDF.novo() |
Criamos um novo objeto pdf.
1 2 3 |
helv = pdf:nova_fonte{ nome = "Helvetica" }; times = pdf:nova_fonte{ nome = "Times-Roman" }; corrier = pdf:nova_fonte{ nome = "Corrier" }; |
Definimos algumas fontes. (Só vamos usar uma no exemplo, é apenas ilustrativo);
1 |
pag = pdf:nova_pagina(); |
Criamos um objeto página pdf.
1 |
pag:inicio_texto(); |
Definimos que vamos começar a escrever na página.
1 |
pag:def_fonte(corrier, 23); |
Antes de escrevermos, temos que definir a fonte a ser usada (criada acima). O segundo parâmetro é o tamanho, ok!
1 |
pag:def_texto_pos(10,700); |
Definindo a posição do texto na página (em coordenadas: col x lin);
Obs.: a linha (700 é de baixo para cima, isto é, se colocar ‘5’ no segundo parâmetro, o texto sairá no rodapé e não no topo, a coluna (10) é normal);
Obs.: se o valor for negativo ex.: -10, então a posição é de cima para baixo, ou seja, -10 sai no topo e não no rodapé.
1 |
pag:mostre( "Ola mundo em prisma pdf" ); |
Enfim, imprimimos na página em pdf a string acima, note que usamos o método ‘mostre’.
Obs.: se quisesse escrever mais linhas no documento seria necessário definir nova posição para a nova linha de modo a não escrever em cima da linha já escrita.
1 |
pag:fim_texto(); |
Depois de colocar todo o texto desejado na página, finalizamos com o método ‘fim_texto()’;
1 |
pag:ad(); |
Ainda temos que adicionar a página escrita acima no documento com o método ‘ad()’
1 |
pdf:escreva("minimo.pdf"); |
E, no fim, basta salvar em um arquivo usando o método ‘escreva()’;
Pronto, tente abrir o arquivo gerado minimo.pdf e verá algo do tipo:
Veja mais exemplos de pdf que estão inclusos nos exemplos prisma:
http://www.mediafire.com/file/0t003qn58o4itjl/exemplos_prisma.7z
Eis um exemplo que escreve várias linhas e cria várias páginas usando laços de repetição:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
local PDF = inclua "pdf" pdf = PDF.novo() times = pdf:nova_fonte{ name = "Times-Roman" } pag = {} para i = 1 , 5 inicio pag[i] = pdf:nova_pagina() //escrevendo para k = 20 , 780,20 inicio pag[i]:inicio_texto() pag[i]:def_fonte(times, 12) pag[i]:defrgbcor(pag[i].CORLETRA,0,0,1); pag[i]:def_texto_pos(20, -1 * k); //(col,lin) se lin for positivo é de baixo para cima, se negativo de cima para baixo //ou seja -10 é = a 10 do topo da página, 10 é 10 do rodapé da página. pag[i]:mostre( k .. ' - Ola mundo em prisma pdf || Ola mundo em prisma pdf'); pag[i]:fim_texto(); fim //fim para i = 20 fim//fim para i = 1 para i = 1 , #pag inicio pag[i]:ad(); //adiciona todas as paginas fim pdf:escreva("nova_lin.pdf") |
Desenhando linhas
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
local PDF = inclua "pdf" pdf = PDF.novo() times = pdf:nova_fonte{ name = "Times-Roman" } pag = pdf:nova_pagina() //desenhando reta pag:defrgbcor(pag.CORTRACO, 0.5, 0, 1) pag:deflinhalargura(5); pag:movapara(50,650)//inicio pag:linhapara(500,650)//direcao da reta pag:desenhe() //desenhando reta pag:defrgbcor(pag.CORTRACO, 1 , 0.4, 1) pag:deflinhalargura(10); pag:movapara(50,550)//inicio pag:linhapara(500,550)//direcao da reta pag:desenhe() //desenhando reta pag:defrgbcor(pag.CORTRACO, 0.5, 1, 1) pag:deflinhalargura(20); pag:movapara(50,450)//inicio pag:linhapara(500,450)//direcao da reta pag:desenhe() //desenhando reta pag:defrgbcor(pag.CORTRACO, 1, 0, 0.6) pag:movapara(50,350)//inicio pag:linhapara(500,350)//direcao da reta pag:desenhe() //escrevendo pag:inicio_texto() pag:def_fonte(times, 12) pag:def_texto_pos(12,-30);//680); pag:defrgbcor(pag.CORLETRA,0,0,1); pag:mostre( 'Ola mundo em prisma pdf'); pag:fim_texto(); pag:inicio_texto() pag:def_fonte(times, 12) pag:def_texto_pos(100,600); pag:defrgbcor(pag.CORLETRA,1,0,0); pag:mostre( 'mais um linha no pdf'); pag:fim_texto(); pag:ad(); pdf:escreva("linhas.pdf") |
Desenhando círculos e retângulos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
//retangulos e circulos local PDF = inclua "pdf" pdf = PDF.novo() pag = pdf:nova_pagina() // retangulo col,lin,larg,alt pag:defrgbcor(pag.CORTRACO,0,1,0);//rgb( 0.0-1.0, 0.0-1.0, 0.0-1.0) => 1.0 = 100%(255) e 0. = 50%(125); pag:deflinhalargura(50); pag:retangulo(50,400,300,300); pag:desenhe(); // retangulo col,lin,larg,alt pag:defrgbcor(pag.CORPREENCH,0,1,1); pag:deflinhalargura(20); pag:retangulo(100,450,200,200); pag:preencha(); pag:desenhe(); // retangulo col,lin,larg,alt pag:defrgbcor(pag.CORPREENCH, 1,0,1); pag:deflinhalargura(12); pag:retangulo(400,450,160,200); pag:preencha(); pag:desenhe(); pag:ad(); //adicionando pagina 1 //------------------------------ circulos: pag2 = pdf:nova_pagina() // circulo(col,lin,diam pag2:defrgbcor(pag2.CORPREENCH,0,0,1); pag2:circulo( 200, 600, 100) pag2:preencha(); pag2:desenhe() pag2:defrgbcor(pag2.CORTRACO,1,1,0); pag2:deflinhalargura(20); pag2:circulo( 300, 500, 150) pag2:desenhe() pag2:ad();// adicionando pagina 2 pag3 = pdf:nova_pagina(); pag3:defcmykcor(pag3.CORPREENCH,0,1,1,0); //---------- (x,y,lados); pag3:quadrado(200,400, 200); pag3:preencha(); pag3:desenhe(); pag3:ad(); pdf:escreva("ret_circ.pdf") //por fim escrever o resultado num arquivo .pdf |
Até mais …
Att. Adalberto