Página 1 de 1

Mostrar PDF sem opção de salvar/etc

Enviado: 11 Nov 2014 22:52
por JoséQuintas
Úso o formato PDF pra muita coisa, incluindo os relatórios normais do sistema.
Até aí... tudo normal.

Mas não reparei em uma coisa:
Tem lá a opção de salvar como...
Nisto o usuário pode navegar por todas as pastas, e até mesmo salvar o PDF encima de um DBF.

Existe alguma opção de bloquear isto?

Motivo: ao liberar acesso pra fora da empresa, tudo pode acontecer.

Mostrar PDF sem opção de salvar/etc

Enviado: 12 Nov 2014 11:34
por Jairo Maia
Olá José,

Com o PDFCreator você pode desabilitar essas opções antes de enviar, mas se alguém estiver mal intencionado isso nem adianta. Na internet tem vários programas que quebram essa proteção.

Mostrar PDF sem opção de salvar/etc

Enviado: 12 Nov 2014 11:40
por JoséQuintas
A intenção é apenas aonde está rodando o sistema.
O sistema abre o PDF na máquina aonde está o sistema e os arquivos.
É nesta hora que precisaria proteção.

O preview do relatório:

Código: Selecionar todos

run ( "start arquivo.pdf" )
Com o arquivo aberto, no computador aonde está o aplicativo, toda máquina fica disponível.
Ao liberar aplicativo remoto no servidor, todo servidor fica disponível.

Só porque a visualização tem a opção de salvar...
É até esquisito salvar o que está salvo, mas fizeram isso no visualizador...

Mostrar PDF sem opção de salvar/etc

Enviado: 13 Nov 2014 01:09
por rochinha
Amiguinho,

O problema esta no comando RUN() pois ao executá-lo você abre o aplicativo padrão para manipulação destes arquivos.

O que você deseja?

Ao clicar no PDF já imprimir ou visualizar.

Você pode usar automação OLE a agir diretamente sobre o PDF.OCX do Acrobat e enxertar dentro de uma popup o controle, permitindo o preview, mas não as opções de salvar.

Ilustrando com código:

Código: Selecionar todos

   LOCAL oIE
   Default lPrint := .f.
   Default cEndereco := "c:\temp\arquivo.pdf"
   oIE:=TOleAuto():New( "InternetExplorer.Application" )
   oIE:Visible   := .T.
   oIE:ToolBar   := .F.
   oIE:StatusBar := .F.
   oIE:Top       := 055
   oIE:Left      := 001
   oIE:Height    := 600
   oIE:Width     := 800
   oIE:MenuBar   := .F.
   oIE:Navigate( cEndereco )
   if lPrint
      oIE:ExecWB(6,0,0,0) // Imprimir
   endif
No evento ExecWB(), no primeiro paramêtro, o 6 significa que quero imprimir. Desta forma voce usa o S.O. burlando a interface do PDF reader padrão.

Mostrar PDF sem opção de salvar/etc

Enviado: 13 Nov 2014 10:43
por JoséQuintas
Testei e só precisei alterar esta parte:

Código: Selecionar todos

oIE := win_OleCreateObject( "InternetExplorer.Application" )
É interessante, mas deu praticamente no mesmo.
Na janela final, ao colocar o mouse sobre o relatório abrem opções de salvar/imprimir, e também a opção de mostrar todo o menu, até mesmo a opção de enviar por email (opções do Reader e não do explorer).

A opção "salvar como", apesar de inocente é perigosa, porque o usuário poderia salvar como "clientes.dbf" e destruir o cadastro.
A opção "enviar por email" também é evitada em alguns lugares, porque o funcionário pode levar a lista de tudo.

Uma coisa é usar isso na máquina local, e outra coisa é no servidor por aplicativo remoto.
Tem que lembrar que sempre podem existir filhos e colegas dos filhos de quem usa, que podem querer "testar" suas habilidades em invadir/bagunçar qualquer coisa.

Eu nunca tinha pensado por este lado antes.

Nota: em aplicativo remoto, o aplicativo vai estar usando os recursos do servidor, incluindo abrir o PDF no próprio servidor, e também a pasta de DBFs vai estar liberada, já que o aplicativo precisa disso, mesmo que o PDF seja salvo/aberto em outra pasta.

Mostrar PDF sem opção de salvar/etc

Enviado: 13 Nov 2014 18:44
por rochinha
Amiguinho,

Então vai mais uma dica, esta é um hack.

Ao invés de chamar o arquivo diretamente chame-o indiretamente criando uma proteção.

O javascript permite acesso a recursos que podem ser úteis na apresentação de conteúdos pelos motores de internet.

Um deles é o desabilitar botões e teclas.

O código que desabilita é:

Código: Selecionar todos

<script language=Javascript> 
function botaodireito() 
{ if(event.button==2) { alert( " Botão direito desabilitado! ")}} 
document.onmousedown= botaodireito 
</script> 
Então voce deverá chamar o InternetExplorer.Application mas passando para ele o parâmetro:

Código: Selecionar todos

cEndereco := "imprimir.htm"
...
oIE:Navigate( cEndereco )
O pulo do gato estaria em chamar o .PDF de dentro do .HTM:

Código: Selecionar todos

<script type="text/javascript" language="javascript">
var App = new ActiveXObject( "AcroPDF.PDF.1" );
App.LoadFile('C:\\temp\\TMPe9832hu.pdf');
</script>

Mostrar PDF sem opção de salvar/etc

Enviado: 13 Nov 2014 20:23
por rochinha
Amiguinho,

Faça um teste com este aplicativo.

Executar:

pdf3 arquivo.pdf "JPA - Systems"

Codigo usado:

Código: Selecionar todos

// FiveWin ActiveX support demo - Using Adobe Acrobat Reader
// Alteracao: 13/11/2014
// Jose Carlos da Rocha

#include "FiveWin.ch"

function Main( cPDFFile, cTitle )

   LOCAL oPDFWnd
   LOCAL oPDF
   LOCAL sActivex := ""

   DEFAULT cTitle := "JPA - Report Systems"

   do case

      case IsActivex( "AcroPDF.PDF.1" ); sActivex := "AcroPDF.PDF.1"
      case IsActivex( "PDF.PdfCtrl.1" ); sActivex := "PDF.PdfCtrl.1"
      case IsActivex( "PDF.PdfCtrl.2" ); sActivex := "PDF.PdfCtrl.2"
      case IsActivex( "PDF.PdfCtrl.3" ); sActivex := "PDF.PdfCtrl.3"
      case IsActivex( "PDF.PdfCtrl.4" ); sActivex := "PDF.PdfCtrl.4"
      case IsActivex( "PDF.PdfCtrl.5" ); sActivex := "PDF.PdfCtrl.5"

   endcase

   if empty( sActivex )
      MsgStop( "Acrobat Reader nao instalado." )
   else

      cPDFFile := iif(!cPDFFile=NIL,cPDFFile,cGetFile( "PDF Files (*.pdf)|*.pdf|", "Selecione um arquivo",1) )

      DEFINE WINDOW oPDFWnd TITLE cTitle 
             oPDF := TActiveX():New( oPDFWnd, sActivex )
             oPDF:Do( "LoadFile", cPDFFile )
             oPDF:Do( "SetCurrentPage", 1 )
             oPDF:Do( "SetShowScrollbars", .f. )
             oPDF:Do( "SetShowToolbar", .f. )
             oPDFWnd:oClient := oPDF // To fill the entire window surface
      ACTIVATE WINDOW oPDFWnd MAXIMIZED

      SysRefresh()

   endif

return nil
Para efeito de documentação deixo os links para uso futuro:

API Reference PDF
AcroPDF Manual.pdf