Jay-Squared / QuotationsToolbox

A number of additional tools for quotations and knowledge items in the Citavi reference management software
30 stars 2 forks source link

Zitatimport aus PDF: Probleme mit Seitenzahlen #16

Open jd-citavi opened 3 years ago

jd-citavi commented 3 years ago

Hey, ich lese PDFs auf dem iPad, markiere unterschiedlich farbig und importiere diese Markierungen als Zitate der unterschiedlichen Kategorien. Klappt soweit toll außer bei Monografien, wo es keine manuell eingegebene Page Range gibt.

PROBLEM: Das AddOn erstellt die Seitenzahlen anhand der Position in der PDF-Datei. Diese stimmen nicht immer mit den Seitenzahlen überein (etwa wegen nicht nummerierter Einleitung oder Cover als Teil der PDF, etc.). Das AddOn "lernt" auch nicht von einem vorher selbst erstellten Zitat mit richtiger Seitenzahl.

FRAGE: Lässt sich irgendwo die Seitenzahl des ersten zu importierenden Zitats einstellen, sodass beim Import immer die richtigen Seiten stehen?

(Vgl. Eintrag im Citavi-Forum: https://help.citavi.com/topic/153826-zitatimport-aus-pdf-mit-addon-probleme-mit-seitenzahlen)

Jay-Squared commented 3 years ago

Das mit dem Lernen stimmt leider, das wird auch schwierig, das zu ändern. Ich will nicht ausschließen, daß ich das mal implementiere, aber das kann ein wenig dauern. Was ich wohl spätestens beim nächsten Update implementiere, ist ein Befehl, mit dem man den Seitenzahlbereich aller markierten Zitate um eine eingegebene Zahl (positiv oder negativ) verschieben kann. Das habe ich jetzt bereits als Makro, und das mag als Übergangslösung dienen. Der Makro-Code ist offenbar zu lang für dieses Feld, aber alles ab der folgenden Zeile ist Makro.

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

using SwissAcademic.Citavi; using SwissAcademic.Citavi.Metadata; using SwissAcademic.Citavi.Shell; using SwissAcademic.Collections; using System.Drawing;

// Implementation of macro editor is preliminary and experimental. // The Citavi object model is subject to change in future version.

public static class CitaviMacro { public static void Main() {

    //Get the active ("primary") MainForm
    MainForm mainForm = Program.ActiveProjectShell.PrimaryMainForm;

    List<KnowledgeItem> knowledgeItems = mainForm.GetSelectedQuotations();

    string data;
    string ret = NewCitationKeyForm("Please enter the offset", out data);

    int numVal;

    if (!Int32.TryParse(ret, out numVal)) MessageBox.Show("Invalid Number");

    foreach (KnowledgeItem knowledgeItem in knowledgeItems)
    {
        string startPage = string.Empty;
        string endPage = string.Empty;
        string pageRange = string.Empty;

        if (knowledgeItem.PageRange.StartPage != null) startPage = knowledgeItem.PageRange.Update(((int)knowledgeItem.PageRange.StartPage.Number) + numVal).ToString();         
        if (knowledgeItem.PageRange.EndPage.Number != null) endPage = knowledgeItem.PageRange.EndPage.Update(((int)knowledgeItem.PageRange.EndPage.Number) + numVal).ToString();

        pageRange = startPage;
        if (!string.IsNullOrEmpty(endPage)) pageRange += "-" + endPage;

        knowledgeItem.PageRange = knowledgeItem.PageRange.Update(pageRange);

    }
}
public static string NewCitationKeyForm(string title, out string ret)
    {
        Form dc = new Form();
        dc.Text = title;

        dc.HelpButton = dc.MinimizeBox = dc.MaximizeBox = false;
        dc.ShowIcon = dc.ShowInTaskbar = false;
        dc.TopMost = true;

        dc.Height = 100;
        dc.Width = 300;
        dc.MinimumSize = new Size(dc.Width, dc.Height);

        int margin = 5;
        Size size = dc.ClientSize;

        TextBox tb = new TextBox();
        tb.TextAlign = HorizontalAlignment.Right;
        tb.Height = 20;
        tb.Width = size.Width - 2 * margin;
        tb.Location = new Point(margin, margin);
        tb.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
        dc.Controls.Add(tb);

        Button ok = new Button();
        ok.Text = "Ok";
        ok.Click += new EventHandler(OK_Click);
        ok.Height = 23;
        ok.Width = 75;
        ok.Location = new Point(size.Width / 2 - ok.Width / 2, size.Height / 2);
        ok.Anchor = AnchorStyles.Bottom;
        dc.Controls.Add(ok);
        dc.AcceptButton = ok;

        dc.ShowDialog();

        ret = tb.Text;

        return ret;
    }
    private static void OK_Click(object sender, EventArgs e)
    {
        Form form = (sender as Control).Parent as Form;
        form.DialogResult = DialogResult.OK;
        form.Close();
    }

}