LazReport PDF-Export Einzelseiten

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
ErnstVolker
Beiträge: 354
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

LazReport PDF-Export Einzelseiten

Beitrag von ErnstVolker »

Hallo,

ich habe einen gruppierten Bericht erstellt. Diesen kann ich auch als PDF exportieren. Dieses PDF hat dann mehrere Seiten. Nämlich soviel Seiten wie der Bericht Gruppenkopfzeilen.

Wie bekommt man es hin, dass jede Seite für sich eine PDF-Datei gibt?

UND: Es kann passieren, dass der Inhalt des Masterbandes so viel wird, dass eine weitere Seite her muß. Dann gehören diese beiden Seiten natürlich zusammen und sollten nicht getrennt werden.

Wie stellt man das sinnvollerweise an? Muß das fertige PDF nochmal geladen (mit PowerPDF o.ä.) und zerpflückt werden?

Gute Nacht!

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1652
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: LazReport PDF-Export Einzelseiten

Beitrag von fliegermichl »

Der PDF Exportfilter hat ja die virtuellen Methoden OnBeginpage und OnEndpage. Ich könnte mir vorstellen, daß man hier den Inhalt in ein weiteres PDF Dokument schreiben und separat speichern kann. Getestet habe ich es aber nicht.

ErnstVolker
Beiträge: 354
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: LazReport PDF-Export Einzelseiten

Beitrag von ErnstVolker »

Hallo fliegermichel,

zunächst erstmal vielen Dank für den Hinweis. Ich bin erst gestern dazu gekommen mal wieder ein wenig herum zu probieren.

Leider bekomme ich es noch nicht hin. Ich habe allerdings auch mit den Ereignissen des Report experimentiert. Hier gibt es auch "OnBeginPage" etc.

Nachdem das hier

Code: Alles auswählen

frReport1.LoadFromFile('report1.lrf');
aufgerufen und
frReport1.PrepareReport;
ausgeführt wurden, müsste doch der fertige Bericht in "frReport1" enthalten sein. Mit allen seinen Seitenzahlen etc.

Jetzt fällt mir gerade ein: Ich muß mal NACH ".PrepareReport" versuchen auf ".Pages[0].Count" zuzugreifen die Seitenzahlen zu bekommen. Bei meinem Test sollten es 16 sein.

Dann in einer Schleife jede einzelne Seite an den Exportfilter übergeben...

Ich versuche weiter...

Vielen Dank!

Soner
Beiträge: 737
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: LazReport PDF-Export Einzelseiten

Beitrag von Soner »

Das ist sehr einfach.
In meinem Programm wird beim Kundenwechsel optional mit einer neuen Seite angefangen.
Ich verwende dafür TfrReport.OnBeginBand-Ereignis so z.B.(Pseudocode);

Code: Alles auswählen

procedure TForm1.OnBeginBand(Band: TfrBand);
begin
   if not BeiKundenWechselNeuerSeite then 
     exit;
   if Query1.FieldByName('Kundennr').AsInteger<>AktuellerKunde and AktuellerKunde<>0 then 
     Band.ForceNewPage:=true;  //Neue Seite;

   AktuellerKunde:=Query1.FieldByName('Kundennr').AsInteger;      
end;

Soner
Beiträge: 737
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: LazReport PDF-Export Einzelseiten

Beitrag von Soner »

Noch etwas, wenn du nicht mit Bänder arbeitest sondern alles manuell positionierst, damit ist sehr komplexe Berichte möglich, was normalerweise mit Bänder nicht möglich ist, dann kannst du diese funktionen verwenden:

Code: Alles auswählen

   TfrReport.Pages.Add;  //Seitehinzufügen
    TfrReport.Pages[integer]; //Seitendirektzugreifen
Schau immer im Lazreport-Quelltext. LazReport ist sehr mächtig, das Ding verkannt.

Viel Glück.

ErnstVolker
Beiträge: 354
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: LazReport PDF-Export Einzelseiten

Beitrag von ErnstVolker »

Hallo, vielen Dank für die Tipps. Werde ich mich morgen mal dran versuchen.

Ich habe den Bericht komplett mit Bändern erstellt und im Designer beim Gruppenband "Neue Seite erzwingen". Beim Masterband muß ich das noch einbauen, für den Fall dass es mal mehr Daten werden.
Meine Überlegung war beim Masterband die Bandhöhe zu überwachen und wenn eine bestimmte Höhe überschritten wird, dann neue Seite...

Werde die Tage weiter probieren.

Schönen Abend!

ErnstVolker
Beiträge: 354
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

[gelöst] Re: LazReport PDF-Export Einzelseiten

Beitrag von ErnstVolker »

Hallo,

zu meinem "Problem" habe ich selbst zwar was rausgefunden, aber es stellt mich noch nicht wirklich zufrieden. Mein Bericht arbeitet mit Bändern und ist komplett im Designer erstellt. Vorschau zeigt ihn an.

Was die Einzelseiten angeht, kann man natürlich über eine For-Schleife mit:

Code: Alles auswählen

frReport1.PrintPreparedReport(IntToStr(Schleifenindex), 1)
Einzelseiten ausgeben. Vorher über Printers einen PDF-Drucker ansprechen. Printers.Filename muss mit in die Schleife.

Ein weiterer Weg ist das frReport "BeginPage" und "EndPage" zu nutzen:

Code: Alles auswählen

procedure TZeosDatenModul.frReport1EndPage(pgNo: Integer);
begin
  ZeosDatenModul.frReport1.EMFPages.Delete(0);
end;

procedure TZeosDatenModul.frReport1BeginPage(pgNo: Integer);
begin
  ZeosDatenModul.frReport1.ExportTo(TfrTNPDFExportFilter, '/Ort/zum/Speichern/Name_' + IntToStr(i) + '.pdf');
  inc(i);
end;
"i" ist hier einfach mal eine zu Testzwecken angelegte globale Variable.

Das funktioniert, aber jede Pdf-Datei enthält eine zusätzliche Leerseite, die man, sofern sie stört, nachträglich noch entfernen muss.

Joh
Lazarusforum e. V.
Beiträge: 292
Registriert: Sa 26. Mai 2012, 17:31
OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
CPU-Target: 64Bit

Re: LazReport PDF-Export Einzelseiten

Beitrag von Joh »

ja, aber...

du hast i...

i wird incrementiert. Zählst du jetzt von 0 oder von eins?

was ist Schleifenindex? Geht der von 0 oder 1?

Ich denke, da liegt irgendwo das Problem...
just my two Beer

ErnstVolker
Beiträge: 354
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: LazReport PDF-Export Einzelseiten

Beitrag von ErnstVolker »

Hallo Joh,

alles gut.

Das "i" als globale Variable diente nur zum Erzeugen eines Dateinamen. Völlig egal ob der mit "0", "1" oder "234" losgeht. Ich brauchte einfach nur was um die Einzelseiten voneinander unterscheiden zu können. "Name_1", "Name_2" usw.

Ich dachte der Exportfilter wäre von sich aus so cool, dass er die Möglichkeit bietet entweder alles in ein Pdf oder Einzelseiten auszugeben. Macht er aber nicht. Zumindest bin ich nicht drauf gekommen.

ErnstVolker
Beiträge: 354
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: LazReport PDF-Export Einzelseiten

Beitrag von ErnstVolker »

Guten Abend,

zum Thema Einzelseiten aus PDF-extrahieren ist mir nochwas über den Weg gelaufen. Es geht mit dem Programm "pdftk", was man hier: https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/ bekommt. Laut Wikipedia CrossPlatform https://en.wikipedia.org/wiki/PDFtk Bin im Delphi-Forum drauf gestoßen. https://www.delphipraxis.net/205030-pdf ... legen.html "Dalai" gibt hier den Tipp dieses Programm zu verwenden. Er verwendet es mit dem Parameter "burst output", ich nehme "cat output" weil ich jeder Seite einen Dateinamen zuweise.

Starten kann man es via ShellExecute (nur Windows) oder RunCommand. Ich bevorzuge RunCommand.

Code: Alles auswählen

RunCommand('pdftk',['"' + Dateiname + '" cat ' + IntToStr(i) + ' output "' + Pfad + VerrechDienst + '"'],sARC);
ShellExecute hat den Nachteil, dass als Paramter übergebene Strings mit Umlauten diese verlieren und man wieder Mist als Dateinamen beim Speichern im Ordner hat. Mit RunCommand kein Problem.

"Dateiname" ist hier der Pfad mit Name des PDF welches zerlegt werden soll. "cat" kombiniert mit der Schleifenvariablen "i"entnimmt die einzelne Seite "i".
"Pfad" ist der Dateipfad wo das Einzeldokument hin soll und "VerrechDienst" der Dateiname der Einzelseite mit Endung .pdf.

Wenn "VerrechDienst" Umlaute enthält, dann werden bei ShellExecute

Code: Alles auswählen

ShellExecute(0,'open',PChar(prog),PChar(params),PChar(extractfilepath(prog)),1)
durch PChar die Umlaute zerstört. Mit RunCommand halt nicht.

Schönen Abend

Soner
Beiträge: 737
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: LazReport PDF-Export Einzelseiten

Beitrag von Soner »

Ich würde in deiner Stelle die Funktion TfrReport.(FilterClass: TfrExportFilterClass; ...) erweitern zu TfrReport.(FilterClass: TfrExportFilterClass; ... ; VonSeite, BisSeite: Integer).
Das ist viel einfacher als externe Programme oder Bibliotheken zu verwenden.

Schaue auch in TfrReport.PrintPreparedReport(const PageNumbers: String; Copies: Integer) nach, dort wird gezeigt, wie man nur bestimmte Seiten druckt.

ErnstVolker
Beiträge: 354
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: LazReport PDF-Export Einzelseiten

Beitrag von ErnstVolker »

Guten Morgen,

PrintPreparedReport und auf einen PDF-Drucker ausgeben habe ich gemacht. Funktioniert (bedingt). Mit dem Drucker "Microsoft Print to PDF" geht es, ist aber relativ langsam und das das PDF sieht nicht ganz so schön aus wie das ursprünglich exprortierte. Wenn ich "PDF24" verwende wird kein funktionierendes PDF erzeugt, deshalb "bedingt". Wenn man eine Datei per Doppelklick öffnen will kommt der Hinweis sie sei beschädigt.

Das externe Programm pdftk ist verhältnismäßig schnell in der Ausführung, schneller als die Ausgabe über den PDF-Drucker.

Das Erweitern der Filterklasse werde ich mal versuchen. Das dachte ich könnte der Exportfilter von sich aus schon. Ist doch naheliegend sowas mit pdf's anzustellen...

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

Re: LazReport PDF-Export Einzelseiten

Beitrag von paweld »

Ich habe dem Export die Möglichkeit hinzugefügt, eine Start- und Endseite zu setzen. Ich habe den Komponenten-Fix und das Beispielprojekt in den Bugtracker gestellt - vielleicht wird es akzeptiert, aber Sie können die Änderungen auch auf Ihre Lazarus-Installation anwenden: https://gitlab.com/freepascal.org/lazar ... sues/40942
Grüße / Pozdrawiam
paweld

ErnstVolker
Beiträge: 354
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: LazReport PDF-Export Einzelseiten

Beitrag von ErnstVolker »

Hallo Paweld,

vielen Dank für Deine Mühen.

Wie spielt man denn die Patch-Datei ein? Meine Lazarus-Trunk-Installation habe ich nicht mit TortoiseSVN und auch nicht mit fpcupdeluxe erstellt sondern über einen USB-Stick von einem Rechner zum anderen rüberkopiert und dann in allen möglichen cfg-Dateien Pfade angepasst. Das war mühsam...

Ich habe über die Patche gelesen, dass man sie über TortoiseSVN einspielen kann, wenn man zuvor die Installation damit gemacht hat.

Man kann natürlich die Patchdatein händisch durchgehen und alle Stellen mit "+" am Original entsprechend ergänzen. Das werde ich mal versuchen...

Vielen Dank für die Mühe!!!

Volker

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

Re: LazReport PDF-Export Einzelseiten

Beitrag von paweld »

Hallo,
Diese Komponente wurde seit fast einem Jahr nicht mehr verändert, wenn sie also Lazarus Version 3.0 oder später haben, können sie das angehängte Archiv in den Pfad $(LazarusDir)\components\lazreport\source\addons\lrFclPDFExport\ entpacken und alle Dateien ersetzen.
Dateianhänge
lrFclPDFExport.7z
(127.59 KiB) 60-mal heruntergeladen
Grüße / Pozdrawiam
paweld

Antworten