Ich baue eine iPad-Anwendung, die PDFs anzeigt, und ich möchte in der Lage sein, das Inhaltsverzeichnis anzuzeigen und den Benutzer zu den relevanten Seiten navigieren zu lassen.
Ich habe zu diesem Zeitpunkt mehrere Stunden in die Forschung investiert, und da PDFKit [nicht von iOS unterstützt wird], besteht meine einzige Möglichkeit darin, die PDF-Metadaten manuell zu analysieren.
Ich habe mir verschiedene Lösungen angeschaut, aber alle schweigen sich in einem Punkt - wie man eine Seite in den "Umriss" -Metadaten mit der realen Seitennummer des Gegenstandes verbindet. Ich habe mein PDF-Dokument mit [dem Voyeur-Werkzeug] untersucht und kann den Umriss im Baum sehen.
[Diese Lösung] half mir, herauszufinden, wie man in der Gliederung / A / S / D-Baumstruktur nach dem "Dest" -Objekt sucht, aber es führt eine Art Objektvergleich mit [self.pages indexOfObjectIdenticalTo: destPageDic] aus Ich verstehe es nicht.
Ich habe die [offizielle PDF-Spezifikation von Adobe] gelesen, und im Abschnitt "12.3.2.3 Benannte Ziele" wird beschrieben, wie ein Gliederungseintrag auf eine Seite verweisen kann:
Anstatt direkt mit definiert zu werden die explizite Syntax in Tabelle 151 kann auf ein Ziel Bezug genommen werden indirekt über ein Namensobjekt (PDF 1.1) oder eine Byte-Zeichenfolge (PDF 1.2).
Und fährt mit dieser Linie fort, die mir völlig unverständlich ist:
Der Wert dieses Eintrags soll a sein Wörterbuch, in dem jeder Schlüssel a ist Zielname und das entsprechende value ist entweder ein Array, das den Wert definiert Ziel, mit der Syntax in gezeigt Tabelle 151, oder ein Wörterbuch mit einem D Eintrag, dessen Wert ein solches Array ist.
Dies bezieht sich auf Seite 366, "12.3.2.2 Explizite Ziele", wo eine Tabelle eine Seite beschreibt: "In jedem Fall ist Seite ein indirekter Verweis auf ein Seitenobjekt"
Also ist das Ergebnis von CGPDFDocumentGetPage oder CGPDFPageGetDictionary ein "indirekter Verweis auf ein Seitenobjekt"?
Ich habe einen [thread on lists.apple.com] gefunden, der diskutiert. [Dieser Kommentar] impliziert, dass Sie die Adresse (in Speicher?) Eines CGPDFPageGetDictionary-Objekts für eine bestimmte Seite vergleichen und mit den Seiten in der Struktur "Gliederung" der PDF-Metadaten vergleichen können.
Wenn ich jedoch die Adresse von Seitenobjekten in der Gliederungsstruktur anschaue und sie mit Adressen vergleiche, sind sie niemals gleich. Die in diesem Thread verwendete Zeile "TTDPRINT (@"% d = & gt;% p ", k + 1, dict);" druckt "dict" als Zeiger im Speicher .. es gibt keinen Grund zu der Annahme, dass ein dort zurückgegebenes Objekt das gleiche wäre wie eines, das irgendwo anders zurückgegeben wird. Sie befinden sich an verschiedenen Stellen im Speicher!
Meine letzte Hoffnung war, den Quellcode von apples Kommandozeilenwerkzeug "outline" [in diesem Buch erwähnt] zu betrachten (wie [von diesem Thread vorgeschlagen]), aber ich kann es nirgends finden.
Fazit: Hat jemand einen Einblick in die Funktionsweise von PDF-Umrissen oder weiß etwas Open-Source-Code (vorzugsweise Ziel-C), der PDF-Umrisse liest?
ARGG: Ich habe hier alle Arten von Links gepostet, aber anscheinend kann ein neuer Benutzer immer nur einen Link nach dem anderen veröffentlichen
Das Ergebnis von CGPDFDocumentGetPage entspricht einem indirekten Seitenverweis, den Sie beim Auflösen eines Ziels in einem Gliederungselement erhalten. Beide sind im Wesentlichen Wörterbücher und Sie können sie mit == vergleichen. Wenn Sie ein CGPDFDictionaryRef haben, mit dem Sie die Seitennummer kennen möchten, können Sie Folgendes tun:
%Vor%Ein explizites Ziel ist jedoch keine Seite, sondern ein Array mit dem ersten Element als Seite. Die anderen Elemente sind die Bildlaufposition auf der Seite usw.
Tags und Links objective-c ios pdf ipad