Verknüpfung zwischen Annotation und Wissenselement führt zur Dopplung der externen Annotation

SirPounce hinzugefügt 14 Monaten her
beantwortet

Liebes Citavi-Team,


in einer Vielzahl von Kontexten (automatisches Umwandeln von externen Annotationen, Verbinden von Wissenselementen und den dazugehörigen Annotationen, nachträgliche Verknüpfung von Kommentar zu Wissenselement und dem mit dem ursprünglichen Kommentar annotierten Text, Erstellen eines Kommentars zu Wissenselement, der anders als Citavi es macht, direkt auch den richtigen Text markiert) verknüpfe ich programmatisch Annotation und Wissenselement. Mein Ziel ist es, mein erstes AddOn der Community zur Verfügung zu stellen, dass manche dieser langdauernden Schwachstellen in Citavis PDF-Handling zumindest ertragbarer macht. Das Verknüpfen von Annotation und Wissenselement mache ich vereinfacht immer nach folgendendem Schema


                    EntityLink newEntityLink = new EntityLink(project);
                    newEntityLink.Source = quotation;
                    newEntityLink.Target = annotation;
                    newEntityLink.Indication = EntityLink.PdfKnowledgeItemIndication;
                    project.EntityLinks.Add(newEntityLink);
Beispielsweise das automatische Umwandeln aller externen Annotationen in Wissenselemente – eigentlich ein grundlegendes Feature – geht so per AddOn: 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
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.Citavi.Controls.Wpf;
using SwissAcademic.Pdf;
using SwissAcademic.Pdf.Analysis;

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

            var project = reference.Project;

            Document document = PDFUtilities.GetDocument(Program.ActiveProjectShell.PrimaryMainForm.PreviewControl);
            if (document == null) return;

            PreviewControl previewControl = Program.ActiveProjectShell.PrimaryMainForm.PreviewControl;

            var type = previewControl.GetType();
            var propertyInfos = type.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
            var propertyInfo = propertyInfos.FirstOrDefault(prop => prop.Name.Equals("PdfViewControl", StringComparison.OrdinalIgnoreCase));

            if (propertyInfo == null) return;

            PdfViewControl pdfViewControl = propertyInfo.GetValue(Program.ActiveProjectShell.PrimaryMainForm.PreviewControl) as PdfViewControl;

            int startPageInt = 1;

            if (reference.PageRange.StartPage.Number != null) startPageInt = reference.PageRange.StartPage.Number.Value;

            if (reference == null) return;

            if (document != null)
            {
                Location location = reference.Locations.Where(l => l.Address.Resolve().LocalPath == document.GetFileName()).ToList().FirstOrDefault();
                List<Annotation> annotations = location.Annotations.ToList();

                MessageBox.Show(annotations.Count.ToString());

                foreach (Annotation annotation in annotations)
                {
                    if (annotation.EntityLinks.Where(e => e.Indication == EntityLink.PdfKnowledgeItemIndication).Count() > 0) continue;
                    
                    pdfViewControl.GoToAnnotation(annotation);

                    List<Quad> quads = annotation.Quads.ToList();
                    Content content = pdfViewControl.GetSelectedContentFromType(pdfViewControl.GetSelectedContentType(), -1, false, true);
                    SwissAcademic.Citavi.Controls.Wpf.TextContent textContent = content as TextContent;

                    annotation.OriginalColor = SwissAcademic.Drawing.KnownColors.AnnotationDirectQuotation50;

                    KnowledgeItem newQuotation = new KnowledgeItem(reference, QuotationType.DirectQuotation);

                    List<int> pages = new List<int>();

                    foreach (Quad quad in quads)
                    {
                        pages.Add(startPageInt + quad.PageIndex - 1);
                    }

                    int annotationStartPageInt = pages.Min();
                    int annotationEndPageInt = pages.Max();
                    if (annotationStartPageInt == annotationEndPageInt)
                    {
                        newQuotation.PageRange = annotationStartPageInt.ToString();
                    }
                    else
                    {
                        newQuotation.PageRange = annotationStartPageInt.ToString() + "-" + annotationEndPageInt.ToString();
                    }

                    newQuotation.TextRtf = textContent.Rtf;

                    reference.Quotations.Add(newQuotation);
                    project.AllKnowledgeItems.Add(newQuotation);

                    EntityLink newEntityLink = new EntityLink(project);
                    newEntityLink.Source = newQuotation;
                    newEntityLink.Target = annotation;
                    newEntityLink.Indication = EntityLink.PdfKnowledgeItemIndication;
                    project.EntityLinks.Add(newEntityLink);
                }
            }
        }
    }
}
Wie das Video zeigt, geht das auch erfolgreich, und ich glaube, viele Nutzer hätten von so einer simplen Funktion einen Vorteil. Selbst was Simples wie das hier ist besser, als das bisherige “gar nix”.

Das einzige, was ich mir nicht erklären kann: meine Methode führt dazu, dass nachher in der PDF, wenn die Annotationen exportiert werden, die Annotationen doppelt vorhanden sind, wenn man die PDF im externen Editor öffnet. Und das ist immer so, egal ob ich die Annotation erstmalig erzeuge, oder wie hier im Beispiel eine bereits vorhandene Annotation nur mit einem Wissenselement verknüpfe. Gibt es eine Idee, woran das liegen könnte?

Beste Grüße

Jan Jakob

Beste Antwort
Foto

Hat sich erledigt. Glaube ich. Man muss eine zweite Annotation anlegen, welche wiederum erst mit dem Wissenselement verknüpft ist, und die zweite mit der ersten verknüpfen, und beide Annotationen auf unsichtbar stellen.

Kommentare (2)

Foto
1

Hier ist was mir auffällt: Wenn ich aus Spaß an der Freud annotation.OriginalColor mal auf irgendwas anderes Buntes stelle, dann sehe ich klar, dass die zwei PDF-Annotionen, welche exportiert sind, einmal die bunte Farbe, einmal das von Citavi erwartete Blau haben. Mein Verdacht daher: die Annotation, welche ich im Code mit dem neuen Zitat verknüpfe, stimmt nicht mit dem überein, was Citavi als Annotation eines direkten Zitates erwarten würde, und daher macht Citavi dann zwei Annotationen im Moment des Exports. Ich muss es also irgendwie schaffen, die Eigenschaften der vorhandenen Annotation so zu ändern, dass sie mit denen einer Zitat-Annotation übereinstimmen. Das ist meine Theorie.

Foto
1

Hat sich erledigt. Glaube ich. Man muss eine zweite Annotation anlegen, welche wiederum erst mit dem Wissenselement verknüpft ist, und die zweite mit der ersten verknüpfen, und beide Annotationen auf unsichtbar stellen.