Mesclando documentos PDF com Protheus e Ghostscript
Ghostscript
Ghostscript é um intérprete para a linguagem PostScript® e arquivos PDF . Ele está disponível sob a licença GNU GPL Affero ou licenciado para uso comercial pela Artifex Software, Inc. Ele está em desenvolvimento ativo há mais de 30 anos e foi portado para vários sistemas diferentes durante esse período. Ghostscript consiste em uma camada de interpretação PostScript e uma biblioteca gráfica.
Download Ghostscript https://www.ghostscript.com/releases/gsdnld.html
Como começar
Para realizar a mesclagem de documentos usando Protheus e Ghostscript, precisaremos baixar as DLL’s do Ghostscript
Neste exemplo, precisarei apenas dos seguintes arquivos do Ghostscript:
- gsdll64.dll
- gsdll64.lib
- gswin64.exe
- gswin64c.exe
Irei salvá-los na pasta onde está instalado o smartclient.exe, ficando assim: C:\Totvs\Protheus2310\bin\smartclient\gs\
Sintaxe
1 2 3 4 5 |
gswin64.exe -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=c:\arquivomesclado.pdf -dBATCH arquivo1.pdf arquivo2.pdf -dNOPAUSE = Desativa o prompt e pausa no final de cada página. -sDEVICE = Informe o dispositivo de saida (pdfwrite para gerar um arquivo PDF) -dBATCH = arquivos que serão mesclados |
Exemplo 1
Criando e Mesclando documentos
Fonte: CriandoDocumentoPDFeMesclando.prw
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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
#INCLUDE "PROTHEUS.CH" #INCLUDE "RPTDEF.CH" #INCLUDE "FWPRINTSETUP.CH" /*/{Protheus.doc} CriandoDocumentoPDFeMesclando Mesclando arquivos usando usando @type function @author Rodrigo Araujo @since 24/03/2024 /*/ User Function Exp0033() Local cDrive, cDir, cExt, cNome Local i:= 0 Local cDestino := "" Local cArquivos := "" Local aArquivos := {} Local cArgumento:= "" Local cMesclado := "Documento Mesclado.pdf" Local cSmartIni := GetRemoteIniName() //Pega o caminho do smartclient.exe para poder localizar o arquivo gswin64.exe Local cGsWin64 := "" //Local onde está o executável do Ghostscript Local cArgsBat := "" Local oReport Local oFont12 := TFont():New("Arial",,13,,.F.,,,,,.F.,.F.) Local oFont14 := TFont():New("Arial",,16,,.T.,,,,,.F.,.F.) Local nAviso := 0 nAviso := Aviso("Mesclar documentos","Gerar arquivos PDF com Protheus e Mesclar os arquivos em um só" + CRLF + CRLF +; "Neste exemplo irei criar 2 arquivos chamados:" + CRLF + CRLF +; "'Documento Gerado pelo Protheus1.pdf' e 'Documento Gerado pelo Protheus2.pdf'" + CRLF + CRLF +; "Ao Mesclar, o novo arquivo se chamará 'Documento Mesclado.pdf'",{"Continuar","Fechar"},2) If nAviso==2 Return Endif SplitPath( cSmartIni, @cDrive, @cDir, @cNome, @cExt ) cDir := IIF(Right(cDir,1)=="\", cDir, cDir + "\") cGsWin64 := cDrive+cDir + "gs\gswin64.exe" If !File(cGsWin64) MsgStop("O plugin GSWIN64.EXE não existe!","ATENÇÃO") Return Endif If File(cGsWin64) //localizar o arquivo gswin64.exe cDestino := tFileDialog( "", 'Selecione Pasta de Destino',, "C:\LocalData\Mesclar Aquivos\", .F., GETF_RETDIRECTORY ) cDestino := IIF(Right(cDestino,1)=="\", cDestino, cDestino + "\") If ExistDir(cDestino) /*Inicio - Gerando um documento em PDF*/ //Arquivo 1 oReport:= FWMSPrinter():New("Documento Gerado pelo Protheus1.pdf",6, .f., cDestino, .t.,.T.,,,.T.,.F.,,.F.,1) oReport:SetResolution(70) oReport:SetPortrait() oReport:SetPaperSize( 9 ) oReport:SetMargin(10, 10, 10, 10) oReport:nDevice := IMP_PDF oReport:cPathPDF:= cDestino oReport:Say(100, 050, "Visão geral do Ghostscript", oFont14) oReport:Say(120, 050, "Ghostscript é um intérprete para a linguagem PostScript® e arquivos PDF . Ele está disponível sob a licença GNU", oFont12) oReport:Say(140, 050, "GPL Affero ou licenciado para uso comercial pela Artifex Software, Inc. Ele está em desenvolvimento ativo há", oFont12) oReport:Say(160, 050, "mais de 30 anos e foi portado para vários sistemas diferentes durante esse período.", oFont12) oReport:Say(180, 050, "Ghostscript consiste em uma camada de interpretação PostScript e uma biblioteca gráfica.", oFont12) oReport:Print() //Arquivo 2 oReport:= FWMSPrinter():New("Documento Gerado pelo Protheus2.pdf",6, .f., cDestino, .t.,.T.,,,.T.,.F.,,.F.,1) oReport:SetResolution(70) oReport:SetPortrait() oReport:SetPaperSize( 9 ) oReport:SetMargin(10, 10, 10, 10) oReport:nDevice := IMP_PDF oReport:cPathPDF:= cDestino oReport:Say(100, 050, "GitHub", oFont14) oReport:Say(120, 050, "GitHub é uma plataforma de hospedagem de código-fonte e arquivos com controle de versão usando o Git.", oFont12) oReport:Say(140, 050, "Ele permite que programadores, utilitários ou qualquer usuário cadastrado na plataforma contribuam", oFont12) oReport:Say(160, 050, "em projetos privados e/ou Open Source de qualquer lugar do mundo.", oFont12) oReport:Print() /*Fim*/ cArquivos := TFileDialog( "Arquivos PDF (*.pdf)",'Selecione os arquivos',,'C:\LocalData\Mesclar Aquivos',.F.,GETF_MULTISELECT) aArquivos := Separa(cArquivos,";") //Preparando os argumentoos com os arquivos que serão mesclados For i := 1 To Len(aArquivos) cArgumento += CHR(34) + aArquivos[i]+ CHR(34) + " " cArgsBat += "%" + Alltrim(str(i+1)) + " " Next If Len(aArquivos) > 0 //Criando o arquivo bat com a sintaxe para mesclar //MemoWrite( cDestino + "\mesclarpdf.bat", "@ECHO OFF" + CRLF + cGsWin64 + " -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=%1 -dBATCH %2 %3") //cArgsBat = Contem a quantidade de arquivos que serão mesclados MemoWrite( cDestino + "mesclarpdf.bat", "@ECHO OFF" + CRLF + cGsWin64 + " -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=%1 -dBATCH " + cArgsBat) If File(cDestino + "mesclarpdf.bat") //Aqui eu executo o batch para que ele possa mescar os arquivos //Coloco o CHR(34) antes e depois pois a pasta e o arquivo podem ter espaços e isso garante que o programa gswin64.exe irá ler os arquivos corretamente. ShellExecute("open",; CHR(34) + cDestino + "mesclarpdf.bat" + CHR(34),; CHR(34) + cDestino + cMesclado + CHR(34) + " " + cArgumento,; cDestino,2) Sleep(1000) //aguardo alguns segundos antes de excluir os arquivos não mais necessarios If File(cDestino + cMesclado) fErase(cDestino + "mesclarpdf.bat") Endif Endif Endif Endif Endif Return |
Exemplo 2
Mesclando documentos
Fonte: MesclaDocumentosPDF.prw
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 58 59 60 61 62 |
#INCLUDE "PROTHEUS.CH" /*/{Protheus.doc} Exp0033 Mesclando arquivos usando usando @type function @author Rodrigo Araujo @since 24/03/2024 /*/ User Function Exp0033() Local cDrive, cDir, cExt, cNome Local i:= 0 Local cDestino := "" Local cArquivos := "" Local aArquivos := {} Local cArgumento:= "" Local cMesclado := "arquivo-mesclado.pdf" Local cSmartIni := GetRemoteIniName() //Pega o caminho do smartclient.exe para poder localizar o arquivo gswin64.exe Local cGsWin64 := "" //Local onde está o executável do Ghostscript Local cArgsBat := "" SplitPath( cSmartIni, @cDrive, @cDir, @cNome, @cExt ) cDir := IIF(Right(cDir,1)=="\", cDir, cDir + "\") cGsWin64 := cDrive+cDir + "gs\gswin64.exe" If !File(cGsWin64) MsgStop("O arquivo GSWIN64.EXE não existe!","ATENÇÃO") Return Else cDestino := tFileDialog( "", 'Selecione Pasta de Destino',, "C:\LocalData\Mesclar Aquivos\", .F., GETF_RETDIRECTORY ) cDestino := IIF(Right(cDestino,1)=="\", cDestino, cDestino + "\") If ExistDir(cDestino) cArquivos := TFileDialog( "Arquivos PDF (*.pdf)",'Selecione os arquivos',,'C:\LocalData\Mesclar Aquivos',.F.,GETF_MULTISELECT) aArquivos := Separa(cArquivos,";") //Preparando os argumentoos com os arquivos que serão mesclados For i := 1 To Len(aArquivos) cArgumento += CHR(34) + aArquivos[i]+ CHR(34) + " " cArgsBat += "%" + Alltrim(str(i+1)) + " " Next //Criando o arquivo bat com a sintaxe para mesclar //MemoWrite( cDestino + "\mesclarpdf.bat", "@ECHO OFF" + CRLF + cGsWin64 + " -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=%1 -dBATCH %2 %3") //cArgsBat = Contem a quantidade de arquivos que serão mesclados MemoWrite( cDestino + "mesclarpdf.bat", "@ECHO OFF" + CRLF + cGsWin64 + " -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=%1 -dBATCH " + cArgsBat) If File(cDestino + "mesclarpdf.bat") //Aqui eu executo o batch para que ele possa mescar os arquivos //Coloco o CHR(34) antes e depois pois a pasta e o arquivo podem ter espaços e isso garante que o programa gswin64.exe irá ler os arquivos corretamente. ShellExecute("open",; CHR(34) + cDestino + "mesclarpdf.bat" + CHR(34),; CHR(34) + cDestino + cMesclado + CHR(34) + " " + cArgumento,; cDestino,2) Sleep(1000) //aguardo alguns segundos antes de excluir os arquivos não mais necessarios If File(cDestino + cMesclado) fErase(cDestino + "mesclarpdf.bat") Endif Endif Endif Endif Return |
Deixe uma resposta