![]() |
Druckt PowerPDF Komponente fehlerhaft?
Liste der Anhänge anzeigen (Anzahl: 4)
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:
Seltsam dabei ist, daß die verschiedenen JPG-Dateien durchaus in die Komponente TPRJpegImage geladen werden, beim Druckversuch ebenso wie beim Zuweisen via ListBox1Click:
// 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;
Delphi-Quellcode:
Bestimmt mache ich irgend etwas grundsätzlich falsch ... wenn ich nur wüßte was ...
procedure TFormMain.ListBox1Click(Sender: TObject);
begin PRJpegImage1.Picture.LoadFromFile(ListBox1.Items[ListBox1.ItemIndex]); PRJpegImage1.Repaint; PRText1.Text := ListBox1.Items[ListBox1.ItemIndex]; PRText1.Repaint; end; Das komplette Testprojekt kann man sich ![]() ![]() |
AW: Druckt PowerPDF Komponente fehlerhaft?
Offenbar hat PowerPDF einen Bug in der Jpg-Kompo, denn wenn ich ein TPRImage statt eines TprJpegImage nehme und damit BMPs lade, wird die PDF-Datei korrekt erzeugt.
|
Lösung gefunden
Nun hab ich endlich eine Lösung gefunden: ich erstelle ein JBild :
TJPegImage, das die JPG-Dateien einliest: JBild.LoadFromFile(ListBox_Bilder.Items[i]); Danach weise ich dem Bitmap des PowerPDF-Image das Bild zu: PRImg.Picture.Bitmap.Assign(JBild); Damit wird die PDF-Datei korrekt erstellt. Hinweis: CrossPost im Usenet: de.comp.lang.delphi.misc |
AW: Druckt PowerPDF Komponente fehlerhaft?
Habe den Fehler in der Komponente (in PdfJpegImage.pas) gefunden, es wird immer ColorSpace DeviceRGB ins PDF geschrieben, auch wenn es ein Graustufen-JPEG ist. Der Reader findet dann natürlich nicht genug Daten. Alle Bilder, die in Deinem Beispiel nicht funktionieren, sind Graustufen-JPEGs.
Delphi-Quellcode:
Gruß, teebee
// CreateImage
function TPdfJpegImage.CreateImage(AImage: TGraphic): TPdfImage; begin // check whether specified graphic is valid image. if not (AImage is TJpegImage) then raise EPdfInvalidValue.Create('only jpeg image is allowed.'); result := TPdfImage.CreateStream(nil); with result do try TJpegImage(AImage).SaveToStream(Stream); with Attributes do begin AddItem('Type', TPdfName.CreateName('XObject')); AddItem('Subtype', TPdfName.CreateName('Image')); // Hier auf Graustufen prüfen If TJpegImage(Aimage).Grayscale Then AddItem('ColorSpace', TPdfName.CreateName('DeviceGray')) Else AddItem('ColorSpace', TPdfName.CreateName('DeviceRGB')); // ursprünglich wird immer RGB geschrieben AddItem('Width', TPdfNumber.CreateNumber(AImage.Width)); AddItem('Height', TPdfNumber.CreateNumber(AImage.Height)); AddItem('BitsPerComponent', TPdfNumber.CreateNumber(8)); PdfArrayByName('Filter').AddItem(TPdfName.CreateName('DCTDecode')); end; except result.Free; raise; end; |
AW: Druckt PowerPDF Komponente fehlerhaft?
Zitat:
Dennoch bedanke ich mich herzlich bei dir für diesen wertvollen Hinweis. Meine PowerPDF-Kopie werde ich sofort demtentsprechend korrigieren ... hab's korrigiert und es funktioniert mit dem direkten Laden von Graustufen-JPGs. |
AW: Druckt PowerPDF Komponente fehlerhaft?
|
AW: Druckt PowerPDF Komponente fehlerhaft?
Zitat:
|
AW: Druckt PowerPDF Komponente fehlerhaft?
Wusste gar nicht, dass es einen neuen Maintainer gibt. Habe die Komponente von
![]() Gruß, teebee |
AW: Druckt PowerPDF Komponente fehlerhaft?
Zitat:
![]() The PowerPDF project is obsolete. I am sorry to say, I am not already Delphi user. If anyone wishes to develop PowerPDF instead of me. Please contact me. |
AW: Druckt PowerPDF Komponente fehlerhaft?
Stimmt, aber dass sich schon jemand gemeldet hat, steht da ja nicht, geschweige denn, wer...:wink:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz