Externe Markierungen und Anmerkungen in Wissenselemente umwandeln

Florian S. hinzugefügt 9 Monaten her
in Prüfung

Liebes Citavi Team,


ich würde gerne eine Diskussion aufgreifen, die letztes Jahr im "alten" support Forum geführt wurde: Die Inhalte findet ihr unter dem Betreff. Es ging darum Wissenselemente "automatisiert" in Citavi zu importieren. Die Frage wurde von Tianci am 2017-03-05 23:12 unter dem Titel ("Externen Markierungen schnell in Wissenselemente umwandeln") gestellt.


ich wünsche mir, wie einige andere Nutzer auch, die Funktion, Kommentare (i.e. Wissenselemente), die ich in anderen Programmen und noch besser, auf einem Tablet gemacht habe, in Citavi importieren zu können.


Hervorhebungen klappen bei mir super mit dem Foxit PDF Reader auf dem Tablet und Adobe PDF am PC. Soweit so gut. Auch die Kommentare aus Foxit werden am Adobe Reader angezeigt. Dazu bietet Adobe die Funktion, die Annotationen als textcodiertes Dokument auszulesen. Dieses wird dann wo gewünscht als .fdf oder .xfdf Datei gespeichert. Eine Hervorhebung und die dazugehörige Anmerkung hat die folgende Form (allerdings nur, wenn ich auf dem Tablet markiere und dann auf die Markierung "antworte"):

Highlight:

 </text><highlight width="0" dashes="" style="solid" color="#FFC700" opacity="0.500000" creationdate="D:20180310073051+01'00'" flags="print" IT="" date="D:20180310073051+01'00'" name="f1129e20-2656-408a-a7af-2c401953b548" page="2"

coords="70.770000,648.620000,406.540000,648.620000,70.770000,637.350000,406.540000,637.350000,47.820000,636.660000,406.500000,636.660000,47.820000,625.390000,406.500000,625.390000,47.820000,624.700000,344.810000,624.700000,47.820000,613.430000,344.810000,613.430000" rect="47.820000,613.430000,406.540000,648.620000" subject="Highlight" title="Flo Tablet">

<contents>far securer way of constructing geographical soil chronosequences is to use soils that have developed on surfaces of known age, and that either have persisted through to the present day or else have been buried beneath a sedimentary cover</contents><popup flags="print,nozoom,norotate" open="no" page="2" rect="435.000000,506.619995,615.000000,648.619995"/>
Annotation:

 </highlight><text width="0" color="#000000" opacity="0" creationdate="D:20180310074855+01'00'" flags="print,nozoom,norotate" inreplyto="f1129e20-2656-408a-a7af-2c401953b548" IT="" date="D:20180310074855+01'00'" name="592a32d7-dd8e-4410-96f4-ac731642a790" icon="Comment" page="2" rect="0.000000,-20.000000,20.000000,0.000000" rotation="0" subject="" title="Flo Tablet">

<contents>Chrono sequences can be a at of non-related sites for which a soil development succession is inferred and hence a site is believed to have passed through previous stages of the sequence regardless if it actually has or not. This obviously must be based on the assumption that the concerned sites have similar, if not the same drivers of pedogenesis. This as such is not flawed reasoning, it seems however unlikely, that such conditions should have been maintained equal over hundreds of thousands of years. This comes out of the desire to develop a universal concept of soil development. However, it is imaginable that a soil develops chaotically and not deterministically. Therefore it could not be assumed that soils pass through a given set of states to arrive at the present state. Instead it might be a better though less predictable idea that a set of certain conditions produce a soil "type"(which of course would include the previous soil conditions</contents><popup flags="print,nozoom,norotate" open="no" page="2" rect="435.000000,-142.000000,615.000000,0.000000"/>


Mein Gedanke ist folgender:


  • Es sind die Koordinaten der Hervorhebung drin, welche mit einer eindeutigen Kennung versehen sind. name="f1129e20-2656-408a-a7af-2c401953b548" /
  • Diese Kennung taucht auch wieder in der Anmerkung auf. inreplyto="f1129e20-2656-408a-a7af-2c401953b548"
  • Auch die anderen Daten, wie z.B. Metadaten (Verfasser des Kommentars, Zeitstempel, Markierungsfarbe) wurden erfasst.

Sollte es mit diesen Angaben nicht möglich sein, automatisch Wissenselemente anzulegen und diese mit den markierten Textstellen zu verknüpfen?

Wie schätzt ihr die Möglichkeit ein, dies entweder über ein Makro zu erfassen oder sogar automatisiert als Add On in Citavi 6 einzubinden? Die farbliche Kodierung hat für mich nur untergeordnete Bedeutung. In welcher Form die Wissenselemente abgespeichert werden wäre mir im Prinzip auch egal. Präferiert wäre für mich der hervorgehobene Text als Zitat im Wissenselement und mein eigener Kommentar als Kernaussage.

Anbei findet ihr noch meine mit Anmerkungenen versehene PDF Datei. Die Anmerkungen wurden mit Foxit gemacht.


Viele Grüße,

Florian

Beste Antwort
Foto

Erstens: m.E. kann man meine bisherigen Beiträge in dem Thread löschen. Zweitens, zur User Story: ich habe heute mal mit der Alpha-Version meines eigenen AddOns, welches an Problemen leidet, (1) automatisch alle externen Markierungen umgewandelt, (2) automatisch ein paar bestehende Markierungen nachträglich verbunden, (3) automatisch ein paar ausgewählte direkten Zitate in rote Markierungen umgewandelt, (4) automatisch in ausgewählten (in dem Fall allen) Wissenselementen ein paar Suchen-und-Ersetzen-Muster ausgeführt, welche in einer separaten Datei gespeichert sind, um den Text der Wissenselemente zu bereinigen, (5) automatisch die Nummerierungsart der erstellten Wissenselemente auf Grundlage des Freitext-Feldes 8 auf "Margin number" gesetzt, (6) ein Befehl ausgeführt, welches im Vorschaufenster das Wissenselement in der PDF anzeigt, und ein einfaches Eingabefeld öffnet, um die Absatznummer einzutippen, und nach dem Ausführen auf das Zitat in der Liste davor springt, (7) von Hand ein paar Änderungen vorgenommen. Das Ergebnis war, dass was früher deutlich mehr als eine Stunde gedauert hat, das Umwandeln der Markierungen aus Gerichtsentscheidungen, nun in etwa 15 Minuten erledigt war.

Kommentare (11)

Foto
1

Hallo Florian,

vielen Dank für Ihren Verbesserungsvorschlag und das Beispiel-PDF.

Ich habe die Anregung auf unserer internen Wunschliste für unsere Entwickler erfasst. Derzeit liegt allerdings der Fokus der Entwicklung auf Citavi Web, was den größten Teil unserer Ressourcen bindet. Daher ist nicht absehbar, ob bzw. wann wir Ihren Wunsch umsetzen können.

Viele Grüße

Susanne

Foto
1

Hallo Susanne,

vielen Dank für die Rückmeldung. Ich hoffe dieses Feature irgendwann in Zukunft in Aktion zu erleben :)

Viele Grüße,

Florian

Foto
1

Hallo Florian,

gern geschehen und vielen Dank für Ihre freundliche Rückmeldung.

Viele Grüße

Susanne

Foto
1

Per Makro geht das garantiert jetzt schon, weil ich ja ohnehin schon die externen Markierungen sehen kann, und per Klick in ein Wissenselement umwandeln kann, ich scheitere da aber seit einem Jahr an einem wichtigen Schritt.

Foto
1

Achso, der zweite Teil, das Umwandeln des Kommentars, geht vielleicht momentan nicht per Makro.

Foto
Foto
1

Weil ich mich das doch auch schon nervt, jedesmal noch mal ne Stunde oder so damit zu verbringen, alle externern Markierungen umzuwandeln versuche ich mich doch mal am AddOn. Ich habe es schon mal geschafft, die externen Highlights zu finden:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using SwissAcademic.Citavi;
using SwissAcademic.Citavi.Shell;
using SwissAcademic.Citavi.Shell.Controls.Preview;
using SwissAcademic.Controls.WindowsForms;
using SwissAcademic.Pdf;

using pdftron;
using pdftron.Filters;
using pdftron.FDF;
using pdftron.Common;
using pdftron.SDF;

using pdftron.PDF;
using pdftron.PDF.Annots;

namespace BornheimsToolbox
{
    class AnnotationConverter
    {
        public void ConvertAnnotations(Reference reference)
        {
            var pdfLocations = reference.GetPDFLocations();
            var knowledgeItems = reference.Quotations.ToList();

            if (knowledgeItems.Count <= 1) return;

            List<PageWidth> store = new List<PageWidth>();

            foreach (Location location in pdfLocations)
            {
                Document document = null;

                var address = location.Address.Resolve().LocalPath;
                document = new Document(address);

                if (document != null)
                {
                    int overall_num_annots = 0;
                    List<Annot> highlights = new List<Annot>();

                    for (int i = 1; i <= document.GetPageCount(); i++)
                    {
                        Page page = document.GetPage(i);
                        if (page.IsValid())
                        {
                            overall_num_annots = overall_num_annots + page.GetNumAnnots();
                            for (int j = 1; j <= page.GetNumAnnots(); j++)
                            {
                                Annot annotation = page.GetAnnot(j);
                                if (annotation.GetSDFObj() != null && annotation.GetType() == Annot.Type.e_Highlight)
                                {
                                    
                                    highlights.Add(annotation);
                                    
                                }
                            }
                        }
                        else
                        {

                        }
                    }

                    MessageBox.Show(highlights.FirstOrDefault().GetPage().GetIndex().ToString());




                }
            } // end foreach (Location location in pdfLocations)
        }
    }
}

Was ich noch nicht geschafft habe: von Annot in Highlight umwandeln. Seitenzahl und Quads des Highlights mit Seitenzahl und Quads einer Citavi-Annotation zu vergleichen, um bereits Citavi-intern bestehende Annotationen auszufiltern. Ach so, und der dritte Schritt: umwandeln der PDFTron-Annot in eine Citavi-Annotation. Aber wer sich auch mal versuchen will, sei herzlich willkommen.

Foto
1

So, weiteren Fortschritt gemacht, folgender Code für ein AddOn sollte theoretisch eine Liste mit allen Highlights in einer PDF erstellen:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using SwissAcademic.Citavi;
using SwissAcademic.Citavi.Shell;
using SwissAcademic.Citavi.Shell.Controls.Preview;
using SwissAcademic.Controls.WindowsForms;
using SwissAcademic.Pdf;
using SwissAcademic.Pdf.Analysis;

using pdftron;
using pdftron.Filters;
using pdftron.FDF;
using pdftron.Common;
using pdftron.SDF;

using pdftron.PDF;
using pdftron.PDF.Annots;

namespace BornheimsToolbox
{
    class AnnotationConverter
    {
        public void ConvertAnnotations(Reference reference)
        {
            var pdfLocations = reference.GetPDFLocations();
            var knowledgeItems = reference.Quotations.ToList();

            if (knowledgeItems.Count <= 1) return;

            List<PageWidth> store = new List<PageWidth>();

            List<Annotation> citaviAnnotations = new List<Annotation>();

            foreach (KnowledgeItem quotation in reference.Quotations)
            {
                if (quotation.EntityLinks.Any() && quotation.EntityLinks.FirstOrDefault(link => link.Target is Annotation) != null)
                {
                    Annotation annotation = quotation.EntityLinks.FirstOrDefault(link => link.Target is Annotation).Target as Annotation;
                    if (annotation != null) citaviAnnotations.Add(annotation);
                }
            }

            foreach (Location location in pdfLocations)
            {
                Document document = null;

                var address = location.Address.Resolve().LocalPath;
                document = new Document(address);

                if (document != null)
                {
                    int overall_num_annots = 0;
                    List<Annot> highlights = new List<Annot>();

                    for (int i = 1; i <= document.GetPageCount(); i++)
                    {
                        pdftron.PDF.Page page = document.GetPage(i);
                        if (page.IsValid())
                        {
                            overall_num_annots = overall_num_annots + page.GetNumAnnots();
                            for (int j = 1; j <= page.GetNumAnnots(); j++)
                            {
                                Annot annotation = page.GetAnnot(j);
                                if (annotation.GetSDFObj() != null && annotation.GetType() == Annot.Type.e_Highlight)
                                {
                                    Highlight highlight = new Highlight(annotation);
                                    highlights.Add(highlight);
                                    
                                }
                            }
                        }
                        else
                        {

                        }
                    }

                    System.Diagnostics.Debug.WriteLine(highlights.Count.ToString() + " PDFTron Highlights");

                    foreach (Highlight highlight in highlights)
                    {
                        System.Diagnostics.Debug.WriteLine("Highlight");
                        List<Quad> quads = new List<Quad>();

                        for (int l = 0; l < highlight.GetQuadPointCount(); l++)
                        {
                            QuadPoint quadPoint = highlight.GetQuadPoint(l);

                            System.Diagnostics.Debug.WriteLine("Quad Point");
                            System.Diagnostics.Debug.WriteLine("p1.x: " + quadPoint.p1.x.ToString());
                            System.Diagnostics.Debug.WriteLine("p1.y: " + quadPoint.p1.y.ToString());
                            System.Diagnostics.Debug.WriteLine("p2.x: " + quadPoint.p2.x.ToString());
                            System.Diagnostics.Debug.WriteLine("p2.y: " + quadPoint.p2.y.ToString());
                            System.Diagnostics.Debug.WriteLine("p3.x: " + quadPoint.p3.x.ToString());
                            System.Diagnostics.Debug.WriteLine("p3.y: " + quadPoint.p3.y.ToString());
                            System.Diagnostics.Debug.WriteLine("p4.x: " + quadPoint.p4.x.ToString());
                            System.Diagnostics.Debug.WriteLine("p4.y: " + quadPoint.p4.y.ToString());

                            Quad quad = new Quad(highlight.GetPage().GetIndex(), quadPoint.p1.x, quadPoint.p1.y, quadPoint.p2.x, quadPoint.p2.y);

                            quads.Add(quad);
                        }                      
                    }

                    System.Diagnostics.Debug.WriteLine(citaviAnnotations.Count.ToString() + "Citavi Annotations");

                    foreach (Annotation citaviAnnotation in citaviAnnotations)
                    {
                        System.Diagnostics.Debug.WriteLine("Citavi Annotation");
                        foreach (Quad quad in citaviAnnotations.FirstOrDefault().Quads)
                        {
                            System.Diagnostics.Debug.WriteLine("Quad");
                            System.Diagnostics.Debug.WriteLine("X1: " + quad.X1);
                            System.Diagnostics.Debug.WriteLine("Y1: " + quad.Y1);
                            System.Diagnostics.Debug.WriteLine("X1: " + quad.X2);
                            System.Diagnostics.Debug.WriteLine("Y2: " + quad.Y2);
                        }
                    }





                }
            } // end foreach (Location location in pdfLocations)
        }
    }
}
Ich erhalte so eine Liste "citaviAnnotations" mit allen Citavi-Annotationen und eine Liste highlights mit allen Highlights welche PDFTron findet. Mit dem ganzen Debug-Gedöns versuche ich rauszukriegen, wie ich überprüfen kann, welche citaviAnnotation mit einem (PDFTron-) Highlight identisch ist, denn dann muss dieses Highlight ja nicht umgewandelt werden. Ich stocher hier absolut im Dunklen, aber mir fällt auf, dass die Struktur der Highlights ganz anders ist als die der Annotations. Eine Annotation hat immer vier Quads mit je vier Werten (Seitenzahl jetzt erst mal außen vor gelassen): X1, X2, Y1, Y2. Ein Highlight besteht aus dynamisch vielen QuadPoints mit jeweils acht Werten, p1.x, p1.y…p4.y. Es gibt Werte in den Citavi-Annotations, welche sich nirgendwo in den Highlights wiederfinden. Das sollte ohne weiteres nicht der Fall sein. Es kann natürlich sein, dass Citavi ein anderes Koordinationsystem nimmt (von rechts statt von links, o.Ä.). Weitere Untersuchungen sind erforderlich. Jedenfalls: Schritt 1 von oben abgehakt, Schritt 2 und 3 noch zu tun. Wenn jemand gute Ideen hat, gerne her damit.

Foto
1

Eine Anmerkung: Citavi kann ja auf Gedeih und Verderb den Textinhalt von externen Markierungen nicht zuverlässig erkennen. Wenn man jetzt einen Reader wie offenbar PDFExpert nimmt, welcher den markierten Text in die Markierung reinschreibt, würde dass das potentiell lösen, denn an den Textinhalt kommt man in PDFTron vergleichsweise trivial ran, an andere Sachen wie die ID bin ich noch nicht rangekommen.

Foto
Foto
1

So, ich will nicht nur Leute mit Code nerven: Wen das hier interessiert, den mag auch das hier interessieren, denn das automatische Umwandeln wirft ein Folgeproblem auf. Ach so, und für den ganz Interessierten. Schon das manuelle Umwandeln von externen Markierungen klappt häufig nicht, und das wäre eigentlich die Prämisse dafür, dass das automatische Umwandeln sinnvoll ist.

Foto
1

Erstens: m.E. kann man meine bisherigen Beiträge in dem Thread löschen. Zweitens, zur User Story: ich habe heute mal mit der Alpha-Version meines eigenen AddOns, welches an Problemen leidet, (1) automatisch alle externen Markierungen umgewandelt, (2) automatisch ein paar bestehende Markierungen nachträglich verbunden, (3) automatisch ein paar ausgewählte direkten Zitate in rote Markierungen umgewandelt, (4) automatisch in ausgewählten (in dem Fall allen) Wissenselementen ein paar Suchen-und-Ersetzen-Muster ausgeführt, welche in einer separaten Datei gespeichert sind, um den Text der Wissenselemente zu bereinigen, (5) automatisch die Nummerierungsart der erstellten Wissenselemente auf Grundlage des Freitext-Feldes 8 auf "Margin number" gesetzt, (6) ein Befehl ausgeführt, welches im Vorschaufenster das Wissenselement in der PDF anzeigt, und ein einfaches Eingabefeld öffnet, um die Absatznummer einzutippen, und nach dem Ausführen auf das Zitat in der Liste davor springt, (7) von Hand ein paar Änderungen vorgenommen. Das Ergebnis war, dass was früher deutlich mehr als eine Stunde gedauert hat, das Umwandeln der Markierungen aus Gerichtsentscheidungen, nun in etwa 15 Minuten erledigt war.

Foto
1

Bei Github gibt es jetzt ein AddOn, welches externe Annotationen schonmal in direkte Zitate umwandeln kann. Die Funktion, dass wenn die externe Annotation Text hat, dieses Wissenselement in ein Kommentar umgewandelt wird, welches mit einem direkten Zitat verknüpft ist, welches auf Grundlage des markierten Texts gebildet wird, kommt demnächst. Das ist nicht ganz dasselbe, wie hier beschrieben, aber nah dran. m.E.