Hallo,
ich befasse mich seit einigen Tagen mit verschiedenen Möglichkeiten, aus Delphi heraus PDF-Dateien zu erzeugen, ohne einen PDF-Drucker einzusetzen. Dabei bin ich auf die Komponente PowerPDF gestoßen, die mir für mein Vorhaben passend schien.
In meinem Testprogramm verwende ich eine ListBox zum Sammeln einiger JPG-Dateien, mit denen die PDF-Datei erzeugt werden soll (siehe Bild im Anhang). In einer Scrollbox rechts im Formular befindet sich eine TPRPage, darauf ein PRLayoutPanel und auf diesem wiederum ein TPRJpegImage und unten (nicht sichtbar) ein TPRText. Wenn ich nun zum PDF-Drucken meine Listbox-Items durchgehe und einmal das dort angegebene JPG in die TPRJpegImage-Komponente lade, des weiteren den String aus der Listbox in die Komponente TPRText, entsteht ein PDF mit der richtigen Seitenanzahl, aber mit immer demselben ersten JPG-Bild. Der Text unten wiederum enthält den gewünschten String. Steht das Property
SharedImage der Komponente
TPRJpegImage auf
FALSE, bleiben die Seiten im PDF außer der ersten ganz leer ...
Meine PDF-Druck-Methode sieht so aus:
Delphi-Quellcode:
// PDF erstellen
procedure TFormMain.Button2Click(Sender: TObject);
VAR
i : Integer;
begin
IF ListBox1.Count = 0
THEN EXIT;
PReport1.BeginDoc;
FOR i := 0
TO ListBox1.Count -1
DO
BEGIN
PRJpegImage1.Picture.LoadFromFile(ListBox1.Items[i]);
// JPG einlesen
PRJpegImage1.Repaint;
// auffrischen
PRText1.Text := ListBox1.Items[i];
// String einlesen
PRText1.Repaint;
// auffrischen
PReport1.Print(PRPage1);
// Seite in Report erstellen
END;
PReport1.EndDoc;
IF Dialogs.MessageDlg('
Erzeugte PDF-Datei mit Adobe Reader anschauen?',
mtConfirmation, [mbYes, mbNo], 0, mbYes) = mrYes
THEN
ShellExecute(
Handle,
nil, PWideChar(PReport1.FileName),
nil,
nil, SW_SHOW);
end;
Seltsam dabei ist, daß die verschiedenen JPG-Dateien durchaus in die Komponente
TPRJpegImage geladen werden, beim Druckversuch ebenso wie beim Zuweisen via ListBox1Click:
Delphi-Quellcode:
procedure TFormMain.ListBox1Click(Sender: TObject);
begin
PRJpegImage1.Picture.LoadFromFile(ListBox1.Items[ListBox1.ItemIndex]);
PRJpegImage1.Repaint;
PRText1.Text := ListBox1.Items[ListBox1.ItemIndex];
PRText1.Repaint;
end;
Bestimmt mache ich irgend etwas grundsätzlich falsch ... wenn ich nur wüßte was ...
Das komplette Testprojekt kann man sich
runterladen:
http://www.delphiman.de/Test/PowerPDFTest.zip