2010-11-04 17 views
23

Nachdem ich zwei Tage lang versucht habe, Anmerkungen aus einem PDF-Dokument mit Quartz zu lesen, habe ich es geschafft und posted my code.PDF-Suche auf dem iPhone

Jetzt möchte ich das gleiche für eine andere häufig gestellte Frage tun: Suchen von PDF-Dokumenten mit Quarz. Gleiche Situation wie zuvor, diese Frage wurde oft mit fast keinen praktischen Antworten gestellt. Also brauche ich zuerst ein paar Hinweise, da ich das selbst noch nicht implementiert habe.

Was ich versucht:

ich versucht, mit CGPDFScannerScan Umgang mit den TJ und Tj Operatoren - gibt den richtigen Text auf einigen PDF, während auf andere Dokumente, die es meist zufälligen Buchstaben zurückgibt. Vielleicht hängt es mit der Textcodierung zusammen? Jemand pointed out, dass Textblöcke (markiert durch BT/ET-Operatoren) sollte stattdessen behandelt werden, aber ich habe es noch nicht geschafft, dies zu tun. Hat jemand es geschafft, Text aus einem PDF zu extrahieren?

Danach sollte die Suche einfach sein, indem Sie den gesamten Text in einem NSMutableString speichern und rangeOfString verwenden (wenn es einen besseren Weg gibt, lass es mich wissen).

Aber dann wie das Ergebnis hervorheben? Ich weiß, dass es ein paar Operatoren gibt, um die Glyphengrößen zu finden, also könnte ich die resultierende Rect basierend auf diesen Werten berechnen, aber ich habe die Spezifikation für Stunden gelesen ... es ist eine aufgeblähte Unordnung und ich werde verrückt. Jeder mit einer praktischen Erklärung?

aktualisieren

Benutzer Naveen Thunga gefunden PDFKitten "einen Rahmen für die Daten aus PDF-Dateien in iOS Extrahieren". Ich habe gerade die Demo ausprobiert und es scheint wie angekündigt zu funktionieren. Ich werde es mit mehr PDFs testen und die Ergebnisse bald veröffentlichen. Als Randnotiz erscheint mir der Code sehr gut - wenn Sie sich dafür interessieren, wie das funktioniert, ist das ziemlich toll.

+0

Gefunden diese Sammlung von Operatoren könnten nützlich sein: http://efreedom.com/Question/1-3627745/Getting-Text-Position-Parsing-Pdf-Quartz -2D –

+0

Hey Brainfeeder, hast du eine Lösung gefunden, die das Suchergebnis hervorhebt? – Sarah

+0

@Sarah: Nein, immer noch nichts, ich fing an, mich nach ein paar Tagen auf andere Sachen zu konzentrieren ... – pt2ph8

Antwort

4

Dies ist kein einfaches Problem zu implementieren, aber es ist einfach.

Für eine bestimmte Seite müssen Sie die Seite mit der CGPDF-Scanner-API scannen. Sie müssen Callbacks für PDF-Operatoren registrieren, die sich auf Text auf der Seite auswirken - nicht nur TJ/Tj, sondern auch solche, die Schriftart festlegen, die Textzeichematrix usw. beeinflussen. Sie müssen eine Zustandsmaschine erstellen, die mit jedem gefundenen Tag + aktualisiert Parameter. Sie müssen die Textabrechnung für die Codierung der aktuellen Schriftart untersuchen. Wenn Sie Text finden, den Sie hervorheben möchten, müssen Sie die aktuelle Textzeichnungsmatrix untersuchen, die Sie aktualisiert haben, um die Zeichenkoordinaten zu bestimmen. Lesen Sie die PDF-Spezifikation (Version 1.7 kann von Adobe heruntergeladen werden), um zu verstehen, auf welche Operatoren Sie achten müssen.

Font-Codierung ist vielleicht der schwierigste Teil, da es eine Handvoll Möglichkeiten gibt, wie die Codierung angegeben werden kann, und einige davon sind proprietär für die Schriftart. Meistens können Sie betrügen und auf eine Teilmenge der ANSI-Kodierung zurückgreifen - aber das wird bei bestimmten PDFs mit seltsamen Fonts brechen.

Im Wesentlichen verarbeiten Sie die Seite so, als würden Sie sie rendern.

2

Ich habe utility class in Objective-c PDF.js

verwendet, die Anzeige sowie Suche PDF-Datei ermöglicht.

Hilfsklasse ermöglichen Suche mit Highlight all search result und "Groß-/Kleinschreibung" -Optionen.

PDF Suche suchen haben in Aktion Link