[GELÖST] fcl-pdf Sprungmarken im Dokument (Bookmarks)

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

[GELÖST] fcl-pdf Sprungmarken im Dokument (Bookmarks)

Beitrag von petwey »

Hallo Forum,

leider hab ich in der Dokumentation und den Beispielen nichts dazu gefunden, deshalb frage ich hier im Forum.

Ich möchte im PDF-Dokument das Inhaltsverzeichnis meines mit fcl-pdf erstellten Dokuments anzeigen und natürlich beim Anklicken zur entsprechenden Stelle im Dokument springen.

Was muss ich dazu machen?? Ich denkmal zuerst Sprungmarken definieren....

Habt ihr vielleicht ein kleines Beispiel wie das geht oder einen Link wo das beschrieben ist?

Danke im voraus.
Zuletzt geändert von petwey am Di 20. Jun 2023, 16:43, insgesamt 2-mal geändert.
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

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

Re: fcl-pdf Sprungmarken im Dokument

Beitrag von fliegermichl »

Ich könnte mir vorstellen, daß TPDFDocument.CreateAnnotEntry dafür verwendet werden kann.

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

Re: fcl-pdf Sprungmarken im Dokument

Beitrag von paweld »

Ich habe einen Beitrag mit einem Patch für fcl-pdf hinzugefügt, der das Hinzufügen von Links zu Seiten ermöglicht: https://gitlab.com/freepascal.org/fpc/s ... sues/40318
Grüße / Pozdrawiam
paweld

petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

Re: fcl-pdf Sprungmarken im Dokument

Beitrag von petwey »

Hallo fliegermichl, hallo paweld,

erstmal Danke für die Antworten.

@paweld: Das ist cool mit den internen Links, aber für mich momentan nicht so interessant. Da würde ich gerne warten bis in der offiziellen Version mit enthalten ist.

Was ich suche ist im angehängten Bild dargestellt.
Lesezeichen.png
Lesezeichen.png (80.99 KiB) 1506 mal betrachtet
Gefunden habe ich dazu "Dictionary" wovon ich nicht genau weiß was es ist und ob es vielleicht nur intern zur Erzeugung des PDFs notwendig ist. Und "Annots", ich kann mich irren, aber das könnten User-Notizen sein, die später zu dem Dokument hinzugefügt werden (Bsp: Ein Anwender des Dokuments macht sich "digitale" Randnotizen und speichert das zusammen mit dem Dokument ab).

Code: Alles auswählen

  Doc.CreateDictionary;
  Page.Annots;
Ich weiß nicht ob fcl-pdf, das was ich gerne möchte überhaupt unterstützt. Wenn ja, ist das Zauberwort Dictionary oder Annots und wie wende ich sie an?
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

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

Re: fcl-pdf Sprungmarken im Dokument

Beitrag von fliegermichl »

Wenn du dir TPDFDocument.AddExternalLink anschaust, dann kannsrt du sehen, daß da auch ein TPDFAnnot erzeugt wird.
Statt der externen URI kann man dann wohl auch eine Seitennummer oder ID als Ziel angeben.

petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

Re: fcl-pdf Sprungmarken im Dokument

Beitrag von petwey »

Hallo fliegermichl,

ob interne oder externe Links sind hier meiner Meinung nach irrelevant, denn es bedeutet ich muss "IM" Dokument auf einen bestimmten Bereich klicken um woanders hin zu kommen.
Das ist nicht mein Ziel.

Ich benutze hier beispielweise den Foxit Reader - aber andere Reader haben das auch - nämlich links neben dem Dokument einen Bereich (nicht das Dokument) in dem z.B. die Kapitelüberschriften sind, wenn man dann da drauf klickt, dann kommt man genau zu der Überschrift im Dokument.

Ich kenne es z.B. aus Latex, da wird automatisch aus der Inhaltsangabe sowas erstellt, wenn man ein PDF erzeugt. Genau diesen Mechanismus suche ich für fcl-pdf.

Die erste Frage lautet:
Unterstützt fcl-pdf das überhaupt?
Wenn ja, wie macht man das?

Ich denke mir, wenn es geht, dann muss ich eine Überschrift erzeugen und nachher sagen das diese Überschrift als Sprungziel verwendet werden soll. Name und Sprungziel müssen dann in eine baumartige Struktur aufgenommen werden und im PDF so hinterlegt werden, dass ein Reader sie entsprechend anzeigen kann.
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: fcl-pdf Sprungmarken im Dokument

Beitrag von theo »

Man müsste mal klarstellen was eigentlich gemeint ist, damit man dem auf den Grund gehen kann.
Meinst du so wie in dieser fpdf (PHP) Erweiterung ("Bookmarks")?
http://fpdf.org/en/script/script1.php

S.a. unten bei "View the result here. "

petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

Re: fcl-pdf Sprungmarken im Dokument

Beitrag von petwey »

Hallo theo,

ich glaube das war mein Fehler, denn ich wusste nicht wie der richtige Suchbegriff lautet, tut mir leid. Deshalb auch meine anfängliche Frage sind es Dictionaries oder Annots oder etwas anderes?

Der Begriff "Bookmarks" trifft es genau.

Unterstützt fcl-pdf Bookmarks?
Wenn ja, wie funktioniert das?
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: fcl-pdf Sprungmarken im Dokument

Beitrag von theo »

petwey hat geschrieben: Mi 14. Jun 2023, 13:37 Unterstützt fcl-pdf Bookmarks?
Wenn ja, wie funktioniert das?
Das ist ja auch nur wieder ein Begriff... :lol:
Schau halt im PHP nach, was da gemacht wird.
Dort heisst das eher "Outlines".
Im fpPDF.pp finde ich dazu z.B.

Code: Alles auswählen

function TPDFDocument.CreateOutlines: integer;    
function TPDFDocument.CreateOutlineEntry(Parent, SectNo, PageNo: integer; ATitle: string): integer;   
function TPDFDocument.CreateSectionsOutLine: Integer; // Parent page ID    
etc. 

petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

Re: fcl-pdf Sprungmarken im Dokument (Bookmarks)

Beitrag von petwey »

Hallo theo,

jetzt sind schon mal die Suchbegriffe klarer.

Ich hab mir das ganze mal angeschaut. Im Endeffekt wird bei Speichern des Dokuments die Funktion CreateSectionsOutLine aufgerufen, die wiederum alle anderen Funktionen mit ..Outline.. aufruft. Also direkt eine dieser Funktionen zu verwenden ist nicht die Lösung.
Ich hab mir dann den Mechanismus angeschaut woher die Einträge kommen, die dann in der Liste des PDF-Readers dargestellt werden sollen -> aus dem Titel einer TPDFSection.

Aber zuerst muss die Option poOutline mit in den Satz der Optionen aufgenommen werden, sonst geht gar nichts.

Ich verweise hier mal auf die Anleitung S.4:
https://www.freepascal.org/~michael/art ... lazpdf.pdf
Zumindestens 1 Section muss vorhanden sein.

Will man jetzt ein PDF erstellen, dann kracht's, denn es ist nur eine Section vorhanden. In CreateSectionsOutLine werden wenigstens 2 Sectionen benötigt, sonst bleibt OutlineRoot unbestimmt, was ein paar Zeilen weiter knallt. Das ist nicht ganz so schön und vielleicht noch nicht aufgefallen, aber vielleicht kann man das mit einer helper-Routine beheben.

Also habe ich noch eine Section hinzugefügt und jetzt lief es wenigstens, allerdings weiß ich noch nicht so recht was ich da mache. Bzw. wie man es richtig macht. Mein Dokument war vorher 4 Seiten lang. Ich habe hinter die Erzeugung der 3. Seite die folgenden Zeilen eingefügt und erhalte seltsamerweise jetzt 5 Seiten.

Code: Alles auswählen

procedure TMy_PDF.AddSectionEntry(aTitle: string);
begin
  Sec := Doc.Sections.AddSection;
  Sec.AddPage(aPage);
  Sec.Title := aTitle;
  Sec.DisplayName := 'Test';
end;
Als aTitle habe ich P3 verwendet
Bookmark.png
Bookmark.png (21.24 KiB) 1408 mal betrachtet
Die Lösung scheint schon greifbar und mit der Verwendung von Sections zusammenzuhängen.
Kann mir jemand erklären, wie man Sections richtig verwendet?

Ich hätte eigentlich erwartet, das nur P3 auftaucht (und vielleicht noch Test).
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

Re: fcl-pdf Sprungmarken im Dokument (Bookmarks)

Beitrag von petwey »

Hallo Forum,

ich möchte mal meine Erfahrungen mit den Sections zusammenfassen:

- Um Lesezeichen, Bookmarks, Outlines, wie auch immer zu sehen muss die Option poOutLine aktiviert werden.
- Die OutLines funktionieren erst wenn >1 TPDFSection vorhanden sind.
- Erste eine Sektion erzeugen, dann eine oder mehrere Seiten erstellen, dann erscheinen unter der Sektion die einzelnen Seiten.

Das ist bisher das Ergebnis, das am dichtesteten rankommt.
Bookmark.png
Bookmark.png (20.72 KiB) 1375 mal betrachtet
ABER:
- Mein Ziel wäre es das nur meine Texte erscheinen und nicht ein Unterpunkt wie P1 Page 1.
- Eventuell habe ich mehrere Bookmarks die auf die gleiche Seite führen (weil mehrere Kapitel-Überschriften auf einer Seite sind). Durch die Reihenfolge 1. Section dann Seiten lässt sich das nicht realisieren, aber andersrum ist das Ergebnis unschön.
- Eine Baumstruktur (für Unterkapitel) wäre auch wünschenswert. Aber dafür sehe ich momentan keine Möglichkeit.
- Was ist wenn ich nur eine Sektion benötige? Das lässt sich gar nicht realisieren, weil in CreateSectionsOutLine mindestens 2 Sektionen verlangt werden, siehe mein voriger Beitrag.

Ich hab schon probiert die Dokumentenklasse abzuleiten, um CreateSectionsOutLine zu überschreiben, aber das würde zu weit führen, denn ich müsste diverse Klassen in fppdf verändern und das will ich nicht.

Hat hier wirklich noch niemand ein PDF mit Outlines erzeugt, die wie eine Inhaltsangabe in Baumstruktur dargestellt wird.
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

Re: fcl-pdf Sprungmarken im Dokument (Bookmarks)

Beitrag von petwey »

Hallo Forum,

Wie würdet ihr das lösen?

Mir ist mittlerweile klar, das CreateSectionsOutline, das in TPDFDocument.SaveToStream aufgerufen wird die Bookmarks erstellt. Aber ich finde keinen Weg die Bookmarks nach meinen eigenen Anforderungen zu gestalten. Will heißen CreateSectionsOutline verfolgt einen sturen Weg die Outlines zu erzeugen.
Deshalb habe ich in einer separaten Unit TPDFDocument abgeleitet um diese Funktion zu überschreiben. Aber prinzipiell müssen hier viele Funktionen wie in der ursprünglichen Routine verwendet werden (lediglich die Inhalte der Bookmarks sollen durch meine Anforderungen ersetzt werden). Darunter sind auch einige Funktionen die im protected-Bereich stehen, wie z.B.:

Code: Alles auswählen

GlobalXRefs[Catalogue].Dict.AddReference('Outlines',GLobalXRefCount-1);
Ich komme also an diese proteced-Elemente nicht ran und ich möchte auch fppdf nicht gerne verändern. Es ist mir klar dass ich eine lokale Kopie dieser Datei verwenden könnte, aber dabei verliere ich den Vorteil von weiteren Verbesserungen an der fppdf zu profitieren.

Gibt es dazu irgend einen schlauen Lösungsansatz?
An sonsten bleibt mir nur der Weg eine lokale Kopie zu erstellen und mich von der "Basis"-fppdf abzukoppeln.
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6770
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: fcl-pdf Sprungmarken im Dokument (Bookmarks)

Beitrag von af0815 »

petwey hat geschrieben: Do 15. Jun 2023, 20:26 Ich komme also an diese proteced-Elemente nicht ran und ich möchte auch fppdf nicht gerne verändern. Es ist mir klar dass ich eine lokale Kopie dieser Datei verwenden könnte, aber dabei verliere ich den Vorteil von weiteren Verbesserungen an der fppdf zu profitieren.
Leite dir eine eigene Klasse ab und ändere dort die Sichtbarkeit. Solange man versteht, was man macht ist das kein Problem. Hat den Vorteil, das man die Elternklasse nicht ändern muss.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

petwey
Beiträge: 83
Registriert: Sa 24. Nov 2012, 19:00
OS, Lazarus, FPC: Windows10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit und 64Bit

Re: fcl-pdf Sprungmarken im Dokument (Bookmarks)

Beitrag von petwey »

Danke af0815,

ich programmiere jetzt wirklich schon viele Jahre, aber die Sichtbarkeit ändern musste ich bis jetzt noch nicht. Hast Du einen Link oder ein Mini-Beispiel für mich?

Ein weiteres Problem ist, das TPDFDocument auf die protected Funktion der Klasse TPDFDictionary zugreift. Das ist eine ziemlich weitverzweigte Sache. Wenn ich TPDFDictionary ableiten würde, dann müsste ich es in fppdf überall durch die neu Klasse ersetzen, damit wäre mir nicht geholfen.

Kann man das mit einer Helper class hinkriegen? Ich meine Helper class erzeugen um dort die Sichtbarkeit zu ändern?
MfG,
petwey

Windows 10 und Linux 32 und 64Bit (L 2.2.2 FPC 3.2.2)

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: fcl-pdf Sprungmarken im Dokument (Bookmarks)

Beitrag von theo »

petwey hat geschrieben: Do 15. Jun 2023, 20:26 Ich komme also an diese proteced-Elemente nicht ran und ich möchte auch fppdf nicht gerne verändern. Es ist mir klar dass ich eine lokale Kopie dieser Datei verwenden könnte, aber dabei verliere ich den Vorteil von weiteren Verbesserungen an der fppdf zu profitieren.

Gibt es dazu irgend einen schlauen Lösungsansatz?
An sonsten bleibt mir nur der Weg eine lokale Kopie zu erstellen und mich von der "Basis"-fppdf abzukoppeln.
Mach doch einfach eine allgemeingültige, sinnvolle Änderung/Erweiterung welche man in die offizielle fppdf Version übernehmen kann, damit später alle etwas davon haben.

Antworten