![]() |
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:
|
AW: Druckt PowerPDF Komponente fehlerhaft?
Zitat:
|
AW: Druckt PowerPDF Komponente fehlerhaft?
Hallo zusammen,
vor einiger musste ich ein bestehendes großer Projekt von D2007 nach D2009 (Unicode) konvertieren. Dieses Projekt nutzt PowerPDF. Also habe ich Takeshi Kanno angeschrieben, mit der Bitte, das Projekt weiterführen zu dürfen. Da der sich nicht gemeldet hat, habe ich das Projekt unter SourceForge gehostet. Unter DXE2 habe ich am Freitag noch ein großes Problem bemerkt: Der ursprüngliche Entwickler nutzt with-Anweisungen für ein TRect. Seit DXE2 hat ein TRect auch die Eigenschaft Height, was zu Konflikten mit der Height der Komponenten führt. Ehrlich gesagt, möchte ich niemanden empfehlen, PowerPDF in neuen Projekten einzusetzen. Ich habe jedenfalls keine Pläne, PowerPDF für andere Plattformen anzubieten. -- Roman Kassebaum |
AW: Druckt PowerPDF Komponente fehlerhaft?
Zitat:
Zitat:
Zitat:
|
AW: Druckt PowerPDF Komponente fehlerhaft?
Aus gutem Grunde mag ich die with-Anweisung bis heute nicht. Einmal mehr eine Bestätigung, dem Bauchgefühl zu vertrauen.
Der eine findet den einen, der andere den anderen Fehler. Die Quelltexte sind also vorhanden. Was hindert demnach noch wen daran, die Komponente zu korrigieren, einzusetzen und ggf. moderat (!) weiterzuentwickeln? |
AW: Druckt PowerPDF Komponente fehlerhaft?
Übernächste Woche habe ich Zeit und kann PowerPDF auf SourceForge aktualisieren.
Falls jemand bei PowerPDF mitmachen möchte, dann kann ich ihn zu dem Projekt hinzufügen. In den neuen kommerziellen Projekten nutze ich zur Zeit den PDF-Export des FastReports. -- Roman |
AW: Druckt PowerPDF Komponente fehlerhaft?
Zitat:
Die Engine an sich finde ich sehr gut, aber der PDF-Export ist unterirdisch |
AW: Druckt PowerPDF Komponente fehlerhaft?
@Sir Rufo
zugegeben sehr hübsch ist der Export nicht, für meine Zwecke hat es meist gereicht. Bei den Projekten, bei denen der Kunde mehr Wert auf die Optik legt verwenden Kollegen Fastreport im Zusammenspiel mit ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:15 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