[ERLEDIGT] fcl-pdf (fpPDF) --> TChart nach PDF exportieren

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
Zvoni
Beiträge: 700
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

[ERLEDIGT] fcl-pdf (fpPDF) --> TChart nach PDF exportieren

Beitrag von Zvoni »

Hallo zusammen,

Lazarus=4.3 64bit-Windows
FPC = 3.2.3 - 64Bit Windows

Target = Windows64

Ich habe ein TChart, welches ich nach PDF exportieren soll

Habe wie folgt

Code: Alles auswählen

function ExportChartToPDF(AChart: TChart; AFileName: String): Boolean;
var
  Bitmap: TJpegImage;
  PDFDoc: TPDFDocument;
  Section: TPDFSection;
  Page: TPDFPage;
  ImgIndex: Integer;
  b:boolean;
  m:TMemoryStream;
begin
  Result:=True;
  b:=True;
  Bitmap := TJpegImage.Create;
  try
    Bitmap.SetSize(AChart.Width, AChart.Height);  //Grösse anpassen
    AChart.PaintTo(Bitmap.Canvas, 0, 0);  //Zeichne das Chart ins JPEG
    m:=TMemoryStream.Create;
    Bitmap.SaveToStream(m);  //Wirf das Bitmap in einen Stream
    m.Position:=0;

    PDFDoc := TPDFDocument.Create(nil);
    try
      PDFDoc.StartDocument;
      Section := PDFDoc.Sections.AddSection;
      Page := TPDFPage.Create(PDFDoc);
      Page.Orientation:=ppoLandscape;
      Section.AddPage(Page);

      ImgIndex := PDFDoc.Images.AddJPEGStream(m, Bitmap.Width, Bitmap.Height);

      Page.DrawImage(10, 10, AChart.Width, AChart.Height, ImgIndex);
      ShowMessage('Sections-Count='+PDFDoc.Sections.Count.ToString);
      ShowMEssage('Page-Count='+PDFDoc.Sections[0].PageCount.ToString);
      // 5. Save the PDF file
      PDFDoc.SaveToFile(AFileName);
    Except
      On E:Exception Do b:=False;
    end;
  finally
    m.Free;
    PDFDoc.Free;
    Bitmap.Free;
  end;
  Result:=Result And b;
end;          
Die zwei ShowMessages zeigen korrekt jeweils 1 an (Section und Pages)
Beim SaveTofile knallts mit EListError Invalid Page Index (=0)

Kenn mich mit PDF und dem ganzen Kram überhaupt nicht aus.
Wo sitzt der Fehler?
Zuletzt geändert von Zvoni am Mi 24. Jun 2026, 09:47, insgesamt 1-mal geändert.
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
Zvoni
Beiträge: 700
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: fcl-pdf (fpPDF) --> TChart nach PDF exportieren

Beitrag von Zvoni »

OK. Zumindest der Teil mit der Exception ist erledigt.

Vielen Dank an Nummer8 für den Beitrag hier:
viewtopic.php?t=17780

Hab die Erzeugung der Page geändert, und dann gings.
Jetzt gehts nur noch darum, wieso er die Orientation nicht akzeptiert, plus die Skalierung runter auf DIN A4 quer
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
Zvoni
Beiträge: 700
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: fcl-pdf (fpPDF) --> TChart nach PDF exportieren

Beitrag von Zvoni »

OK, Orientation ist erledigt, aber das PDF ist "leer" also keine "Grafik" des Charts.

Scheint was mit dem Stream zu sein
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

paweld
Beiträge: 111
Registriert: So 11. Jun 2023, 16:01
OS, Lazarus, FPC: Lazarus trunk, FPC fixes

Re: fcl-pdf (fpPDF) --> TChart nach PDF exportieren

Beitrag von paweld »

Ein vollständiges Beispiel (basierend auf dem Tachart Basic-Demo) finden Sie im Anhang

Code: Alles auswählen

function TForm1.ExportChartToPDF(AChart: TChart; AFileName: String): Boolean;
var
  jpg: TJpegImage;
  pdf: TPDFDocument;
  pdfs: TPDFSection;
  pdfp: TPDFPage;
  idx, m, w, h, px, py: Integer;
  scale: Double;
  ms: TMemoryStream;
begin
  Result := False;
  jpg := TJpegImage.Create;
  ms := TMemoryStream.Create;
  pdf := TPDFDocument.Create(nil);
  try
    jpg.SetSize(AChart.Width, AChart.Height);
    AChart.PaintTo(jpg.Canvas, 0, 0);
    jpg.SaveToStream(ms);
    ms.Position := 0;
    pdf.StartDocument;
    pdfs := pdf.Sections.AddSection;
    pdfp := pdf.Pages.AddPage;
    pdfp.Orientation := ppoLandscape;
    pdfp.UnitOfMeasure := uomPixels;
    pdfp.PaperType := ptA4;
    pdfs.AddPage(pdfp);

    idx := pdf.Images.AddJPEGStream(ms, jpg.Width, jpg.Height);

    //10 mm Rand in px
    m := trunc(mmToPDF(10));
    //Verkleinere das Bild auf der Seite, falls nötig
    scale := jpg.Width / (pdfp.Paper.W - 2 * m);
    if (jpg.Height / (pdfp.Paper.H - 2 * m)) > scale then
      scale := jpg.Height / (pdfp.Paper.H - 2 * m);
    if scale < 1 then
      scale := 1;
    w := trunc(jpg.Width / scale);
    h := trunc(jpg.Height / scale);
    //auf der Seite zentrieren
    px := (pdfp.Paper.W - w) div 2;
    py := (pdfp.Paper.H - h) div 2;

    pdfp.DrawImage(px, py, w, h, idx);
    pdf.SaveToFile(AFileName);
    Result := True;
  except
    on E: Exception do
      raise Exception.Create(E.Message);
  end;
  pdf.Free;
  ms.Free;
  jpg.Free;
end;  
Dateianhänge
basicdemo.zip
(6.92 KiB) 8-mal heruntergeladen
Grüße / Pozdrawiam
paweld

Benutzeravatar
Zvoni
Beiträge: 700
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: fcl-pdf (fpPDF) --> TChart nach PDF exportieren

Beitrag von Zvoni »

Pawel,

vielen, vielen Dank!!
Funktioniert perfekt!!
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7347
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: [ERLEDIGT] fcl-pdf (fpPDF) --> TChart nach PDF exportieren

Beitrag von af0815 »

Das Beispiel von Pawel ist super und kann als Vorlage dienen für alles was man als Image exportieren kann.

Danke für das Beispiel.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 5459
Registriert: Fr 8. Apr 2011, 09:01

Re: [ERLEDIGT] fcl-pdf (fpPDF) --> TChart nach PDF exportieren

Beitrag von wp_xyz »

paweld, wenn du nichts dagegen hast, würde ich deinen Code gerne in das Beispiel-Projekt "save" von TAChart aufnehmen.

paweld
Beiträge: 111
Registriert: So 11. Jun 2023, 16:01
OS, Lazarus, FPC: Lazarus trunk, FPC fixes

Re: [ERLEDIGT] fcl-pdf (fpPDF) --> TChart nach PDF exportieren

Beitrag von paweld »

@wp Natürlich habe ich nichts dagegen. Eigentlich sollte ich diese Frage stellen, da ich deinen Code verwendet habe, um dieses Beispiel zu erstellen :-)
Grüße / Pozdrawiam
paweld

wp_xyz
Beiträge: 5459
Registriert: Fr 8. Apr 2011, 09:01

Re: [ERLEDIGT] fcl-pdf (fpPDF) --> TChart nach PDF exportieren

Beitrag von wp_xyz »

OK, ist mit in der Tüte.

Antworten