2016-05-15 7 views
0

Ich habe ein PDF-Dokument und möchte seinen gesamten Text extrahieren. Ich habe versucht, die folgenden:Wie kann ich den gesamten Text eines PDFs in Swift erhalten?

import Quartz 

let url = NSBundle.mainBundle().URLForResource("test", withExtension: "pdf") 
let pdf = PDFDocument(URL: url) 
print(pdf.string()) 

Es macht den Text bekommen, aber die Reihenfolge der Zeilen im Vergleich zu den PDF in Adobe, Bearbeiten Alles auswählen, kopieren Öffnen Paste vollständig vermischt extrahiert wird!

Wie kann ich das gleiche Ergebnis in Swift erhalten, wie das Öffnen der PDF, Select All, Copy/Paste !?

+0

Konnte ich 'string()' für 'pdf'-Instanz nicht finden? Ist es weg? – Hemang

Antwort

2

Das ist leider nicht möglich.
Zumindest nicht ohne eine große Arbeit von Ihrer Seite. Und generell ist es nicht möglich für alle PDFs.

PDFs sind (im Allgemeinen) eine Einbahnstraße.
Sie wurden erstellt, um Text auf die gleiche Weise auf jedem System ohne Unterschied anzuzeigen und für Drucker, um ein Dokument zu drucken, ohne dass der Drucker alle Schriftarten und Zeug kennt.

Extrahieren von Text ist nicht trivial und nur für einige PDFs möglich, in denen das grundlegende Bild-PDF von Text begleitet wird (was er nicht muss). Alle in der PDF enthaltenen Textinformationen werden mit Standortinformationen gekoppelt, um zu bestimmen, wo sie angezeigt werden sollen.

Wenn in der PDF eine Tabelle angezeigt wird, in der die linke Spalte die Namen der Einträge und die rechte Zeile deren Inhalt enthält, können diese beiden Spalten als völlig unterschiedliche Textblöcke dargestellt werden, die nur anzeigen aufgrund der Platzierung nebeneinander eine Verbindung haben.

Was das Framework/Ihr Code tun müsste, ist zu bestimmen, welche Teile von Text, die visuell verknüpft sind, auch logisch verknüpft sind und zusammengehören. Das ist (noch) nicht möglich. Der Grund, warum Sie und ich das PDF lesen und verstehen und gruppieren können, ist, dass unser Gehirn in einigen Bereichen immer noch viel besser ist als Computer.

Abschließende Anmerkung, weil es Verwirrung verursachen könnte: Es ist sicher möglich, dass Adobe und Apple auch einige dieser Gruppierung bereits machen und ein gutes Ergebnis erzielen, aber es ist immer noch nicht perfekt. Das PDF, das ich gerade getestet habe, war nach dem Extrahieren des Textes über die Mac-Vorschau ziemlich kaputt.

+0

Das ist bedauerlich! Weißt du, wie ich einen Teil des PDFs ausschneiden könnte? Es hat Spalten. Dann könnte ich in Abschnitte schneiden und wieder versuchen, 'pdf.string' zu verwenden. –

+0

@CenTinel Ich weiß das nicht, nein. Aber ich weiß, dass du Seiten schneiden kannst und nur die Saite nehmen kannst. Es gibt viele Funktionen in den Dokumenten von 'PDFDocument'. Vielleicht möchten Sie diese Seite durchlesen und nach interessanten Keywords suchen, die Sie gefunden haben. – luk2302

+0

Ok ich geschafft, Auswahl Rechtecke über die PDF mit Hilfe von pdf.pageAtIndex (x) .selectionForRect (Somerect), aber das ist auch völlig durcheinander :( –

2

Wenn Sie nur Textinhalt:

extension String 
{ 
    func readPDF() -> String 
    { 
     let path = "\(self)" 
     let url = URL(fileURLWithPath: path) 
     let pdf = PDFDocument(url: url) 
     return pdf!.string! 
    } 
} 
0

Apples Dokumentation für die PDFDocument Klasse sagt, dass String „eine bequeme Methode, das entspricht einem Auswahlobjekt für das gesamte Dokument zu erstellen und Aufrufen dann die PDFSelection Klasse String-Methode. "

Sie sollten also die gleichen Ergebnisse wie beim Kopieren und Einfügen in der Vorschau erhalten.

Adobe Acrobat kann eine andere Routine verwenden, um einen logischeren Fluss zu erstellen, aber Sie können nicht programmgesteuert auf MacOS zugreifen.

Verwandte Themen