Externe Markierungen und Anmerkungen in Wissenselemente umwandeln

Florian S. hinzugefügt 2 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

Antworten (8)

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