Einzelnen Beitrag anzeigen

squetk

Registriert seit: 29. Aug 2004
Ort: Cottbus
118 Beiträge
 
Delphi XE2 Professional
 
#15

AW: PDF Creator innerhalb Delphi nutzen

  Alt 1. Jul 2010, 18:39
Folgender im Netz gefundener Sourcecode als Beispiel für eine späte Bindung funktioniert:
Delphi-Quellcode:
unit uPDFCreator;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    ButtonExecute : TButton;
    procedure ButtonExecuteClick(Sender: TObject);
  private
    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

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ButtonExecuteClick(Sender: TObject);
const
   output_filename: String = 'D:\test.pdf';
   owner_password: String = '';
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;

   PDFCreator.cClose;

   VarClear(PDFCreator);

end;

procedure TForm1.RestorePDFOptions;
begin
   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;

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.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;

end.
Ich hätte aber gern die frühe Bindung eingesetzt (wie z.B. im PDFCreator COM Sample für C# gezeigt), leider funktioniert dieses nicht, wenn ich es in Delphi umsetze. Der Vorteil wäre, dass man dann auf Ereignisse wie OnError und OnReady reagieren könnte.

Eins noch: Der o.a. Quellcode funktionierte bei mir erst dann, als ich den PDFCreator-Druckertreiber auf Direktdruck gestellt habe. Kenn jemand eine Möglichkeit, dies vom Programmcode aus einzustellen?
  Mit Zitat antworten Zitat