PDA

Ver la Versión Completa : Crear PDFs


cslbcn
16-06-2011, 10:10:32
Hola. He estado buscando por google como crear un PDF en Delphi. Me he bajado el PDF Creator Pilot (http://www.colorpilot.com/pdflibrary.html) y funciona perfectamente.

He creado un PDF con texto, imagenes, etc. Lo malo es que la librería es una demo y en cada PDF creado sale una marca de agua muy molesta... La licencia es muy cara y me preguntaba si conocéis de otras librería gratuitas para poder imprimir documentos en PDF.

Gracias y saludos.

Casimiro Notevi
16-06-2011, 10:57:10
Usa pdfcreator, es libre, y no tendrás esas molestias.

newtron
16-06-2011, 13:51:39
Hola.

Si no me equivoco el pdfcreator es una impresora virtual para generar pdfs pero no lo puedes usar con delphi.

Hace un tiempo yo estuve con este tema y probé unos cuantos componentes para delphi para generar pdfs y ninguno funcionaba correctamente. Al final me decanté por comprar un componente que se llama edocengine que es relativamente barato y bastante completo.

http://www.gnostice.com/eDocEngine_VCL.asp?show=downloads

Si de todas formas quieres probar con algunos componentes gratuitos aquí tienes un par de ellos pero aunque aparentemente funcionan de forma correcta tienen fallos que me hicieron desestimarlos en su momento.

http://www.linares.net/wxpdfcom/
http://www.roledata.com/rolepdf.htm

Saludos

Casimiro Notevi
16-06-2011, 15:19:03
Si no me equivoco el pdfcreator es una impresora virtual para generar pdfs pero no lo puedes usar con delphi.

Sí, tiene opción a llamar a un ejecutable con parámetros para poder crearlos.
Por ejemplo, en este (http://www.clubdelphi.com/foros/showthread.php?p=387823&highlight=pdfcreator#post387823) hilo se habló de ese tema.
Aquí (http://www.clubdelphi.com/foros/showthread.php?p=376009&highlight=pdfcreator#post376009) también se habló bastante sobre eso.
Incluso se puede crear un pdf de un .doc (http://coding.derkeiler.com/Archive/Delphi/borland.public.delphi.thirdpartytools.general/2008-05/msg00007.html) tal y como explican en http://coding.derkeiler.com
.

newtron
16-06-2011, 16:24:05
¡Vaya! ¿y ahora me lo dices? :D:D

Le he estado echando un vistazo a los posts pero me resulta demasiado complicado todo aparte de tener que ir instalando el pdfcreator en las máquinas de los clientes.

El componente que os comento vale 199$ (no es demasiado) y aparte de exportar a pdf puedes hacerlo a un montón de formatos más, word, excel, jpg... etc, pero eso si, tienes que imprimir "a pelo" en el canvas de la impresora, cosa que a mi no me ha venido de grande porque ya lo hago de forma normal para imprimir listados y formularios con nuestro reporteador particular.

Saludos

oesqueda
16-06-2011, 16:26:12
Tengo una pregunta mas bien, que usas para mandar imprimir, algun reporteador o lo mandas directamente a la impresora.

Porque si usas un reporteador:

1. Guarda el nombre de la impresora PDF
2. Cuando vayas a imprimir le indicas al reporteador la impresora PDF
3. Mandas la impresion

Si lo mandas tu:

1. Guarda el nombre de la impresora PDF
2. Cambias la impresora por default
3. Mandas la impresion

para cambiar la impresora por defualt en codigo:

http://www.swissdelphicenter.ch/torry/showcode.php?id=660
http://delphi.about.com/cs/adptips2001/a/bltip1001_5.htm

Si lo que necesitas es tu especificar el nombre esa es otra historia, creo que necesitas ser mas preciso en tu pregunta y darnos mas informacion

Te paso otro url donde vienen componentes para mandar a PDF

http://www.torry.net/pages.php?id=1334

roman
16-06-2011, 16:27:04
Incluso se puede crear un pdf de un .doc (http://coding.derkeiler.com/Archive/Delphi/borland.public.delphi.thirdpartytools.general/2008-05/msg00007.html)

Para comodidad de los lectores, copio y pego aquí el código con indentación y resaltado :):


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ActiveX, ComObj;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
PDFCreator, MSWord: OleVariant;

optUseAutosave, optUseAutoSaveDirectory, optAutosaveFormat,
optPDFColorsColorModel: Integer;
optAutosaveDirectory, optAutosaveFilename: String;

// Security Options
optPDFUseSecurity, optPDFHighEncryption, optPDFOwnerPass: Integer;
optPDFDisallowCopy, optPDFDisallowModifyAnnotations,
optPDFDisallowModifyContents, optPDFDisallowPrinting: Integer;
optPDFAllowAssembly, optPDFAllowDegradedPrinting, optPDFAllowFillIn,
optPDFAllowScreenReaders: Integer;
optPDFOwnerPasswordString: String;

procedure StorePDFOptions;
procedure SetPDFOptions(const filename, ownerpass: String);
procedure RestorePDFOptions;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
output_filename: String = 'D:\tmp\test.pdf';
owner_password: String = 'ownerpass';
var
c, printJobCount: Integer;
optPrintBackground: Boolean;
begin
PDFCreator := CreateOLEObject('PDFCreator.clsPDFCreator');

PDFCreator.cStart('/NoProcessingAtStartup');

StorePDFOptions;
SetPDFOptions(output_filename, owner_password);

MSWord := CreateOleObject('Word.Application');
try
MSWord.DisplayAlerts := 0;

MSword.Documents.Open(Edit1.Text);

MSWord.ActiveDocument.TrackRevisions := false;
optPrintBackground := MSWord.Options.PrintBackground;
if not optPrintBackground then
MSWord.Options.PrintBackground := True;

MSWord.ActiveWindow.View.ShowRevisionsAndComments := False;
MSWord.Options.WarnBeforeSavingPrintingSendingMarkup := false;

printJobCount := PDFCreator.cCountOfPrintJobs;
/// ------------------------------------------
/// Have PDFCreator wait for pages
PDFCreator.cPrinterStop := true;

MSWord.ActiveDocument.PrintoutOld;

/// we don't want to continue on right after telling word to print,
because it can cause problems
while MSWord.BackgroundPrintingStatus <> 0 do
begin
Sleep(10);
Application.ProcessMessages;
end;

/// Tell PDFCreator we're done printing pages.
PDFCreator.cPrinterStop := false;
/// ------------------------------------------

/// now wait for PDFCreator to finish
c := PDFCreator.cCountOfPrintJobs;
while c > printJobCount do
begin
Sleep(10);
Application.ProcessMessages;
c := PDFCreator.cCountOfPrintJobs;
end;

MSword.ActiveDocument.Close(SaveChanges := 0);
finally
VarClear(MSWord);
end;

RestorePDFOptions;
VarClear(PDFCreator);
end;

procedure TForm1.StorePDFOptions;
begin
// save the current options to put back when we're finished.
optUseAutosave := PDFCreator.cOption['UseAutosave'];
optUseAutosaveDirectory := PDFCreator.cOption['UseAutosaveDirectory'];
optAutosaveDirectory := PDFCreator.cOption['AutosaveDirectory'];
optAutosaveFilename := PDFCreator.cOption['AutosaveFilename'];
optAutosaveFormat := PDFCreator.cOption['AutosaveFormat'];
optPDFColorsColorModel := PDFCreator.cOption['PDFColorsColorModel'];

// security options
optPDFUseSecurity := PDFCreator.cOption['PDFUseSecurity'];
optPDFHighEncryption := PDFCreator.cOption['PDFHighEncryption'];
optPDFOwnerPass := PDFCreator.cOption['PDFOwnerPass'];
optPDFOwnerPasswordString :=
PDFCreator.cOption['PDFOwnerPasswordString'];
optPDFDisallowCopy := PDFCreator.cOption['PDFDisallowCopy'];
optPDFDisallowModifyAnnotations :=
PDFCreator.cOption['PDFDisallowModifyAnnotations'];
optPDFDisallowModifyContents :=
PDFCreator.cOption['PDFDisallowModifyContents'];
optPDFDisallowPrinting := PDFCreator.cOption['PDFDisallowPrinting'];
optPDFAllowAssembly := PDFCreator.cOption['PDFAllowAssembly'];
optPDFAllowDegradedPrinting :=
PDFCreator.cOption['PDFAllowDegradedPrinting'];
optPDFAllowFillIn := PDFCreator.cOption['PDFAllowFillIn'];
optPDFAllowScreenReaders := PDFCreator.cOption['PDFAllowScreenReaders'];
end;

procedure TForm1.SetPDFOptions(const filename, ownerpass: String);
begin
// set the options we want, auto-save PDF with specific filename
PDFCreator.cOption('UseAutosave') := 1;
PDFCreator.cOption('UseAutosaveDirectory') := 1;
PDFCreator.cOption('AutosaveDirectory') := ExtractFilePath(filename);
PDFCreator.cOption('AutosaveFilename') := ExtractFileName(filename);
PDFCreator.cOption('AutosaveFormat') := 0; // PDF format
PDFCreator.cOption('PDFColorsColorModel') := 0; // RGB format

if Trim(ownerpass) <> '' then
begin
PDFCreator.cOption('PDFUseSecurity') := 1;
PDFCreator.cOption('PDFHighEncryption') := 1;
PDFCreator.cOption('PDFOwnerPass') := 1;
PDFCreator.cOption('PDFOwnerPasswordString') := ownerpass;
PDFCreator.cOption('PDFDisallowCopy') := 0;
PDFCreator.cOption('PDFDisallowModifyAnnotations') := 1;
PDFCreator.cOption('PDFDisallowModifyContents') := 1;
PDFCreator.cOption('PDFDisallowPrinting') := 0;
PDFCreator.cOption('PDFAllowAssembly') := 0;
PDFCreator.cOption('PDFAllowDegradedPrinting') := 0;
PDFCreator.cOption('PDFAllowFillIn') := 0;
PDFCreator.cOption('PDFAllowScreenReaders') := 0;
end;

PDFCreator.cSaveOptions;
end;

procedure TForm1.RestorePDFOptions;
begin
// reset user's options
PDFCreator.cOption('UseAutosave') := optUseAutosave;
PDFCreator.cOption('UseAutosaveDirectory') := optUseAutosaveDirectory;
PDFCreator.cOption('AutosaveDirectory') := optAutosaveDirectory;
PDFCreator.cOption('AutosaveFilename') := optAutosaveFilename;
PDFCreator.cOption('AutosaveFormat') := optAutosaveFormat;
PDFCreator.cOption('PDFColorsColorModel') := optPDFColorsColorModel;

// security options
PDFCreator.cOption('PDFUseSecurity') := optPDFUseSecurity;
PDFCreator.cOption('PDFHighEncryption') := optPDFHighEncryption;
PDFCreator.cOption('PDFOwnerPass') := optPDFOwnerPass;
PDFCreator.cOption('PDFOwnerPasswordString') :=
optPDFOwnerPasswordString;
PDFCreator.cOption('PDFDisallowCopy') := optPDFDisallowCopy;
PDFCreator.cOption('PDFDisallowModifyAnnotations') :=
optPDFDisallowModifyAnnotations;
PDFCreator.cOption('PDFDisallowModifyContents') :=
optPDFDisallowModifyContents;
PDFCreator.cOption('PDFDisallowPrinting') := optPDFDisallowPrinting;
PDFCreator.cOption('PDFAllowAssembly') := optPDFAllowAssembly;
PDFCreator.cOption('PDFAllowDegradedPrinting') :=
optPDFAllowDegradedPrinting;
PDFCreator.cOption('PDFAllowFillIn') := optPDFAllowFillIn;
PDFCreator.cOption('PDFAllowScreenReaders') := optPDFAllowScreenReaders;

PDFCreator.cSaveOptions;

Sleep(100);
end;

end.

Cowky
24-06-2011, 19:31:11
mas sencillo, bajate una impresora virtual,

y la podes usas desde cualquier programa.

pd: yo uso la Bullzip PDF Printer