Jump to content
Fivewin Brasil

Gravar e Restaurar arquivo PDF, em uma Tabela MYSQL


marcioe

Recommended Posts

Olá amigo,s boa tarde,

Tenho um sistema de imobiliaria, onde preciso armazenar os documentos em PDF na base de dados, e depois recuperar.

Perguntas

1) Qual o Tipo de campo mais Indicado para gravar o PDF
2) Qual comando(s) se usa para gravar 
3) Como recuperar o arquivo e Salvar o PDF para ser lido pelo Acrobat(por exemplo)
4) Tem alguma forma de visualizar, tipo o que fazemos com a Foto para mostrar o PDF

Agradeço aos amigos

Link to comment
Share on other sites

Exemplo de salvamento em campo .DBF:

...
arquivo->campotxt := SalvaPDF( "c:\temp\arquivo.pdf" )
...

Recuperando:

...
Run( RecuperaPDF( arquivo->campotxt, "c:\temp\temp87643.pdf" ) )
...

No seu caso voce poderá usar um campo Texto ou VarChar que não tenha limite tão pequeno
quanto o do .DBF ou poderá usar um campo BLOB.

As referidas funções não fazem nada mais do que pegar o conteúdo de um arquivo de forma
binária e salvá-la como texto.

Lembra de quando armazenavamos as telas de nossos aplicativos Clipper/DOS com
savescreen/restscreen é a mesma técnica. 
 

Link to comment
Share on other sites

Amiguinhos,

Em primeiro lugar, para você colocar um preview de PDF em um controle seria necessário usar uma PDF.OCX compatível e livre. Minha idéia seria você converter o PDF para JPEG ou BMP e apresentá-lo no controle de imagem e um clique permitiria apresentar o preview no Acrobat ou PDF Reader.

Eu ainda acho que ao invés de usar Acrobat(que precisa de instalação) ou PDF Reader(pois precisa de instalação) você possa subir um preview usando o ACBrDanfe.exe

Tentei anexar arquivos e imagens mas alguma coisa aconteceu que não aconteceu o anexamento.

Segue a pasta onde possa ser baixado o [url=http://www.lotapps.com/download/]LPCLI[/url] que é o convertedor de arquivos. Não sei se o LPCLI.RAR ou LPCLI.ZIP faz de PDF para JPG pois um deles faz de PDF para PPTX 

Link to comment
Share on other sites

Cria um campo mediumblob, que armazena até 16mb se não me engano, e salve conforme o @rochinha já orientou. 

Quanto ao preview, faria como o rochinha falou, gerava um jpg da primeira página do pdf, dependendo o tamanho faria um resize pra ficar menorzinho, e salvaria no banco da mesma forma que o PDF, então seria 2 campos no BD.

Link to comment
Share on other sites

 

Amiguinhos,

marcioe

Use as seguinte funções:

 


static function SalvaPDF( _PDF_ )
   RETURN str2hex( memoread( _PDF_ ) )
	static function RecuperaPDF( _campo_, _PDF_ )
   RETURN memowrit( _PDF_, hex2str( _campo_ ) )

 

Olá rochinha, Bom Dia,

Estas funções serve também para salvar arquivo BMP ?

é que tenho uma rotina que qdo o usuário fecha o caixa, o sistema salva a dialog.. oDlg::saveToBmp( cArqTela ); ai gostaria de ao invés de salvar em arquivo bmp, salva direto no arquivo DBF...

Seria possivel com esta funções ou teria alguma outra?

Obgdão!!! 

Link to comment
Share on other sites

bom dia 
Seguinte, O PDF está sendo gravado de boa no banco de dados, fato que se usar a ferramenta case (tipo mysqfront, heidsql) consigo recuperar

Para gravar está assim 

 

*-------------------------------------------------------------------------------
* Inserir o arquivo PDF
*-------------------------------------------------------------------------------
STATIC FUNCTION INSERE_PDF_IMOVEL(v_Codigo_Imovel,v_Caminho,v_Apelido)
	*----------------------------------------------------------------------------
	IF EMPTY(ALLTRIM(v_Apelido))
		v_Apelido	 := SUBSTR('Pdf '+ alltrim(str( nRandom(9999)   ,06,0)) + ' ' + time(),01,030)
	ENDIF
	IF v_Codigo_Imovel = 0
		MsgStop('Escolha Um Imóvel para Colocar Fotos !',SISTEMA)
		RETURN .T.
	ENDIF
	IF FSize(v_Caminho) > 0
	   AGUARDE_PROCESSANDO( 'Aguarde, Gravando PDF...' )	
	   BEGIN TRANSACTION
			cQuery_Mtabela  := 						"INSERT INTO pdf_imovel ( "
			cQuery_Mtabela	 := cQuery_Mtabela + " CODIGO_IMOVEL 	"
			cQuery_Mtabela	 := cQuery_Mtabela + ",DESCRICAO			"
			cQuery_Mtabela	 := cQuery_Mtabela + ",DATA_PDF			"
			cQuery_Mtabela	 := cQuery_Mtabela + ",PDF				"					
			cQuery_Mtabela	 := cQuery_Mtabela +	" ) VALUES ( "
			cQuery_Mtabela	 := cQuery_Mtabela +	TRANSFORMA_SQL(T_CODI_IMOVEL,"N",06,0) 			+ ","
			cQuery_Mtabela	 := cQuery_Mtabela + TRANSFORMA_SQL(v_Apelido,"T",35,0) 					+ ","
			cQuery_Mtabela	 := cQuery_Mtabela + TRANSFORMA_SQL(DATE(),"D",08,0) 						+ ","
			cQuery_Mtabela	 := cQuery_Mtabela + ANY2SQL( MemoRead( (v_Caminho) ) ) 
			cQuery_Mtabela	 := cQuery_Mtabela + " )"
			COMITAR_DADOS_SQL(cQuery_Mtabela)
		END TRANSACTION
		HB_GCAll(.T.)
		odlgwait:End()
		T_CAMINHO_ARQUIVO_PDF		:= SPACE(250)
		T_DESCRICAO_ARQUIVO_PDF		:= SPACE(50)
	ELSE
		MsgStop('Arquivo PDF Não é Válido !',SISTEMA)
	ENDIF	
	*----------------------------------------------------------------------------
	oT_CAMINHO_ARQUIVO_PDF		: Refresh()		
	oT_DESCRICAO_ARQUIVO_PDF	: Refresh()		
	IF SELECT("browse_pdf_imovel") != 0                                              
		browse_pdf_imovel->(DbCloseArea())
	ENDIF	
	cQuery:=" SELECT * FROM pdf_imovel  WHERE CODIGO_IMOVEL  = "+ TRANSFORMA_SQL(v_Codigo_Imovel,'N',06,0)  + ' ORDER BY ID_PDF DESC  '
 	use sql cQuery alias "browse_pdf_imovel" new via 'MYSQL'
	browse_pdf_imovel->( DbGoTop())
	oDB_PDF_IMOVEL	: GoTop()
	oDB_PDF_IMOVEL	: Refresh()		
RETURN .T.                                                           


Agora para Recuperar não está dando certo
 

*-------------------------------------------------------------------------------
*
*-------------------------------------------------------------------------------
STATIC FUNCTION EXIBIR_PDF_IMOVEL(v_Id_Pdf_Imovel,v_Codigo_Imovel) 
	Cursor('SQL')
	IF v_Id_Pdf_Imovel != 0
		IF SELECT("pdf_imovel") != 0
			pdf_imovel->(DbCloseArea())
		ENDIF		
		cQuery:='select * from pdf_imovel where ID_PDF = ' +  TRANSFORMA_SQL(v_Id_Pdf_Imovel,"N",07,0)  + ' ORDER BY ID_PDF DESC LIMIT 1 '
		use sql cQuery alias "pdf_imovel" new via 'MYSQL'
		pdf_imovel->( DbGoTop())
		IF len(ALLTRIM(pdf_imovel->PDF)) != 0
			IF pdf_imovel->ID_PDF != 0
			
					*nH 						:= fCreate("TMP_IMG.JPG")
					nH 						:= "C:\LIXO\TMP_IMG.PDF")
					fWrite(nH,cFile)
					fClose(nH)
					MemoWrit( nH, ANY2SQL(ALLTRIM(pdf_imovel->PDF)) )
				
			ENDIF
		ENDIF
		IF SELECT("pdf_imovel") != 0
			pdf_imovel->(DbCloseArea())
		ENDIF		
	ENDIF
	CursorArrow()	
RETURN .T.                                                           

Agradeço a todos novamente
 

Link to comment
Share on other sites

Amiguinhos,

 

Theotokos

Olá rochinha, Bom Dia,

Estas funções serve também para salvar arquivo BMP ?

Pode usar para qualquer coisa, pois você irá transformá-las em um conteúdo HEXA e salvar.

marcioe

cQuery_Mtabela	 := cQuery_Mtabela + ANY2SQL( MemoRead( (v_Caminho) ) )

Você deu um memoread direto. Veja que no exemplo que coloquei eu transformo antes.

Link to comment
Share on other sites

Boa tarde

Sugiro a você criar uma tabela a parte para registro dos arquivos, pois com o passar do tempo os Select´s com este campo irão ficar lentos.

No meu caso tinha uma tabela clientes, criei outra tabela com código do cliente e arquivo.

E sempre que preciso executar uma consulta uso select ... where codcli=xxx

Att

João Bosco

 

Link to comment
Share on other sites

 

Boa tarde

Sugiro a você criar uma tabela a parte para registro dos arquivos, pois com o passar do tempo os Select´s com este campo irão ficar lentos.

No meu caso tinha uma tabela clientes, criei outra tabela com código do cliente e arquivo.

E sempre que preciso executar uma consulta uso select ... where codcli=xxx

Att

João Bosco

 

Obrigado pela dica amigo, mas já está assim uma tabela separada para Fotos, e uma tabela separada para PDF

veja o trecho   

INSERT INTO pdf_imovel ( 
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...