Page 1 of 2
PDF en Tabla Mysql
Posted: Mon Oct 09, 2023 1:37 am
by JoseAlvarez
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/view ... 39#p236935
Alli, el colega Leandro posteó un código muy sencillo
Code: Select all | Expand
//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?
Re: PDF en Tabla Mysql
Posted: Mon Oct 09, 2023 1:33 pm
by leandro
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.
Re: PDF en Tabla Mysql
Posted: Mon Oct 09, 2023 2:05 pm
by JoseAlvarez
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:
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
Re: PDF en Tabla Mysql
Posted: Mon Oct 09, 2023 2:57 pm
by leandro
No creo que tengas problemas con _ 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.
Re: PDF en Tabla Mysql
Posted: Mon Oct 09, 2023 3:58 pm
by Armando
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
Re: PDF en Tabla Mysql
Posted: Mon Oct 09, 2023 5:08 pm
by JoseAlvarez
leandro wrote:No creo que tengas problemas con _ 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.
Re: PDF en Tabla Mysql
Posted: Mon Oct 09, 2023 5:15 pm
by JoseAlvarez
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 !
Re: PDF en Tabla Mysql
Posted: Mon Oct 09, 2023 5:34 pm
by JoseAlvarez
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.
Re: PDF en Tabla Mysql
Posted: Mon Oct 09, 2023 5:38 pm
by Armando
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
"ODC_PDF LONGBLOB NULL COMMENT 'Imagen PDF de la orden de compra'," +;
Como se guarda el PDF
Code: Select all | Expand
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
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
Re: PDF en Tabla Mysql
Posted: Mon Oct 09, 2023 5:48 pm
by leandro
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
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.
Re: PDF en Tabla Mysql
Posted: Mon Oct 09, 2023 6:26 pm
by JoseAlvarez
Listo amigos.
Muchas Gracias a Ambos.
Voy a ponerme en marcha con eso y les estare comentado.
Un abrazo ! que esten muy bien.
Re: PDF en Tabla Mysql
Posted: Mon Oct 09, 2023 9:34 pm
by Jimmy
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/view ... =3&t=42301
Re: PDF en Tabla Mysql
Posted: Mon Oct 09, 2023 9:43 pm
by JoseAlvarez
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.
Re: PDF en Tabla Mysql
Posted: Tue Oct 10, 2023 2:36 pm
by cmsoft
Hola Jose:
Para encriptar y desencriptar en base 64 puede usar las funciones de hb_jsonDecode y hb_jsonEncode
Re: PDF en Tabla Mysql
Posted: Tue Oct 10, 2023 5:02 pm
by JoseAlvarez
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!!