nach dem Hinweis von theo, habe ich versucht fppdf abzuändern um die Bookmarks nach eigenen Vorstellungen zu erstellen. Da ich nicht das tiefe Wissen um die PDF-Struktur besitze und die 6000 Zeilen in fppdf nicht so leicht zu knacken waren, habe ich mich noch anderweitig umgeschaut.
Aber zuallererst: Finger weg von der Option poOutline in fppdf. Keine Ahnung was der eigentliche Hintergedanke ist, aber Bookmarks die lediglich einige Seitennummern anzeigen sind sicher keine sinnvollen Bookmarks!
Auf der Suche nach einer Lösung bin ich auf den Perl-Script pdfoutline.pl gestoßen. Hier der Link:
https://manpages.ubuntu.com/manpages/lu ... ine.1.html
Das Script erzeugt nachträglich in einem PDF Bookmarks, allerdings mit Bezug auf einzelne Seiten. Nach einigen Tests hab ich den Script dahingehend erweitert, dass sich auch noch die Position auf der Seite eintragen lässt, d.h. es lassen sich Bookmarks erzeugen, die auf eine bestimmten Seite und eine bestimmte Y-Position auf der Seite weisen.
Nachdem das geklappt hat, wollte ich das Script in mein Lazarus-Programm einbetten. Das geht schon, aber da das Perl-Script davon abhängig ist, das Perl + etliche Module auf dem Rechner vorhanden sind, war mir das Risiko zu hoch.
Dann hab ich mir mit WinMerge das PDF mit und ohne Bookmarks angesehen. Siehe da, das Script hat lediglich am Dokument etwas angehängt. Jetzt hab ich verschiedene Versuche mit unterschiedlichen Bookmarks gemacht und daraus rückgeschlossen wie ein Code aussehen würde, mit dem man das unter Pascal machen kann.
Das Ergebnis ist die Unit im Anhang. Sicher kann man den Code noch weit schöner machen, aber er funktioniert.
Hier in aller kürze ein simples Anwendungsbeispiel:
Code: Alles auswählen
uses
PDF_Bookmarks;
procedure TestBookmarks;
Var
Globals : TCEH_PDFGlobals;
aPBM : TCEH_Bookmark;
begin
// auf eine passende Datei ändern (sollte min. 4seitig und ohne Outlines sein)
// Die Basis für die Bookmarks wird erstellt. 'Content' ist der Text der Root-Bookmark.
Globals := TCEH_PDFGlobals.Create('D:\Test.pdf','Content');
// Bookmark unterhalb der Root
// 1 ist die Seitennummer, 0 die Y-Position in mm von oben gemessen.
aPBM := Globals.AddRootChild(1,0,'Chapter 1');
// Zwei Bookmarks darunter, ....
Globals.AddChild(aPBM,1,10,'Chapter 1.1');
Globals.AddChild(aPBM,2,0,'Chapter 1.2');
aPBM := Globals.AddRootChild(3,100,'Chapter 2');
Globals.AddChild(aPBM,3,110,'Chapter 2.1');
Globals.AddRootChild(4,0,'Chapter 3');
// PDF mit Bookmarks erzeugen.
Globals.CreateOutline;
Globals.Free;
end;