Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Convertir archivos de imagen BMP al formato de documento PDF (https://www.clubdelphi.com/foros/showthread.php?t=88863)

shoulder 15-08-2015 15:25:15

Convertir archivos de imagen BMP al formato de documento PDF
 
Hola estoy intentando fuera del pdfcreator convertir un bmp a pdf por el codigo que encontre en esta pagina bmp2pdf.pas


http://homepage3.nifty.com/e-papy/bmp2pdf_delphi.htm

pero no encuentro como asociar un archivo dentro del programa, alguien tiene un ejemplo?.

Gracias.

ecfisa 15-08-2015 21:59:32

Hola shoulder.
Cita:

Empezado por shoulder (Mensaje 495551)
Hola estoy intentando fuera del pdfcreator convertir un bmp a pdf por el codigo que encontre en esta pagina bmp2pdf.pas


http://homepage3.nifty.com/e-papy/bmp2pdf_delphi.htm

pero no encuentro como asociar un archivo dentro del programa, alguien tiene un ejemplo?.

No sé si te refieres a algo así:
Código Delphi [-]
...
implementation

uses bmp2pdf;

procedure TForm1.ButtonSaveClick(Sender: TObject);
var
  sd: TSaveDialog;
begin
  sd             := SaveDialog1;
  sd.Filter      := 'Adobe Reader file|*.PDF';
  sd.DefaultExt  := 'PDF';
  sd.FilterIndex := 1;
  if sd.Execute then
    BMPtoPDF(Image1.Picture.Bitmap, sd.FileName);
end;
...

Saludos :)

dec 15-08-2015 22:15:29

Hola,

Aparte de lo dicho por Daniel, otra posible solución sería usar Synopse PDF engine, un conjunto de unidades para Delphi que permite crear documentos y/o reportes PDF. Para "convertir" un archivo Bitmap a un archivo PDF podría escribirse algo similar a esto:

Código Delphi [-]
{...}

uses
  // SynopsePDF
  mORMotReport;

procedure Bitmap2Pdf(const BitmapPath, OutputPDFPath: string);
var
  BMP: TBitmap;
  PDF: TGDIPages;
begin
  BMP := TBitmap.Create();
  PDF := TGDIPages.Create(nil);
  try
    PDF.BeginDoc();
    BMP.LoadFromFile(BitmapPath);
    PDF.DrawBMP(BMP, 0, BMP.Width div 3);
    PDF.EndDoc();
    PDF.ExportPDF(OutputPDFPath, False, True);
  finally
    BMP.Free();
    PDF.Free();
  end;
end;

{...}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Bitmap2Pdf('sample.bmp', 'sample.pdf');
end;

shoulder 18-08-2015 05:10:11

pdf
 
Gracias funciona perfecto y rapidisimo.

shoulder 18-08-2015 15:25:44

bmp2pdf
 
Hola como dije anteriormente el bmp2pdf funciona perfecto, pero un problema los pdf me los hace todos por arriba de 3 megas aunque los bmp sean de 1 MB, en vez con el pdfcreator me los hace a 200K. Hay un forma dentro del bmp2pdf.pas de tocar la resolucion?. Porque es mucho mas rapido que los demas pero esto no me lo permite usar con 50 hojas me voy a mas de 100 MB.
Gracias,

dec 18-08-2015 16:26:59

Hola,

Si te decides por usar Synopse PDF engine, tal vez puedas convertir los archivos BMP a otro formato como JPG, puesto que este último permite establecer el nivel de compresión de los archivos. Echa un vistazo a este hilo de los foros de Synopse.

shoulder 18-08-2015 16:40:32

bmp2pdf
 
Gracias primero por responderme el tema es que me agranda el PDF porque me lo hace al 145% en vez el Pdfcreator puedo comprimirlo, veo en synopse me comprime el Jpeg (por lo que entiendo) y estoy usando BMP me lo hace por defecto el programa que scanea, hay forma que pueda comprimir en el PDF?.
Gracias

shoulder 18-08-2015 21:38:08

bmp
 
Hola dec, estoy probando tu codigo me comprime pero me corta la pagina , me hace 2 paginas en el PDF la primera en blanco y la segunda se ve por la mitad. Lo estoy copiando tal cual como lo pusiste. Probe con autosize pero tampoco.
Gracias.

dec 18-08-2015 22:51:58

Hola,

Si no me equivoco he leído que Synopse PDF comprime los archivos BMP al incorporarlos al PDF. Pero, dado que estas imágenes suelen ser pesadas, tal vez podrías convertirlas a JPG para lograr archivos PDF de menor tamaño. Si puedes acceder a los archivos BMP, entonces puedes convertirlos a JPG, antes de añadirlos al archivo PDF.

Respecto de que una imagen te ocupe dos páginas seguramente sea por el tamaño de la imagen. No tengo muy claro cómo se maneja el tamaño de las imágenes, creo que es "aproximado" o "porcentual", de modo que prueba a dividir el mismo al añadir las imágenes al PDF, o sea, en lugar de esto:

Código Delphi [-]
PDF.DrawBMP(BMP, 0, BMP.Width div 3);

Prueba con algo como esto:

Código Delphi [-]
PDF.DrawBMP(BMP, 0, BMP.Width div 4);

shoulder 19-08-2015 01:21:02

pdf
 
Gracias quedo bien asi!!, lo hice div 5 sino me separaba de hoja y autosize..

Código Delphi [-]

procedure Bitmap2Pdf(const BitmapPath, OutputPDFPath: string);
var
  BMP: TBitmap;
  PDF: TGDIPages;
begin
  BMP := TBitmap.Create();
  PDF := TGDIPages.Create(nil);
  try
    PDF.BeginDoc();
    BMP.LoadFromFile(BitmapPath);
    PDF.DrawBMP(BMP, 0, BMP.Width div 5);
    Pdf.AutoSize := True;
    PDF.ExportPDFForceJPEGCompression := 80;
    PDF.EndDoc();
    PDF.ExportPDF(OutputPDFPath,False, False);
  finally
    BMP.Free();
    PDF.Free();
  end;
end;

shoulder 19-08-2015 20:25:13

Pdf
 
Hola sigo sin encontrar solucion pensa que lo habia arreglado pero con el synopse hay veces que la hoja se hace en dos aunque arregle los parametrps como marque en el mensaje de arriba y el que me envio ecfisa si bien funciona muy bien no comprime. Ya no se que probar.
Gracias.

MAXIUM 19-08-2015 21:19:55

¿Y si conviertes el BMP a JPG previamente? Quizás sea una chapusada, ya que el convertor a PDF debiera manejar la compresión, pero si te vale...

También puedes usar un auxiliar para pasar los JPG a PDF por línea de comando sin tener que instalar un impresora virtual http://sourceforge.net/projects/jpeg2pdf

shoulder 19-08-2015 21:56:17

Pdf
 
Lo probe Maxium, habia hecho el programa que haga todo por impresora virtual con PDFCreator, pero ponen 30 hojas en el scanner, el ciclo es graba BMP o Jpeg y a continuacion los pdf, pero SINO meto un showmessage entre medio hay veces que no me graba un archivo PDF, es como que el programa va mas rapido que la grabacion en windows, de ahi me vino todo el error probe con la funcion sleep pero tampoco funciona.

Código Delphi [-]
Image.SaveToFile('test-1.bmp');

quickreport1.print;

Antes en la registry escribo el nombre del archivo en el pdfcreator que seria el mismo del BMP Tes-1, test-2...

MAXIUM 19-08-2015 23:18:32

Claro comprendo. Como son dos programas a parte, no hay coordinación entre ellos.

Me refiero a tu proyecto original, donde en algunos casos, se creaban los archivos bmp o jpg después de haberlos enviado a imprimir y ahí fallaba todo. Por eso usabas sleep.

El problema con esto de usar sleep, es que toma un tiempo indeterminado en el que se crean los archivos. Lo mejor sería usar un código que espere o asegure que el proceso haya sido finalizado antes de mandarlos a la impresora virtual. Ese código lo puedes buscar dentro del foro.

Hay muchas alternativas, pero no se que tanto te urge, en el sentido de resolver pronto el problema por X motivo o darte el tiempo de estudiar las librerías como la anterior o sinapsys hasta encontrar lo que necesitas e integrar todo a tu programa sin dependencias.

No tengo mucha experiencia en esto, por eso estoy teorizando. Así que perdón por esto.

Solo por curiosidad, ¿esos BMP los necesitas como archivos, los cargas previamente o pueden ser creados solo en memoria? ¿Los PDF constan de varias hojas o es una por cada BMP?

dec 20-08-2015 01:27:32

Hola,

Una posibilidad es pedir ayuda en los foros de Synopse: me consta que el autor responde a las preguntas y consultas de sus usuarios.

shoulder 20-08-2015 04:59:34

pdf
 
Primero gracias a todos, el programa mediante la herramienta Twain scannea de a 20 hojas y muestra en una lista de imagenes los scaneos y mediante un boton graba el bmp y hace los 20 PDFs. Como explique con Pdfcreator cambio el nombre del archivo en la la registry grabo el bmp e imprimo en impresora virtual, pero en algunos momentos se desincronisa, sino escribo un showmessage en el medio. La rutina que me dio ecfisa funciona pero no comprime y hace pdfs muy grande y la de dec funciona pero no me hace el autosize vienen hojas A4 o A5 me hace hojas en blanco dentro del PDF o con el div 4... me hace muy chica la imagen. Te hare caso Dec voy a escribir al foro de synapsis veamos que me responden. Por ahora estan trabajando con los sleep y un showmessage entre la grabacion del write de la registry del nombre del archivo y cuando graba el bmp, y un sleep (1000) cuando imprime virtual el pdf, pero les molesta dar 20 enters y si das los enters muy rapido se desincronisa-

shoulder 20-08-2015 20:58:45

Pdf
 
Hola comparto la solucion. Gracias.


Código Delphi [-]
uses  SynPdf
.....

Procedure..
Var

    vpdf : TPdfDocumentGDI;
    pagemeta : TMetafile;
    p : integer;
....

vpdf := TPdfDocumentGDI.Create(true, 1252,false);
vpdf.CompressionMethod := cmNone;



   QuickReport1:=TQuickReport1.Create(self);


   Quickreport1.QRImage1.Picture.LoadFromFile('c:\carpeta\hola.bmp');
 
   QuickReport1.prepare;
   Quickreport1.QRImage1.Repaint;
   for p := 1 to QuickReport1.QRPrinter.PageCount do
   begin
      vpdf.AddPage;
      pagemeta := quickreport1.QRPrinter.GetPage(p);
      vpdf.VCLCanvas.Draw(0,0,pagemeta);
    end;
    vpdf.ForceJPEGCompression := 96;
    vpdf.SaveToFile('c:\carpeta\hola.pdf');
    vpdf.free;
   QuickReport1.Free;
   QuickReport1 := nil;


La franja horaria es GMT +2. Ahora son las 04:44:59.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi