AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Quick PDF-Library: Wie die Position des Annotationfensters ermitteln?
Thema durchsuchen
Ansicht
Themen-Optionen

Quick PDF-Library: Wie die Position des Annotationfensters ermitteln?

Ein Thema von Harry Stahl · begonnen am 2. Nov 2021 · letzter Beitrag vom 16. Nov 2021
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.479 Beiträge
 
Delphi 11 Alexandria
 
#1

Quick PDF-Library: Wie die Position des Annotationfensters ermitteln?

  Alt 2. Nov 2021, 16:04
Nutzt evtl. jemand von Euch die Quick PDF-Librray (ehemals Debenu, jetzt FoxIt), aktuelle Version 18.11?

Da gibt es eine Funktion, da kann man sog. Stick Notes als Anmerkung (Annotation) dem PDF-Dokument hinzufügen (Funktion "AddNoteAnnotation".

Da übergibt man eine left, top position für das Icon, welches eine Anmerkung symbolisiert und dann auch PopupLeft, PopUpTop, PopUp.Width und PopUp.height für das eigentliche Anmerkungsfenster, welches an unterschiedlichen Positionen auf der Seite gezeigt werden kann.

Das funktioniert auch soweit, jedoch habe ich in der Library keine Funktion gefunden, mit der man die Position des PopUp-Fensters später wieder aus der PDF-Datei ermitteln könnte. Die Position des Icon kann ich abfragen, mit "GetAnnotDblProperty". Aber wie die Position des PopUp-Fensters?

Das Quick-PDF-Forum (http://www.quickpdf.org/forum) ist leider seit gestern down, da ist die Seite abgelaufen, da konnte man sonst oft was finden. Habe mit Google das ganze Internet abgesucht, aber außer insoweit nun toten Links nichts gefunden.

Auch wenn die Hoffnung ist groß ist, hat da evtl. jemand eine Lösung?
  Mit Zitat antworten Zitat
Benutzerbild von ULIK
ULIK

Registriert seit: 25. Sep 2006
Ort: Regensburg
416 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Quick PDF-Library: Wie die Position des Annotationfensters ermitteln?

  Alt 3. Nov 2021, 09:03
Hast Du QuickPDF in der Source-Version? Dann könnte ich Dir die nötigen Erweiterungen schicken um an die benötigten Informationen heran zu kommen.

Das Problem im Allgemeinen ist wie folgt: wenn Du mit AddNoteAnnotation eine Annotation anlegst, dann wird nicht nur eine angelegt, sondern immer zwei Stück:
die erste die das Note-Symbol darstellt und vom Subtype /Text ist und die zweite die vom Subtype /Popup ist. Die erste referenziert die zweite mittels der Eigenschaft /Popup und die zweite hat in der Eigenschaft /Parent die erste stehen. In PDF schaut das so aus:

Code:
AddNoteAnnotation(100, 100, 0, 100, 100, 100, 100, 'Murks', 'Content', 1.0, 0,0,0);
wird zu
Code:
8 0 obj
<<
/Type /Annot
/Subtype /Text
/M (D:20211103093933+01'00')
/Name /Note
/Rect [ 100 76 120 100 ]
/C [ 1 0 0 ]
/T (Murks)
/Contents (Content)
/F 28
/Popup 9 0 R
/AP <<
/N 10 0 R
>>
/P 2 0 R
/Subj (Sticky Note)
/NM (D:20211103093933+01'00')
/CreationDate (D:20211103093933+01'00')
>>
endobj
9 0 obj
<<
/Type /Annot
/Subtype /Popup
/Parent 8 0 R
/Rect [ 100 0 200 100 ]
/F 25
/Open false
>>
endobj
Auf diese Weise sind die beiden Annotations verbunden. Dummerweise kommt man mit der regulären Version von QuickPDF nicht an die Informationen /Popup bzw. /Parent ran. Das hab ich erst extra einbauen müssen.


Grüße,
Uli
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.479 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Quick PDF-Library: Wie die Position des Annotationfensters ermitteln?

  Alt 3. Nov 2021, 23:17
Hey, vielen Dank für die Antwort.

Bin da eben zufälligerweise selbst drauf gekommen, als mir auffiel, dass nach der eigentlichen Annotation vom Type "Text" immer ein Element namens "Popup" folgt, welches die Koordinaten enthält (also einfach Index um 1 erhöhen).

Jetzt stehe ich gerade vor dem Problem, herauszufinden, ob ein Popup beim Laden der PDF geschlossen ist oder offen.

Hast Du da zufälligerweise auch noch einen Tipp?

Habe nur die "normale" Version, also ohne Source...
  Mit Zitat antworten Zitat
Benutzerbild von ULIK
ULIK

Registriert seit: 25. Sep 2006
Ort: Regensburg
416 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Quick PDF-Library: Wie die Position des Annotationfensters ermitteln?

  Alt 4. Nov 2021, 06:32
Servus,

leider kenn ich da keinen Workaround. Das Auswerten von /Open hab ich erst in QuickPDF einbauen müssen.
Was deine Lösung für das Finden des Popups betrifft: das dürfte wohl so klappen. Ich hab bisher noch kein PDF gesehen, wo das Popup nicht sofort nach der Annotation kommt.
Wenn Du die PDFs aber nicht selbst erstellst, sondern beliebige PDFs verarbeiten willst, dann achte auf eines: es gibt Annotations, die ein Reply auf eine andere Annotation sind. Für dieses darfst Du dann das Popup nicht anzeigen sondern es muß in dem Popup der Annotation erscheinen, für das es ein Reply ist. Ich hab Dir ein entsprechendes PDF mal angehängt. Du kannst das aber erkennen, in dem Du mit GetAnnotIntProperty(128) nachschaust, ob dieses einen Index > 0 liefert. In dem Fall wird dann die Annotation nicht angezeigt, aber das zugehörige Popup in das der Referenz eingebettet.

Grüße,
Uli
Angehängte Dateien
Dateityp: pdf test_annot_reply_u.pdf (8,1 KB, 5x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.479 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Quick PDF-Library: Wie die Position des Annotationfensters ermitteln?

  Alt 4. Nov 2021, 21:18
Hey, danke für den Hinweis auf die Replys, die hatte ich bislang noch gar nicht im Blick.

Sieht jetzt so aus, wie im anliegenden Screenshot (Deine Anmerkung rechts neben der Seite und weitere von mir hinzugefügt).

Na, dann muss ich mal weiter forschen wegen des Open-Status.

Ich bin eigentlich ganz zufrieden mit der Standard-Version, nutze da inzwischen nur die DLL's, die kriege ich fertig für Windows, MacOS und Linux, funktionieren also unabhängig von irgendwelchen Delphi-Updates.

Compiliert denn die Source-Version auch für FMX oder ist das Windows-Only?
Miniaturansicht angehängter Grafiken
annos.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von ULIK
ULIK

Registriert seit: 25. Sep 2006
Ort: Regensburg
416 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Quick PDF-Library: Wie die Position des Annotationfensters ermitteln?

  Alt 5. Nov 2021, 08:44
Ob QuickPDF mit FMX kompiliert: ich hab das nie ausprobiert, da ich FMX nicht verwende. Aber eigentlich sollte es, denn die Source-Edition ist ja die Codebasis von allen Versionen und spezieller UI Code wird ja nicht verwendet. Zumindest ist für die DLL Version ein eigenes Projekt dabei.

Edit: hab's grad mal getestet. Out of Box kompiliert das nicht für FMX. Man muß auf alle Fälle die .INC Datei ändern und dann teilweise ein paar Sachen wegen Uneindeutigkeiten bei der Typdeklaration anpassen. Denke aber, daß man das in den Griff kriegt.

Was das Open betrifft: ich kann mir gerade nicht vorstellen, wie man da anders ran kommen sollte. Die Info ist halt nur in den Daten der Popup-Annotation gespeichert.


Grüße,
Uli

Geändert von ULIK ( 5. Nov 2021 um 15:59 Uhr) Grund: Testweise für FMX probiert
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.479 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Quick PDF-Library: Wie die Position des Annotationfensters ermitteln?

  Alt 8. Nov 2021, 17:19
Vielen Dank für's ausprobieren.

Wie gesagt, eigentlich reicht mir die DLL-Variante, aber wenn man sonst nicht an bestimmte Sachen ran kommt, muss ich mir das überlegen. Müsste aber zwingend auch für FMX geeignet sein, da ich das immer Plattform-übergreifend verwende.

Scheint jedenfalls so einiges zu sein, neben dem Offen/geschlossen Status der Annotation habe z.B. auch nichts gefunden, um selber eine Antwort-Annotation zu setzen...

Aber ich werde da einfach mal eine Erweiterung bei Foxit anregen, evtl. machen die das ja...
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.479 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Quick PDF-Library: Wie die Position des Annotationfensters ermitteln?

  Alt 11. Nov 2021, 14:59
Hast Du QuickPDF in der Source-Version? Dann könnte ich Dir die nötigen Erweiterungen schicken um an die benötigten Informationen heran zu kommen.

Das Problem im Allgemeinen ist wie folgt: wenn Du mit AddNoteAnnotation eine Annotation anlegst, dann wird nicht nur eine angelegt, sondern immer zwei Stück:
die erste die das Note-Symbol darstellt und vom Subtype /Text ist und die zweite die vom Subtype /Popup ist. Die erste referenziert die zweite mittels der Eigenschaft /Popup und die zweite hat in der Eigenschaft /Parent die erste stehen. In PDF schaut das so aus:

Code:
AddNoteAnnotation(100, 100, 0, 100, 100, 100, 100, 'Murks', 'Content', 1.0, 0,0,0);
wird zu
Code:
8 0 obj
<<
/Type /Annot
/Subtype /Text
/M (D:20211103093933+01'00')
/Name /Note
/Rect [ 100 76 120 100 ]
/C [ 1 0 0 ]
/T (Murks)
/Contents (Content)
/F 28
/Popup 9 0 R
/AP <<
/N 10 0 R
>>
/P 2 0 R
/Subj (Sticky Note)
/NM (D:20211103093933+01'00')
/CreationDate (D:20211103093933+01'00')
>>
endobj
9 0 obj
<<
/Type /Annot
/Subtype /Popup
/Parent 8 0 R
/Rect [ 100 0 200 100 ]
/F 25
/Open false
>>
endobj
Auf diese Weise sind die beiden Annotations verbunden. Dummerweise kommt man mit der regulären Version von QuickPDF nicht an die Informationen /Popup bzw. /Parent ran. Das hab ich erst extra einbauen müssen.


Grüße,
Uli
Hier könnte ich die Information ja entsprechend auslesen (/Open false). Würde aber ungerne immer auch die PDF-Datei zusätzlich als ganzen Textstream einlesen (was natürlich zur Not ginge). Mit SelectContentSteram und GetContentstream komme ich leider nicht zum Ziel. Gibt es sonst eine alternative Möglichkeit Teile aus der PDF-Datei im oben genannten Format anlassbezogen und partiell einzulesen, so dass ich an Infos im oben genannten Format rankomme?
  Mit Zitat antworten Zitat
Benutzerbild von ULIK
ULIK

Registriert seit: 25. Sep 2006
Ort: Regensburg
416 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Quick PDF-Library: Wie die Position des Annotationfensters ermitteln?

  Alt 11. Nov 2021, 15:17
Das ist genau das Problem: es gibt nichts passendes dafür. Zwar kann Du mit GetObjectToString die Daten eines PDF Objekts auslesen. Das Problem ist dann aber: wie finde ich heraus, welche Objektnummer meine aktuelle Annotation hat.
Die Funktionen im QuickPDF liefern max. den Index der Annotation auf der Seite. Im Endeffekt bleibt Dir also nichts weiter übrig, als den kompletten Source durchzugehen und Dir zu merken, was davon eine Annotation ist und auf welcher Seite diese liegt.
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.479 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Quick PDF-Library: Wie die Position des Annotationfensters ermitteln?

  Alt 11. Nov 2021, 16:40
Interessanterweise liefert bei mir die GetobjectToString gar nicht die Annotations zurück, sondern irgend einen anderen Kram. Vielversprechender ist dann wohl doch die ganze PDF Datei zu verwenden, da finde ich alle Objekte und kann meine Annotationen anhand der Position (relativ) sicher ermitteln.

Blöd nur, dass andere PDF-Programme anscheinend die PDF-Datei irgendwie komprimiert speichern, dann finde ich nichts, muss also erst die Datei öffnen, dann als (unkomprimierten) Stream speichern und den in eine Textdatei laden.

Na ja, werde ich gleich mal ausprobieren. Aber sieht so aus, als ob man so doch an einige zusätzliche Infos ran kommen könnte.

Edit: Funktioniert hervorrangend!. Ist zwar ein wenig Parser-Gefrickel (aber ich muss gestehen, ich liebe das), aber so kann ich beim Laden der Datei sicher den Zustand der Popups ermitteln. Und als Stream zu speichern, etc. brauch ich auch nicht, da ein einfaches qp.savetostring mir die Daten wie gewünscht liefert.

Nun muss ich mir nur noch überlegen, wie ich Änderungen des geöffnet-Status zurückschreibe. Wahrscheinlich indem ich bei Änderung des Status das Popup lösche und mit dem neuen Status wieder anlege. Umständlich, aber wenn es nicht anders geht...?

Denn eine Quick-PDF-Funktion habe ich nicht gefunden, womit man den Status des Popups ändern könnte.

Geändert von Harry Stahl (11. Nov 2021 um 19:10 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:06 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