PDF en Tabla Mysql

PDF en Tabla Mysql

Postby JoseAlvarez » Mon Oct 09, 2023 1:37 am

Hola Amigos.

Bucando en el foro la manera de como guardar un archivo PDF dentro de una tabla MySql, consegui este hilo

https://forums.fivetechsupport.com/viewtopic.php?f=6&t=39735&p=236935&hilit=guardar+pdf+mysql&sid=f391667a92ebeaa0fbfd2a4434e7e439&sid=f391667a92ebeaa0fbfd2a4434e7e439#p236935

Alli, el colega Leandro posteó un código muy sencillo

Code: Select all  Expand view
//Convertimos el PDF a cadena de Texto

fMimeEnc( rutaPDF, rutaTXT )
cText := MemoRead( rutaTXT )
cText := STRTRAN(cText,CRLF,'')


//Convertimos el TXT a PDF

FMimeDec(rutaTXT ,rutaPDF)


Funciona muy bien, convierte el archivo PDF a texto y lo recupera perfectamente.

Mi necesidad es la siguiente: necesito emitir un recibo de pago (en formato PDF) cada vez que un cliente realiza un pago completo o parcial a una factura. El usuario quiere que ese recibo se envíe de manera digital via correo electrónico a la persona que paga. En eso no hay problema. Pero quiero guardar esos recibos en una tabla mysql. Con estas funciones de Leandro, se ve que puedo hacerlo. Ahora Bien...

Siempre han comentado en muchos foros que no es recomendable guardar ese tipo de archivos en tablas. Sugieren guardarlos en una carpeta o subirlos a un servidor desde donde luego se puedan recuperar, y guardar en una tabla solo la dirección del archivo.

Yo por gusto personal preferiría guardarlo en una tabla. Mi inquietud es:

Hay problemas de dañar la base de datos con este tipo de archivos? daño físico de la tabla, lentitud, consumo excesivo de recursos? en fin, que inconveniente grave se podría presentar por manejarlo de esta manera? o simplemente no pasa nada?

Alguien tiene experiencia con esto?
"Los errores en programación, siempre están entre la silla y el teclado..."

Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin

Carora, Estado Lara, Venezuela.
User avatar
JoseAlvarez
 
Posts: 795
Joined: Sun Nov 09, 2014 5:01 pm

Re: PDF en Tabla Mysql

Postby leandro » Mon Oct 09, 2023 1:33 pm

José buenos días como estas?

Pues tambien hemos leído los POST que recomiendan el no registro de los documentos, ni imágenes en las bases de datos. Pero hay casos en los que es necesario, por ejemplo cuando necesitas mostrar las fotos de los artículos, o las fotos de los empleados, o como en tu caso consultar un documento pdf. Creo que eso depende de la necesidad que tengas que suplir.

Técnicamente al inicio agregábamos el campo MEDIUMTEXT para el registro del documento en la tabla en donde se realiza el registro de la información, en algunas ocasiones era un problema ya que hacia que la consulta tardara demasiado, sobre todo en un ambiente remoto. Por recomendación de nuestro amigo Cristóbal, me dijo que creara una tabla aparte en donde almacenáramos el documento y únicamente hacer el llamado en caso que se necesario y de a uno por vez. Con esta manera logramos acelerar la consulta de los documentos.

De momento esto es lo que se nos a presentado. Espero sea de ayuda a tu consulta.
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: PDF en Tabla Mysql

Postby JoseAlvarez » Mon Oct 09, 2023 2:05 pm

Hola Leandro, como estas?

Ok, gracias por la informacion.
Justamente asi tengo pensado hacerlo, una tabla solamente para guardar ese pdf. que por demás es simple, acá te dejo una muestra:

Image

Todos los registros llevarían esa misma información y formato.

La pregunta es:

¿tienes tiempo trabajando con esto? ¿no has tenido problemas? mi temor es que algún caracter especial de control en la conversión/guardado/lectura me dañe la base de datos y allí se me arme el jaleo, ya que llevaria dos imagenes, el logo de la empresa y el sello digital, ambos en formato JPG
"Los errores en programación, siempre están entre la silla y el teclado..."

Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin

Carora, Estado Lara, Venezuela.
User avatar
JoseAlvarez
 
Posts: 795
Joined: Sun Nov 09, 2014 5:01 pm

Re: PDF en Tabla Mysql

Postby leandro » Mon Oct 09, 2023 2:57 pm

No creo que tengas problemas con los caracteres especiales siempre y cuando guardes y recuperes el documento de la base de datos encriptado en base64. Y como te mencione anteriormente guardar el archivo en una tabla independiente acelera el proceso. Lo único que posiblemente podrías tener problema es en un documento muy grande y que la velocidad del internet no sea buena, pero tendría que ser muy lento el internet para que tengas problemas.
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: PDF en Tabla Mysql

Postby Armando » Mon Oct 09, 2023 3:58 pm

José y amigos:

Mi experiencia es muy similar a la de Leandro, en principio guardaba yo los PDFs y ZIPs en un campo de su
correspondiente tabla para cuando fuera necesario mostrar el PDF o ZIP.

El problema era la lentitud al abrir la tabla directamente proporcional a la cantidad de PDFs y ZIPs guardados.

La solución fue crear una tabla para guardar los PDFs y ZIP y abrirla solo cuando fuera necesario.

Otro tema es el máximo de memoria para paquetes que MySql te permite.

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
Armando
 
Posts: 3228
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: PDF en Tabla Mysql

Postby JoseAlvarez » Mon Oct 09, 2023 5:08 pm

leandro wrote:No creo que tengas problemas con los caracteres especiales siempre y cuando guardes y recuperes el documento de la base de datos encriptado en base64. Y como te mencione anteriormente guardar el archivo en una tabla independiente acelera el proceso. Lo único que posiblemente podrías tener problema es en un documento muy grande y que la velocidad del internet no sea buena, pero tendría que ser muy lento el internet para que tengas problemas.


ok, y donde consigo informacion de como encriptar a base64 ? he buscado en internet pero solo muestran como hacerlo con PHP.
"Los errores en programación, siempre están entre la silla y el teclado..."

Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin

Carora, Estado Lara, Venezuela.
User avatar
JoseAlvarez
 
Posts: 795
Joined: Sun Nov 09, 2014 5:01 pm

Re: PDF en Tabla Mysql

Postby JoseAlvarez » Mon Oct 09, 2023 5:15 pm

Armando wrote:José y amigos:

Mi experiencia es muy similar a la de Leandro, en principio guardaba yo los PDFs y ZIPs en un campo de su
correspondiente tabla para cuando fuera necesario mostrar el PDF o ZIP.

El problema era la lentitud al abrir la tabla directamente proporcional a la cantidad de PDFs y ZIPs guardados.

La solución fue crear una tabla para guardar los PDFs y ZIP y abrirla solo cuando fuera necesario.

Otro tema es el máximo de memoria para paquetes que MySql te permite.

Saludos


Hola Armando,

la cantidad de PDF ira en aumento cada dia segun los pagos que vayan haciendo los clientes. Y no creo que se puedan ir borrando para desahogar la tabla.
en cuanto al maximo de memoria, me toca investigar.

Gracias !
"Los errores en programación, siempre están entre la silla y el teclado..."

Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin

Carora, Estado Lara, Venezuela.
User avatar
JoseAlvarez
 
Posts: 795
Joined: Sun Nov 09, 2014 5:01 pm

Re: PDF en Tabla Mysql

Postby JoseAlvarez » Mon Oct 09, 2023 5:34 pm

Una nueva interrogante,

si se guarda en otro formato? por ejemplo JPG.

es igual? o menos problemático?

Me serviría de cualquiera de las dos maneras.
"Los errores en programación, siempre están entre la silla y el teclado..."

Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin

Carora, Estado Lara, Venezuela.
User avatar
JoseAlvarez
 
Posts: 795
Joined: Sun Nov 09, 2014 5:01 pm

Re: PDF en Tabla Mysql

Postby Armando » Mon Oct 09, 2023 5:38 pm

José:

Te muestro como lo hago yo y no he tenido problemas
Primero la estructura de la tabla, en especial el campo donde se guarda el PDF
Code: Select all  Expand view

"ODC_PDF LONGBLOB NULL COMMENT 'Imagen PDF de la orden de compra'," +;
 


Como se guarda el PDF
Code: Select all  Expand view

        cPdfFile := StrToHex(MemoRead(oOdc:FIL))

        cCmdSql := "INSERT INTO " +;
                            "OdcCat " +;
                        "SET " +;
                            "ODC_SER = '" + oRsHdr:Fields("HDR_SER"):Value + "'," +;
                            "ODC_COT = " + STR(oRsHdr:Fields("HDR_COT"):Value,07,0) + "," +;
                            "ODC_SEC = " + STR(nUltSec,02,0) + "," +;
                            "ODC_ODC = '" + oOdc:ODC + "'," +;
                            "ODC_FDE = '" + DTOS(oOdc:FDE) + "'," +;
                            "ODC_PDF = '" + cPdfFile + "'," +;
                            "ODC_IOC = " + STR(oOdc:IOC,11,2)
 


Y finalmente como lo extraigo para mostrar el PDF

Code: Select all  Expand view

    IF oRsOdc:Fields("ODC_PDF"):Value != NIL
        cFile := oApp:cPathPdfs + "\1A" + SUBSTR(TIME(),1,2) + SUBSTR(TIME(),4,2) + SUBSTR(TIME(),7,2) + ".Pdf"

        IF File(cFile)
           Ferase(cFile)
        ENDIF

        //Se graba un archivo temporal en disco
        oHandle := FCreate(cFile)
        FWrite(oHandle, HexToStr(oRsOdc:Fields("ODC_PDF"):Value))
        FClose(oHandle)

        IF FSize(cFile) > 0
                ShellExecute(0,"Open",cFile,,,1)
        ENDIF
    ENDIF
 


Espero que te sea de ayuda, Cualquier duda me pegas un grito

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
Armando
 
Posts: 3228
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: PDF en Tabla Mysql

Postby leandro » Mon Oct 09, 2023 5:48 pm

No tienes que guardarlo en ningún formato, recuperas el texto encriptado en base64 y lo guardas en el campo de la base de datos. Si quieres guardar el nombre del archivo en otro campo para cuando necesites descargarlo seria bueno.

Code: Select all  Expand view

fMimeEnc( rutaPDF, rutaTXT ) //<- esta función se encarga de crear el texto encriptado en base64 para que lo puedas guardar en la base de datos. fMimeDec() <- para desencriptar ó cVar := hb_base64decode( hb_memoread( cFileName ) )
cText := MemoRead( rutaTXT )
cText := STRTRAN(cText,CRLF,'') //<- en contenido de la variable cText es el que tienes que registrar en la base de datos
memoedit(cText ) //Si quieres ver el archivo antes de guardarlo memoedit(), solo para que sepas como se ve la info.

 
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: PDF en Tabla Mysql

Postby JoseAlvarez » Mon Oct 09, 2023 6:26 pm

Listo amigos.

Muchas Gracias a Ambos.

Voy a ponerme en marcha con eso y les estare comentado.

Un abrazo ! que esten muy bien.
"Los errores en programación, siempre están entre la silla y el teclado..."

Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin

Carora, Estado Lara, Venezuela.
User avatar
JoseAlvarez
 
Posts: 795
Joined: Sun Nov 09, 2014 5:01 pm

Re: PDF en Tabla Mysql

Postby Jimmy » Mon Oct 09, 2023 9:34 pm

hi,

i don´t think that SIZE of Database itself is a Problem
but to "load" Data from Database can be a Problem e.g. when XBROWSE

i do make "thumbnails" from PDF / Image as Preview which i store into Database and a Link to "Original"

i use MuTool, which is Part of MuPDF, to make "Thumbs" of PDF
https://github.com/ArtifexSoftware/mupdf

have a look in this Thread for Thumbs for PDF
https://fivetechsupport.com/forums/viewtopic.php?f=3&t=42301
greeting,
Jimmy
User avatar
Jimmy
 
Posts: 1732
Joined: Thu Sep 05, 2019 5:32 am
Location: Hamburg, Germany

Re: PDF en Tabla Mysql

Postby JoseAlvarez » Mon Oct 09, 2023 9:43 pm

Hi jimmy.

Thanks for your comment.

I don't need thumbs nor browse. Just save the receipt and restore to show it into a dialog. One each time. Not for lot.

I think is ok like leandro and armando.

In any case, your information is very interesting. thank you.
"Los errores en programación, siempre están entre la silla y el teclado..."

Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin

Carora, Estado Lara, Venezuela.
User avatar
JoseAlvarez
 
Posts: 795
Joined: Sun Nov 09, 2014 5:01 pm

Re: PDF en Tabla Mysql

Postby cmsoft » Tue Oct 10, 2023 2:36 pm

Hola Jose:
Para encriptar y desencriptar en base 64 puede usar las funciones de hb_jsonDecode y hb_jsonEncode
User avatar
cmsoft
 
Posts: 1290
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: PDF en Tabla Mysql

Postby JoseAlvarez » Tue Oct 10, 2023 5:02 pm

cmsoft wrote:Hola Jose:
Para encriptar y desencriptar en base 64 puede usar las funciones de hb_jsonDecode y hb_jsonEncode


Hola cesar, como estas?

Ok, perfecto. Les daré una mirada tambien.

Gracias!!
"Los errores en programación, siempre están entre la silla y el teclado..."

Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin

Carora, Estado Lara, Venezuela.
User avatar
JoseAlvarez
 
Posts: 795
Joined: Sun Nov 09, 2014 5:01 pm

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 82 guests