Zeichendopplung bei Umwandlung einer externen Annotierung

SirPounce hinzugefügt 2 Jahren her
bekannt

Liebes Citavi-Team,

Verwandt mit diesem Problem: bei manchen PDFs werden beim Umwandeln einer externen Annotierung Zeichen gedoppelt, obwohl die selbe Annotierung in Citavi erstellt die Zeichen nur einfach enthält (konkretes Beispiel ist Spiliada Maritime Corpn v Cansulex Ltd (1986), [1987] AC 460, auf S. 466, PDF von ICLR, und mit Adobe texterkannt.) Ich kann in keinem anderen PDF-Reader erkennen, dass der Inhalt der externen Annotierung falsch erkannt wird. Adobe Reader fügt einen merkwürdigen Zeilenumbruch hinter das L ein, wenn man den Text hinter der Annotierung (Rechtsklick auf die Annotierung, Copy Text) kopiert, aber ansonsten ist alles normal. Nur beim Umwandeln in Citavi wird das LO gedoppelt.

Beste Grüße

Jan Jakob

Kommentare (4)

Foto
1

Lieber Sebastian,

Vielen Dank für die Antwort.

 Für mich stellt sich die Frage, was ich dann als Nutzer machen soll. Es ist natürlich ein wenig merkwürdig, wenn Adobe selber falsche PDFs erzeugt. Vor allem aber: Wenn in jedem anderen PDF-Reader keine Probleme mit dem Text auftreten, sehe ich das ja erst, wenn die Datei komplett gelesen wurde und schon voll mit Annotationen ist. Das kann ich dann alles löschen, wenn ich sehe, dass Citavi damit nicht zurecht kommt.

Es ist schade, dass Citavis PDF-Komponente hier wie bei den anderen von mir genannten Problemen in einem Umfang sensitiv ist, dass eine sinnvolle Zusammenarbeit mit externen PDF-Readern nicht ohne weiteres möglich ist. Aus unbedarfter Nutzersicht ist "es liegt nicht an Citavi" nicht so ganz überzeugend, wenn das Problem nur in Citavi auftritt. Durch Adobe Acrobat erstellte PDFs sind ja nun nicht ganz abwegige Nutzungsszenarien.

Beste Grüße

Jan Jakob

On Tue, Aug 14, 2018, 19:15 Citavi Service, <service@citavi.com> wrote:

Foto
1

Noch eine Beobachtung: Die Annotation wurde in meinem Fall gar nicht ursprünglich von Adobe Acrobat erzeugt, sondern von einem PDF-Reader auf dem iPad. Wenn ich die vorhandene Annotation lösche, und eine in Adobe neu erstelle, geht es auch ohne Reparieren mit mutool. Es liegt also wohl weniger an der PDF-Datei, als an der Art, wie die Annotation auf der iPad erzeugt wurde. Dass Citavi das einzige Programm ist, welches die Textdopplung vornimmt, bleibt. Adobe und meine verschiedenen PDF-Reader auf dem iPad erkennen den hinter der Annotierung liegenden Text zuverlässig.

Foto
1

Ich habe die Datei jetzt auch mal "repariert", und den selben Text danach erneut auf dem iPad erneut markiert, diesmal mit PDF Expert, nicht mit GoodReader, wie zuvor. Es bleibt bei der Dopplung. Jetzt kann man sagen: jaa, ist halt die Schuld der iPad-App, ist kein Bug in Citavi, aber aus Nutzersicht immer noch unerklärlich warum a) Citavi als einziges Programm ein Problem hat, und b) es zu der Dopplung kommt. Das LO steht da ja nur einmal drin, selbst wenn die Annotation irgendwie krumm gezeichnet ist, sollte Citavi den unterliegenden Text doch zuverlässig erkennen können und nicht einzelne Zeichen verdoppeln.

Foto
1

Auch wenn das hier als "kein Problem" markiert wurde, ist das ein Bug/missing fundamental feature in Citavi. Die externe Annotation besteht aus zwei Quads, und Citavi liest jeden Quad getrennt aus, und doppelt dann Zeichen, welche in beide Quads fallen, statt zu berücksichtigen, dass ein Zeichen bereits in einem Quad verwendet wurde. Das ist exakt das selbe Problem, wie das andere auch, und hat nichts mit der Erstellung zu tun bzw. ist in bestimmten Layouts unvermeidlich, aber das Layout einer PDF kann ich mir leider nicht aussuchen.


Wenn ich bspw. die Quads der bestehenden Annotation wie folgt neu berechne

public static List<Quad> TemporaryQuads(this List<Quad> quads)
        {
            List<Quad> tempQuads = new List<Quad>();

            quads = quads.OrderByDescending(q => q.MinY).ToList();

            double maxX = quads.Select(q => q.MaxX).Max();
            double minX = quads.Select(q => q.MinX).Min();

            if (quads.Count > 2)
            {
                tempQuads.Add(quads[0]);
                for (int i = 1; i < quads.Count - 1; i++)
                {
                    if ((quads[i].MaxX - quads[i].MinX) > 0.25 * (maxX - minX)) tempQuads.Add(quads[i]);
                }
                tempQuads.Add(quads[quads.Count - 1]);
                quads = tempQuads;
            }

            List<Quad> temporaryAnnotationQuads = new List<Quad>();

            double scalingFactor = 0.5;

            Quad firstQuad = new Quad();
            Quad secondQuad = new Quad();
            Quad secondToLastQuad = new Quad();
            Quad lastQuad = new Quad();

            double firstQuadMidY = 0;
            double lastQuadMidY = 0;
            double averageLineHeight = 0;
            double yValuesOffset = 0;

            if (quads.Count == 0) return null;
            if (quads.Count >= 1)
            {
                firstQuad = quads[0];
                lastQuad = quads[quads.Count - 1];
                firstQuadMidY = (firstQuad.MaxY + firstQuad.MinY) / 2;
                lastQuadMidY = (lastQuad.MaxY + lastQuad.MinY) / 2;
            }
            if (quads.Count == 1)
            {
                averageLineHeight = (firstQuad.MaxY - firstQuad.MinY);
                yValuesOffset = (averageLineHeight - averageLineHeight * scalingFactor) / 2;
            }
            else
            {
                averageLineHeight = (firstQuadMidY - lastQuadMidY) / (quads.Count - 1);
                yValuesOffset = (averageLineHeight - averageLineHeight * scalingFactor) / 2;
            }

            switch (quads.Count)
            {
                case 1:
                    temporaryAnnotationQuads.Add(new Quad(firstQuad.PageIndex, false, firstQuad.X1, firstQuadMidY - yValuesOffset / 2, firstQuad.X2, firstQuadMidY + yValuesOffset));
                    break;
                case 2:
                    if (lastQuadMidY > firstQuad.MinY)
                    {
                        temporaryAnnotationQuads.Add(new Quad(firstQuad.PageIndex, false, minX, lastQuad.MinY, maxX, firstQuad.MaxY));
                    }
                    else
                    {
                        temporaryAnnotationQuads.Add(new Quad(firstQuad.PageIndex, false, firstQuad.X1, firstQuad.MinY + yValuesOffset, firstQuad.X2, firstQuad.MaxY - yValuesOffset));
                        temporaryAnnotationQuads.Add(new Quad(lastQuad.PageIndex, false, lastQuad.X1, lastQuadMidY - averageLineHeight / 2, lastQuad.X2, lastQuad.MaxY - yValuesOffset));
                    }
                    break;
                default:
                    secondQuad = quads[1];
                    secondToLastQuad = quads[quads.Count - 2];

                    temporaryAnnotationQuads.Add(new Quad(firstQuad.PageIndex, false, firstQuad.X1, firstQuad.MinY + yValuesOffset, maxX, firstQuad.MaxY- yValuesOffset));
                    temporaryAnnotationQuads.Add(new Quad(secondQuad.PageIndex, false, minX, secondToLastQuad.MinY + yValuesOffset, maxX, secondQuad.MaxY - yValuesOffset));
                    temporaryAnnotationQuads.Add(new Quad(lastQuad.PageIndex, false, minX, lastQuadMidY - averageLineHeight/2, lastQuad.X2, lastQuad.MaxY - yValuesOffset));

                    break;
            }
            return temporaryAnnotationQuads;
        }
wichtig ist nur der Teil

case 2:
                    if (lastQuadMidY > firstQuad.MinY)
                    {
                        temporaryAnnotationQuads.Add(new Quad(firstQuad.PageIndex, false, minX, lastQuad.MinY, maxX, firstQuad.MaxY));
                    }
                    else
                    {
                        temporaryAnnotationQuads.Add(new Quad(firstQuad.PageIndex, false, firstQuad.X1, firstQuad.MinY + yValuesOffset, firstQuad.X2, firstQuad.MaxY - yValuesOffset));
                        temporaryAnnotationQuads.Add(new Quad(lastQuad.PageIndex, false, lastQuad.X1, lastQuadMidY - averageLineHeight / 2, lastQuad.X2, lastQuad.MaxY - yValuesOffset));
                    }
                    break;
erhalte ich eine Annotation. welche den überlappenden Bereich nicht hat, und wo die Texterkennung daher korrekt funktioniert beim Umwandeln in ein Wissenselement.