Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi PDF zur Laufzeit erstellen mit PowerPDF (https://www.delphipraxis.net/191825-pdf-zur-laufzeit-erstellen-mit-powerpdf.html)

Hobbycoder 23. Feb 2017 13:09

PDF zur Laufzeit erstellen mit PowerPDF
 
Ich möchte gerne verschiedene Images als mehrseitiges PDF-Dokument mit PowerPDF speichern, bekomme aber immer nur eine leere Seite ins PDF:

Hier mal mein Code bisher:
Delphi-Quellcode:
procedure TPdfExport.Execute;
var
  Pr: TPReport;
  PPage: TPRPage;
  PLayoutPanel: TPRLayoutPanel;
  PJpegImage: TPRJpegImage;
  bmp: TBitmap;
  jpg: TJPEGImage;
  I: Integer;
begin
  Pr:=TPReport.Create(nil);
  try
    Pr.FileName:=Fofile;
    Pr.BeginDoc;
    for I := 0 to FPictureList.count-1 do
    begin
      bmp:=TBitmap.Create;
      jpg:=TJPEGImage.Create;
      bmp.loadfromfile(FPictureList[i].filename);
      jpg.Assign(bmp);
      PPage:=TPRPage.Create(nil);
      PPage.Width:=1680;
      PPage.Height:=2376;
      PLayoutPanel:=TPRLayoutPanel.Create(PPage);
      PLayoutPanel.Left:=0;
      PLayoutPanel.Top:=0;
      PLayoutPanel.Width:=PPage.Width;
      PLayoutPanel.Height:=PPage.Height;
      PJpegImage:=TPRJpegImage.Create(PLayoutPanel);
      PJpegImage.Left:=0;
      PJpegImage.Top:=0;
      PJpegImage.Width:=PLayoutPanel.Width;
      PJpegImage.Height:=PLayoutPanel.Height;
      PJpegImage.Stretch:=True;
      PJpegImage.Picture.Bitmap.Assign(jpg);
      pr.Print(PPage);
      PJpegImage.Free;
      PLayoutPanel.Free;
      PPage.Free;
      jpg.Free;
      bmp.Free;
    end;
    Pr.EndDoc;
  finally
    Pr.Free;
    sffConv.Free;
  end;
end;
Sieht ein bischen wirr aus, aber es geht mir grundsätzlich erstmal darum, dass irgendwie funktioniert. Schön machen kann ich dann immer noch.
Wie gesagt, das ausgegebene PDF hat eine leere Seite ohne Inhalt. Das BMP und JPG-Object enthält das Bild korrekt, das habe ich vorher geprüft. Ich habe das auch schon mit TPRImage probiert, das gleiche Ergebnis. Das läßt mich vermuten, dass ich vielleicht irgendwas nicht richtig zuordne. Ist das mit meine Create's so korrekt?

Gruß Hobbycoder

Bjoerk 23. Feb 2017 17:09

AW: PDF zur Laufzeit erstellen mit PowerPDF
 
Wenn ich dir was raten darf? Nimm SynPdf.

Fritzew 23. Feb 2017 17:22

AW: PDF zur Laufzeit erstellen mit PowerPDF
 
Zitat:

Zitat von Bjoerk (Beitrag 1362454)
Wenn ich dir was raten darf? Nimm SynPdf.

Und damit es einfacher ist:

https://github.com/synopse/SynPDF

madas 23. Feb 2017 21:01

AW: PDF zur Laufzeit erstellen mit PowerPDF
 
Zitat:

Zitat von Hobbycoder (Beitrag 1362421)
Ich möchte gerne verschiedene Images als mehrseitiges PDF-Dokument mit PowerPDF speichern, bekomme aber immer nur eine leere Seite ins PDF:

Hier mal mein Code bisher:
Delphi-Quellcode:
procedure TPdfExport.Execute;
var
  Pr: TPReport;
  PPage: TPRPage;
  PLayoutPanel: TPRLayoutPanel;
  PJpegImage: TPRJpegImage;
  bmp: TBitmap;
  jpg: TJPEGImage;
  I: Integer;
begin
  Pr:=TPReport.Create(nil);
  try
    Pr.FileName:=Fofile;
    Pr.BeginDoc;
    for I := 0 to FPictureList.count-1 do
    begin
      bmp:=TBitmap.Create;
      jpg:=TJPEGImage.Create;
      bmp.loadfromfile(FPictureList[i].filename);
      jpg.Assign(bmp);
      PPage:=TPRPage.Create(nil);
      PPage.Width:=1680;
      PPage.Height:=2376;
      PLayoutPanel:=TPRLayoutPanel.Create(PPage);
      PLayoutPanel.Left:=0;
      PLayoutPanel.Top:=0;
      PLayoutPanel.Width:=PPage.Width;
      PLayoutPanel.Height:=PPage.Height;
      PJpegImage:=TPRJpegImage.Create(PLayoutPanel);
      PJpegImage.Left:=0;
      PJpegImage.Top:=0;
      PJpegImage.Width:=PLayoutPanel.Width;
      PJpegImage.Height:=PLayoutPanel.Height;
      PJpegImage.Stretch:=True;
      PJpegImage.Picture.Bitmap.Assign(jpg);
      pr.Print(PPage);
      PJpegImage.Free;
      PLayoutPanel.Free;
      PPage.Free;
      jpg.Free;
      bmp.Free;
    end;
    Pr.EndDoc;
  finally
    Pr.Free;
    sffConv.Free;
  end;
end;
Sieht ein bischen wirr aus, aber es geht mir grundsätzlich erstmal darum, dass irgendwie funktioniert. Schön machen kann ich dann immer noch.
Wie gesagt, das ausgegebene PDF hat eine leere Seite ohne Inhalt. Das BMP und JPG-Object enthält das Bild korrekt, das habe ich vorher geprüft. Ich habe das auch schon mit TPRImage probiert, das gleiche Ergebnis. Das läßt mich vermuten, dass ich vielleicht irgendwas nicht richtig zuordne. Ist das mit meine Create's so korrekt?

Gruß Hobbycoder

Vielleicht das ganze Free-Gedöns mal nach dem EndDoc ansiedeln. Ist aber nur ein Schuss ins Blaue.

madas

Hobbycoder 24. Feb 2017 06:59

AW: PDF zur Laufzeit erstellen mit PowerPDF
 
Hab jetzt mal Synpdf genommen. :thumb: Very nice :-D
Allerdings, finde ich, mangelt es an Dokumentation, die ich auf die schnelle nicht gefunden habe. Einzig die verstreuten Code-Schnipsel in den verschiedenen Foren haben in erstaunlich kurzer Zeit ans Ziel gebracht und mir eine passiges PDF-Dokument erzeugt ;-)

Gruß Hebbycoder

Fritzew 24. Feb 2017 08:15

AW: PDF zur Laufzeit erstellen mit PowerPDF
 
Zitat:

Zitat von Hobbycoder (Beitrag 1362492)
Hab jetzt mal Synpdf genommen. :thumb: Very nice :-D
Allerdings, finde ich, mangelt es an Dokumentation, die ich auf die schnelle nicht gefunden habe. Einzig die verstreuten Code-Schnipsel in den verschiedenen Foren haben in erstaunlich kurzer Zeit ans Ziel gebracht und mir eine passiges PDF-Dokument erzeugt ;-)

Gruß Hebbycoder

https://synopse.info/fossil/wiki?name=PDF+Engine

hier der link zur Dokumentation

Raible 24. Feb 2017 16:27

AW: PDF zur Laufzeit erstellen mit PowerPDF
 
ich verwende zwar PowerPDF nicht, aber prüfe mal das Koordinatensystem. Möglicherweise befindet sich der Nullpunkt unten. In diesem Fall sollte statt PJpegImage.Top:=0; PJpegImage.Top:=Height; funktionieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz