Suchwerkzeug oder Bibliothek für Textmuster für MS Word- und PDF-Dokumente

Ich suche nach einem Tool, das ein bestimmtes Muster im Text eines Microsoft Word-Dokuments (.doc) oder eines PDF-Dokuments erkennen kann.

Mit Muster meine ich zum Beispiel „alle Absätze, die mit xxx beginnen und mit zzz enden“.

Ich muss in der Lage sein, diese Daten aus zwei Dokumenten zu sammeln und sie miteinander zu vergleichen und eine Excel-Tabelle mit den Unterschieden zu erstellen

Gibt es Tools, die mir dabei helfen können? vorzugsweise Open-Source. Ich werde es unter Windows verwenden und es muss FOSS sein, und wenn es nicht verfügbar ist, wäre eine Bibliothek (mit einer C/C++-Schnittstelle) nett.

Sie suchen also nicht nach einem Parser für DOC- oder PDF-Dateien, sondern nach einem Textdurchlauf-/Suchwerkzeug. Außerdem haben Sie diese Frage mit C und C++ markiert, aber anscheinend suchen Sie nicht nach Quellcode in C oder C++ ... oder?
Wenn es eine fertige Software gibt, die das kann, sagen Sie es mir bitte, wenn nicht, dann ist eine Bibliothek, die ich mit etwas C/C++-Code verwenden kann, meine einzige Option, wenn Sie irgendwelche anderen Ideen haben, sagen Sie es mir bitte

Antworten (2)

Verwenden Sie für MS-Word-Dokumente LibreOffice in der Befehlszeile. Es funktioniert mit .doc- und .docx-Dateien sowie anderen Formaten (vielleicht sogar PDFs, nicht sicher). Extrahieren Sie den Text wie folgt:

libreoffice --headless --cat my_file.doc

Und jetzt können Sie das einfach in ein Textsuchprogramm oder Ihren eigenen Code eingeben. Auf einem Unix-artigen System oder mit Cygwin unter Windows würden Sie es so machen:

libreoffice --headless --cat my_file.doc | grep "some_search_term"

Für PDF-Dokumente können Sie das pdftotextDienstprogramm verwenden:

pdftotext my_document.pdf - | grep "my_search_term"

Hier ist eine Download-Seite für Binärdateien oder Quellcode; und viele Linux-Distributionen packen es (obwohl der Name anders sein kann).

Sie könnten die Textausgabe von Libre Office als Eingabe für die Apache Lucene-Engine kombinieren. Dadurch wird der Text automatisch indiziert und Sie erhalten eine Vielzahl von Suchmöglichkeiten. Es ist Open-Source.
@PaulJowett: +1 für den Kommentar, aber denken Sie daran, dass OP nur nach einer Textmustersuche gefragt hat, also klingt Lucene nach Overkill.
einverstanden. Ich interpretierte "alle Absätze, die mit xxx beginnen und mit zzz enden" als vernünftigen Indikator dafür, dass die Suchanforderungen nicht trivial und möglicherweise schwer zu finden sein würden.

Mit einer recht flachen Lernkurve können Sie dies alles in Python mit ein paar Bibliotheken tun:

  • Um den Text aus aktuellen MS-Word-Formaten (.docx) zu extrahieren, müssen Sie python-docx installieren
  • Um den Text aus den älteren .doc-Dateien zu extrahieren, müssen Sie LibreOffice oder MS-Word installiert haben, um Formate zu konvertieren (was automatisiert werden kann).
  • Um den Text aus PDF-Dateien zu extrahieren, was kein garantiertes Unterfangen ist , können Sie eines der folgenden installieren: pdfminer oder PyPDF2
  • Um eine Datei für Excel zu erstellen, ist es am einfachsten, die eingebaute CSV-Bibliothek zu verwenden, aber es gibt auch .xlsx-Writer wie xlwt und zahlreiche andere.

Der Prozess wird sein:

  1. Lesen Sie eine Eingabedatei und teilen Sie sie in Absätze auf.
  2. Verwenden Sie entweder die Zeichenfolgenmethoden starswith und endedwith oder die Standardbibliothek für reguläre Ausdrücke, um eine Liste der Absätze zu erhalten, die Ihren Kriterien entsprechen.
  3. Machen Sie dasselbe mit dem anderen Dokument
  4. Generieren Sie eine Liste, die aus denen besteht, die sich zwischen den beiden Listen unterscheiden.
  5. Schreiben Sie es in die Ausgabedatei.

Merkmale dieser Lösung:

  • Vollständig FOSS (abgesehen von Word & Excel, aber Sie müssen sie nicht haben)
  • Windows (und die meisten anderen Plattformen)
  • Sie müssen ein wenig arbeiten
  • Kein C/C++ Ihrerseits erforderlich
+1, aber da OP nicht angegeben hat, dass er Python kennt, wird es mehr als ein bisschen Arbeit sein. Ich frage mich jedoch, ob Sie dies nicht zu einer Antwort auf eine separate Frage machen sollten.
Ich werde es versuchen und Sie mit dem Ergebnis auf dem Laufenden halten, danke