AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Druckt PowerPDF Komponente fehlerhaft?

Ein Thema von Perlsau · begonnen am 26. Mär 2012 · letzter Beitrag vom 1. Apr 2012
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Perlsau
Perlsau
Online

Registriert seit: 12. Mai 2009
Ort: Karlsruhe
1.411 Beiträge
 
Delphi 2009 Professional
 
#1

Druckt PowerPDF Komponente fehlerhaft?

  Alt 26. Mär 2012, 09:16
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
Miniaturansicht angehängter Grafiken
testprogramm.jpg  
Angehängte Dateien
Dateityp: pdf TestPDF AlleGleich.pdf (60,7 KB, 17x aufgerufen)
Dateityp: pdf TestPDF.pdf (1,33 MB, 14x aufgerufen)
Dateityp: zip PowerPDFTest.zip (4,24 MB, 3x aufgerufen)

Geändert von TBx (30. Mär 2012 um 10:07 Uhr) Grund: Testprojekt angehängt
  Mit Zitat antworten Zitat
Benutzerbild von Perlsau
Perlsau
Online

Registriert seit: 12. Mai 2009
Ort: Karlsruhe
1.411 Beiträge
 
Delphi 2009 Professional
 
#2

AW: Druckt PowerPDF Komponente fehlerhaft?

  Alt 29. Mär 2012, 23:50
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.
  Mit Zitat antworten Zitat
Benutzerbild von Perlsau
Perlsau
Online

Registriert seit: 12. Mai 2009
Ort: Karlsruhe
1.411 Beiträge
 
Delphi 2009 Professional
 
#3

Lösung gefunden

  Alt 30. Mär 2012, 10:31
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
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
445 Beiträge
 
Delphi 6 Professional
 
#4

AW: Druckt PowerPDF Komponente fehlerhaft?

  Alt 30. Mär 2012, 11:56
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:
// 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;
Gruß, teebee
  Mit Zitat antworten Zitat
Benutzerbild von Perlsau
Perlsau
Online

Registriert seit: 12. Mai 2009
Ort: Karlsruhe
1.411 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Druckt PowerPDF Komponente fehlerhaft?

  Alt 30. Mär 2012, 12:08
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.
Okay, das leuchtet mir sofort ein. Weil ich aber sowieso verschiedene Bildformate als Quelle ermöglichen will, werde ich bei meiner Lösung ohne PdfJpegImage bleiben und dafür sorgen, daß in die PowerPDF-Bitmap-Komponente eben immer nur Bitmaps geladen werden. Der Anwender soll ja auch BMPs, PCXs, TIFs und weitere Formate als Quelle für seine PDF-Datei auswählen können.

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.

Geändert von Perlsau (30. Mär 2012 um 12:14 Uhr)
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
4.821 Beiträge
 
Delphi XE Starter
 
#6

AW: Druckt PowerPDF Komponente fehlerhaft?

  Alt 30. Mär 2012, 12:42
.. kan auch einer den Entwickler in Kenntnis setzen ...

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Perlsau
Perlsau
Online

Registriert seit: 12. Mai 2009
Ort: Karlsruhe
1.411 Beiträge
 
Delphi 2009 Professional
 
#7

AW: Druckt PowerPDF Komponente fehlerhaft?

  Alt 30. Mär 2012, 12:50
.. kan auch einer den Entwickler in Kenntnis setzen ...
Ist erledigt, habe eben dem Roman Kassebaum eine entsprechende Message via Sourceforge-Messenger zukommen lassen.
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
445 Beiträge
 
Delphi 6 Professional
 
#8

AW: Druckt PowerPDF Komponente fehlerhaft?

  Alt 30. Mär 2012, 13:08
Wusste gar nicht, dass es einen neuen Maintainer gibt. Habe die Komponente von dort. Na ja, allzuviel hat sich bisher noch nicht geändert.

Gruß,
teebee
  Mit Zitat antworten Zitat
Benutzerbild von Perlsau
Perlsau
Online

Registriert seit: 12. Mai 2009
Ort: Karlsruhe
1.411 Beiträge
 
Delphi 2009 Professional
 
#9

AW: Druckt PowerPDF Komponente fehlerhaft?

  Alt 30. Mär 2012, 13:17
Wusste gar nicht, dass es einen neuen Maintainer gibt. Habe die Komponente von dort. Na ja, allzuviel hat sich bisher noch nicht geändert.
Dort steht aber auch ganz deutlich:

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.
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
445 Beiträge
 
Delphi 6 Professional
 
#10

AW: Druckt PowerPDF Komponente fehlerhaft?

  Alt 30. Mär 2012, 13:22
Stimmt, aber dass sich schon jemand gemeldet hat, steht da ja nicht, geschweige denn, wer...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2014 by Daniel R. Wolf